gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:20:00 25 4
gpt4 key购买 nike

如果我不返回 dindout 会发生什么,实际上我正在读一本书,其中作者返回流引用

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<< 的东西再次。

  2. 因为您希望运算符(operator)处理任何 istream ,即从 std::istream 派生的任何对象, 你不能定义

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

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

  3. 因为您只有对 istream 的引用,所以您不能返回 istream 对象本身(它可能是在 operator<< 的定义点甚至没有定义的类型),而只能返回您的引用有。

    可以通过定义 operator<< 来绕过这个限制。一个template并取回 istream_type按值(value)计算,但这需要 istream type 有一个复制构造函数,它可能有充分的理由没有。

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

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

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

    <

关于c++ - 为什么我们需要在重载 >> 和 << 运算符时返回对 istream/ostream 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28913009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com