为什么重载“<<”和“>>”的函数只能作为友元函数或普通函数,而不能将它们定义为成员函数?解决方案
为什么重载“<<”和“>>”的函数只能作为友元函数或普通函数,而不能将它们定义为成员函数?
为什么重载“<<”和“>>”的函数只能作为友元函数或普通函数,而不能将它们定义为成员函数?
------解决方案--------------------
C++primer上有详细解释啊。
定义为成员函数,那么就隐含this指针了对吧,你要知道重载其实也是一种函数,那么函数就有调用他的对象,如果是成员函数,那么调用他的对象就肯定是想对应的类对象了对吧,但是<<和>>调用的对象肯定只能是cout或者cin对吧,那么久不能定义为成员函数了,只有定义成友元,那么就可以把cin,cout作为一个参数传进你重载的操作符函数里面去了
------解决方案--------------------
当定义符合标准库iostream规范的输入或输出操作符的时候,必须使它成为非成员操作符,为什么要这样做呢?
我们不能将该操作符定义为类的成员,否则,左操作数就必须是该类类型的对象!
------解决方案--------------------
friend ostream operator<<(ostream&,const T&);
ostream operator<<(ostream&cout,const T&a)
{
cout<<a.x<<" "<<a.y<<" "<<endl;
return cout;
}
那么函数就有调用他的对象,如果是成员函数,那么调用他的对象就肯定是想对应的类对象了对吧,但是<<和>>调用的对象肯定只能是cout或者cin对吧,那么久不能定义为成员函数了,只有定义成友元;实在理解不了就背下来吧!
用着用着就习惯了!
------解决方案--------------------
------解决方案--------------------
定义为成员函数左值限定为类本身了.
------解决方案--------------------
为什么重载“<<”和“>>”的函数只能作为友元函数或普通函数,而不能将它们定义为成员函数?
------解决方案--------------------
C++primer上有详细解释啊。
定义为成员函数,那么就隐含this指针了对吧,你要知道重载其实也是一种函数,那么函数就有调用他的对象,如果是成员函数,那么调用他的对象就肯定是想对应的类对象了对吧,但是<<和>>调用的对象肯定只能是cout或者cin对吧,那么久不能定义为成员函数了,只有定义成友元,那么就可以把cin,cout作为一个参数传进你重载的操作符函数里面去了
------解决方案--------------------
当定义符合标准库iostream规范的输入或输出操作符的时候,必须使它成为非成员操作符,为什么要这样做呢?
我们不能将该操作符定义为类的成员,否则,左操作数就必须是该类类型的对象!
------解决方案--------------------
friend ostream operator<<(ostream&,const T&);
ostream operator<<(ostream&cout,const T&a)
{
cout<<a.x<<" "<<a.y<<" "<<endl;
return cout;
}
那么函数就有调用他的对象,如果是成员函数,那么调用他的对象就肯定是想对应的类对象了对吧,但是<<和>>调用的对象肯定只能是cout或者cin对吧,那么久不能定义为成员函数了,只有定义成友元;实在理解不了就背下来吧!
用着用着就习惯了!
------解决方案--------------------
------解决方案--------------------
定义为成员函数左值限定为类本身了.
------解决方案--------------------
- C/C++ code
当然可以重载为成员函数啊。 不过你得这么用了, class CTest cObj; cObj << cObj;
------解决方案--------------------
如果定义成成员函数,调用的时候应该是这样吧?
- C/C++ code
class CTest cObj; cObj << (cout,cObj);