2012-03-10 38 views
4

我想打印出一個用戶定義類型的對象,這樣cout << ob1; 所以我想重載操作< <,我想按值而不是按引用返回,但它給了我一個錯誤:在兩個文件命名爲: iosfwd ios_base.h爲什麼運算符<<重載必須通過引用返回?

ostream operator<<(ostream& out, cat& rhs){ 
    out << rhs.a << ", " << rhs.b << endl; 
    return out ; 
} 

1)它是因爲它不能創建一個新的ostream對象,這就是爲什麼它有參考返回?

但是當我引用返回是這樣的:

ostream& operator<<(ostream& out, cat& rhs){ 
    out << rhs.a << ", " << rhs.b << endl; 
    return out ; 
} 

它工作正常。
2)有沒有解釋?

+0

你會得到什麼錯誤信息? – orlp 2012-03-10 13:42:47

+2

另外,你爲什麼要按價值回報? – 2012-03-10 13:48:28

+0

一個方面說明,在你的操作符中使用endl會輸出你的類型(意外地)刷新iostream。你可能想跳過它,或者如果你真的想輸出到幾行,輸出'\ n'。 – 2012-03-10 13:54:20

回答

11

在第一個例子,將返回這是不允許的,因爲在C++中所有流類的拷貝構造(和複製分配以及)被禁用由具有它們製成private流對象的副本。

由於您無法制作流對象的副本,因此您需要將其返回參考,這是您在第二個示例中所做的工作原因。

您可以選擇什麼都沒有(即可以使返回類型void)返回,但如果這樣做,那麼你就無法作爲stream << a << b。你必須分別寫作stream <<a,然後stream << b

如果你想知道爲什麼複製流對象是殘疾人,在這裏看到我的回答:

1

流的非可複製,因爲複製一個流並沒有真正感覺,一條小溪是獨一無二的(你不能在同一條河裏跳兩次)。按值返回是在C++ 03中至少複製事務。

如果有理由想要按值返回,則按引用返回是正確的版本。

0

這是爲了支持安全和合理的操作鏈像,因爲返回一個參考的

cout<<a<<b; 

作品。