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

前端之家收集整理的这篇文章主要介绍了c – 为什么我们需要在重载>>和<<运算符时返回对istream / ostream的引用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我不返回din或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;
}

解决方法

原因是几个事实的组合.

>您希望能够像在中一样链接输入和输出操作

在>> x>> Ÿ;

out<< z<< std :: precision(10)<< t<<的std :: ENDL; 所以你必须返回一些允许运算符<<再次.
>既然您希望运算符处理任何istream,即从std :: istream派生的任何对象,则无法定义

operator<<(istream_type,object); //按值获取istream 因为这只适用于特定的istream类型istream_type,但不适用于通用istream.为此,必须使用多态,即获取引用或指针(它将是一个引用或指向从std :: istream派生的类的指针).
>由于您只有对istream的引用,因此您无法返回istream对象本身(可能是在运算符<<的定义点上甚至没有定义的类型),而只返回您已获得的引用. 人们可以通过定义运算符<<来解决这个限制.一个模板并按值获取并返回istream_type,但这需要istream类型具有一个复制构造函数,它可能没有充分的理由.
>为了唤起多态性,原则上可以使用指针(对流)而不是引用.但是,运算符<<(stream *,const char *)是
C中不允许(至少有一个操作数必须是类或枚举类型).

因此,对于流指针,必须使用函数调用语法,然后使用C风格的fprintf(stream *,args …).

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

原文链接:https://www.f2er.com/c/110724.html

猜你在找的C&C++相关文章