[英]why overloading of operator<< must return by reference?
我想打印出一個用戶定義類型的對象,比如這個cout << ob1;
and 所以我想重載operator <<並且我希望按值返回而不是通過引用但是它給了我一個錯誤:在兩個名為的文件中: 和
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)有什么解釋嗎?
在第一個示例中,您返回了一個不允許的流對象的副本,因為C ++中所有流類的復制構造函數(以及復制賦值)已被禁用,因為它們是private
。
由於您無法復制流對象,因此您需要通過引用返回它,您在第二個示例中執行此操作,這就是它工作正常的原因。
您可以選擇根本不返回任何內容(即,您可以使返回類型為void
),但如果您這樣做,那么您將無法鏈接為stream << a << b
。 你要將它們分別寫成stream <<a
然后stream << b
。
如果您想知道為什么禁用復制流對象,請在此處查看我的答案:
流是不可復制的,因為復制流並不真正有意義,流是唯一的(你不能在同一條河中跳兩次)。 按值返回是在C ++ 03中至少復制事務。
如果有理由要按值返回,則按引用返回的是正確的版本。
這樣做是為了支持安全合理的操作員鏈接
cout<<a<<b;
因為返回引用而起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.