簡體   English   中英

“基本C ++”:提供iostream運算符的類實例

[英]“Essential C++”: Providing Class Instances of the iostream Operators

Essential C ++: 4.10提供iostream運算符的類實例

通常,我們希望同時讀取和寫入類的對象。 例如,要顯示我們的trian類對象,我們希望能夠編寫

cout << train << endl;

為此,我們必須提供輸出運算符的重載實例:

ostream& operator<< (ostream &os, const Triangular &rhs)
{
    os << "(" << rhs.beg_pos() << "," << rhs.length() << ")";
    rhs.display(rhs.length(), rhs.beg_pos(), os);
    return os;
}

我們返回傳遞給函數的同一個ostream對象。 這允許將多個輸出運算符連接在一起。 這兩個對象都通過引用傳遞。 ostream操作數未聲明為const,因為每個輸出操作都會修改ostream對象的內部狀態。

我有點困惑為什么不能將ostream操作數聲明為const。 如果輸出運算符聲明為以下內容:

const ostream& operator<< (const ostream &os, const Triangular &rhs)

上面的聲明有什么問題嗎?

謝謝

問題在於,如果ostream參數(或相反, istream )是一個常量引用,那么操作員將無法修改流對象。 流的插入/提取會修改流狀態,因此現有的operator<<是非常量操作。 這反過來又意味着,雖然你可以聲明 ,甚至定義

std::ostream const & operator<<( std::ostream const & s, Type const & t );

問題是該定義實際上無法將任何內容實際寫入流中:

std::ostream const & operator<<( std::ostream const & s, Type const & t ) {
   s << "Hi";     // Error: operator<<( std::ostream&, const char*) requires a
                  //        non-const `std::ostream&`
   return s;      // This is fine
}

當輸出變量rhs ,必須修改ostream& os內部的某些數據成員ostream& os例如osofstream輸出緩沖區或文件寫入位置。

os聲明為const禁止進行此類修改。

而且,如圖所示這里 ,如果os被聲明為const ,那么你不能因為沒有使用的輸出基本數據類型ostream::operator<<()被聲明為常量成員函數。

是的,可以通過調用<<來修改ostream參數os。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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