2012-07-30 91 views
0

基本C++的類實例: 4.10提供了iostream運營商「基本C++」:提供了iostream運營商

通常情況下,我們希望一類的讀取和寫入對象的類實例。例如, 顯示我們特里安類對象,我們希望能夠寫

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對象。這個 允許連接多個outptu操作符。這兩個對象都是通過引用傳遞的 。 因爲每個輸出操作都會修改ostream對象的內部狀態,所以未將ostream操作數聲明爲const 。

我有點困惑爲什麼ostream操作數不能被聲明爲const。 如果輸出操作被聲明爲以下幾點:

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

有上述聲明的任何問題嗎?

感謝

回答

2

問題是,如果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 
} 
0

是的,ostream的說法OS是通過調用< <修改。

1

當輸出變量rhs,內部ostream& os一些數據成員,例如輸出緩衝器或文件的寫入位置,如果osofstream必須進行修改。

聲明osconst禁止這樣的修改。

並且,如圖here,如果os被聲明爲const,則由於沒有的ostream::operator<<()被聲明爲恆定成員函數不能用它來輸出原始數據類型。