为什么我们需要在重载 >> 和 << 运算符时返回对 istream/ostream 的引用?

2024-04-11

如果我不回来会怎样din or dout,实际上我正在读一本书,其中作者返回了返回流引用

istream & operator>>(istream &din,vector &a)
{
    for(int i=0;i<size;i++)
    din>>a.v[i];
    return din;
}

ostream & operator<<(ostream &dout,vector &a)
{
    dout<<"("<<a.v[0];
    for(int i=1;i<size;i++)
    dout<<", "<<a.v[i];
    dout<<")";
    return dout;
}

原因是几个事实的结合。

  1. 您希望能够链接输入和输出操作,如下所示

    in  >> x >> y;
    
    out << z << std::precision(10) << t << std::endl;
    

    所以你必须返回一些允许的东西operator<< again.

  2. 因为您希望您的操作员可以在任何istream,即派生自的任何对象std::istream,你不能定义

    operator<<(istream_type, object);    // take istream by value
    

    因为这只适用于特定的 istream 类型istream_type,但不适用于泛型istream。为此,必须使用多态性,即采用引用或指针(这将是指向派生自的类的引用或指针)std::istream).

  3. 由于您只有对 istream 的引用,因此无法返回 istream 对象本身(它可能是在定义时甚至没有定义的类型)operator<<)但仅是您获得的参考。

    人们可以通过定义来绕过这一限制operator<< a template并获取并返回istream_type按价值计算,但这需要istreamtype 具有复制构造函数,但它很可能出于充分的原因而没有复制构造函数。

  4. 为了引发多态性,原则上可以使用指针(指向流)而不是引用。然而,operator<<(stream*,const char*)是 C++ 中不允许(至少一个操作数必须是类或枚举类型)。

    因此,对于流指针,必须使用函数调用语法,而您又回到了 C 风格fprintf(stream*, args...).

    此外,指针可以为空或悬空,这实际上是它们的默认状态(在没有初始化程序的情况下声明时),而引用可以假定为有效(在没有初始化程序的情况下不能声明它)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们需要在重载 >> 和 << 运算符时返回对 istream/ostream 的引用? 的相关文章

随机推荐