2012-07-30 75 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<<()被声明为恒定成员函数不能用它来输出原始数据类型。