如果我不回来会怎样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;
}
原因是几个事实的结合。
-
您希望能够链接输入和输出操作,如下所示
in >> x >> y;
out << z << std::precision(10) << t << std::endl;
所以你必须返回一些允许的东西operator<<
again.
-
因为您希望您的操作员可以在任何istream
,即派生自的任何对象std::istream
,你不能定义
operator<<(istream_type, object); // take istream by value
因为这只适用于特定的 istream 类型istream_type
,但不适用于泛型istream
。为此,必须使用多态性,即采用引用或指针(这将是指向派生自的类的引用或指针)std::istream
).
-
由于您只有对 istream 的引用,因此无法返回 istream 对象本身(它可能是在定义时甚至没有定义的类型)operator<<
)但仅是您获得的参考。
人们可以通过定义来绕过这一限制operator<<
a template
并获取并返回istream_type
按价值计算,但这需要istream
type 具有复制构造函数,但它很可能出于充分的原因而没有复制构造函数。
-
为了引发多态性,原则上可以使用指针(指向流)而不是引用。然而,operator<<(stream*,const char*)
是
C++ 中不允许(至少一个操作数必须是类或枚举类型)。
因此,对于流指针,必须使用函数调用语法,而您又回到了 C 风格fprintf(stream*, args...)
.
此外,指针可以为空或悬空,这实际上是它们的默认状态(在没有初始化程序的情况下声明时),而引用可以假定为有效(在没有初始化程序的情况下不能声明它)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)