2016-02-28 71 views
1

我試圖編寫一些運算符重載函數,特別是<<運算符將它與自定義類和std::ofstream對象一起使用,但我在線查找的各種示例中使用的語法有點困惑。例如,讓我們考慮operator<<超載作爲一個非成員函數一個簡單的自定義類:運算符超載懷疑

#include <fstream> 

class Example { 
public: 
    int first; 
    int second; 
}; 

// I found this kind of operator on the Internet 
std::ofstream& operator<< (std::ofstream& out, Example obj) { 
    out << obj.first << endl << obj.second; 
    return out; 
} 

int main() { 
    Example a={1,2}; 
    std::ofstream out; 
    out.open("test"); 
    out << a; 
    out.close(); 
} 

我真的不明白爲什麼它應該返回std::ofstream&正常工作。我嘗試使用以下運算符:

void operator<< (std::ofstream& out, Example obj) { 
    out << obj.first << endl << obj.second << endl; 
} 

它也起作用。我的意思是,不能out << obj;被解釋爲operator<< (out , obj);?爲什麼它必須返回一些東西,因爲我傳遞了對std::ofstream對象的引用?

同樣懷疑出現了,當我試圖寫operator=過載作爲自定義類的成員函數,如下面

class Custom{ 
public: 
    int up; 
    int down; 

    Custom& operator= (Custom a) { 
     up=a.up; 
     down=a.down; 
     return *this; 
    } 
}; 

我用複製交換成語爲賦值運算符的簡單的例子,所以不要太介意操作符的定義,這只是一個例子。同樣,寫

Custom obj1, obj2; 
obj1 = obj2; 

,因爲我可以解釋obj1 = obj2;obj1.operator=(obj2),爲什麼返回類型Custom&需要,而不是void

+1

查看http://stackoverflow.com/questions/4421706/operator-overloading – juanchopanza

回答

2

如果你希望能夠到鏈operator<< s ^在一起,你必須使用一個返回類型(比std::ofstream&更好std::ostream&,所以你可以用它來std::cout和喜歡,太)。

out << a << b; 
(out << a) << b; 
^^^^^^^^^^ 
lhs has to be a stream 

對於賦值運算符,其原因基本相同。 C++語法允許編寫許多表達式需要返回類型,例如這樣的:

Custom obj1, obj2, obj3; 
(obj1 = obj2) + obj3 ... // assign obj2 to obj1 and work with that... 
+0

是不是'(obj1 = obj2)+ obj3'應該是'(obj1 = obj2)= obj3'?無論如何謝謝你,這是有幫助的 – luigi

+0

@luigi我剛剛選擇了'operator +'(這在代碼中沒有定義),而不是'operator ='。沒關係。然而,鏈接'='可能更常見。 – LogicStuff

+0

哦,好吧,儘管你的意思就像是@songyuanyao寫下的東西。 – luigi

1

返回參考允許你鏈的運營商,像

std::cout << e1 << e2; 
1

返回一個參考代替void ,使其可以像

out << obj1 << obj2 << obj3; 

對於operator=,你可以寫

obj1=obj2=obj3; 
+0

現在很清楚,甚至沒有考慮鏈接的可能性。謝謝 – luigi

1

,因爲第一個操作數返回的引用,ostream和第二個操作數可與該參考您可以編寫類似的財產以後cout << "First operand" << "Second operand"operator=以相同的方式工作。你可以寫a = b = c,但你也可以把它放進if (a = b)while (a = b)。這可以使您的代碼更短,但有點危險。