[英]“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
例如os
是ofstream
輸出緩沖區或文件寫入位置。
將os
聲明為const
禁止進行此類修改。
而且,如圖所示這里 ,如果os
被聲明為const
,那么你不能因為沒有使用的輸出基本數據類型ostream::operator<<()
被聲明為常量成員函數。
是的,可以通過調用<<來修改ostream參數os。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.