簡體   English   中英

為什么重載運算符<<必須通過引用返回?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM