关于C++的引用的一个问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 18:48:04
流操作符<<和>>,这两个操作符常常希望被连续使用,例如:cout << "hello" << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。
以上这段话我不是很理解。麻烦高人帮忙指点下。为什么对象和指针不行,而引用可以,能不能解释更清楚一些呢?非常感谢!!~

你这已经说得很详细了。重载运算符必须至少有一个对象类型的参数,包括引用,但指针不是对象类型。比如说你这个,可以:
class obj{
int a;
public:
obj():a(0){}
friend ostream * operator<<(ostream *os,obj&o) {
(*os) << o.a << endl ;
return os ;
}
};
调用时就要:
obj o1,o2 ;
(&cout) << o1 << o2 ;
这样写只能带来混乱。而如果返回对象的话,就不仅仅是开销的问题了,有些对象不能被复制,或者复制后毫无意义,并且返回的对象是个临时变量,会在随后销毁,操作它会带来问题 ,所以对于这样连续使用的会修改参数的运算符,引用是唯一选择。

一个操作符相当于一个函数,函数的返回值是将函数中的这个变量拷贝给新的变量。如果返回的是某个值的引用 的话相当于把那个值直接从函数里面拿了出来,而不是建立了一个新的变量。也就是说如果你修改这个返回值的话,就修改了函数中的那个值的本身,这样才能连续修改。

对象确实不行,因为在c++中对每个运算符进行计算是,都回复制一个(单目)或两个(双目)对象进行操作,相当于是做了函数的参数,

而我们知道c++中参数是值传递,在你举得例子中,必须对左值进行修改,所以要对参数进行修改,值传递显然不行,所以要使用指针或引用,而指针一不够安全,而不够方便,所以采用的是引用的参数,

指针也可以,就是麻烦了些。

应该就是这样了

不能是引用:
在C++中,流操作符(>>)是经常要被重载的,一般的形式是这样的:

class CObj
{
...
};

std::ostream& operator << (std::ostream& str