65,211
社区成员
发帖
与我相关
我的任务
分享
书上说的是不对的,它说的是返回类型定义为ostream的原因,而不是引用类型的原因。
<<也是一个运算符,cout << a也是一个运算,类似x + y那样。运算就应该有个结果。对于基本的整数、小数之类的数据,系统有内定的运算方法。对基本的数据类型的数据和endl,系统也有内定的跟cout的 << 运算,这个运算的操作就是把数据显示到标准输出上,并且把cout作为计算结果。因为计算结果又是cout,所以还可以把这个结果当作cout来继续进行后面跟下一个数据的 << 运算。比如,3+2的运算结果是5,我想再用这个5来加上8,我们就可以写成3+2+8。同样cout << 12.3这个运算的操作是在屏幕上显示出12.3并且运算结果是cout,如果想再用这个cout来输出"hello",我们就可以写成cout << 12.3 << "hello"。
自己进行<<运算符重载就是自己写一个operator<<函数,在函数中用一些语句来指定这个运算的操作是什么,用函数的返回类型和函数中的return语句来指定运算结果是什么。因为只有cout才能进行<<运算(先这么认为吧,高手们不要在这里找茬),所以如果想在这个运算后面再接<<运算,那么这运算结果必须还是cout。而cout这个对象的类型是ostream,返回类型必须是运算结果的类型,因此返回类型定义为ostream。
至于引用,是这么个道理。一个函数的返回值,也就是函数中return语句中那个值,一般是开辟一块临时空间来把那个值复制一份作为返回值。如果把返回类型定义成引用类型,则表示直接使用return语句中那个值作为返回值,这样就免得开辟空间又省得复制数据了,而且有的类型的数据是不允许复制的,cout就是这样的数据之一。