~~~~我的生活,我的点点滴滴!!
这里就拿两个例子来说明,什么时候需要返回引用,什么时候不需要,然后对于c++输入输出流那是必须返回引用的
操作符号:
“+” 对于 加 操作(在类外定义)不需要返回引用,只需要返回一个右值就行了,看下面的伪代码
class Love{
public:
int str;
int agi;
int intel;
Love(): str(0), agi(0) , intel(0){}
Love(int a , int b ,int c): str(a), agi(b) , intel(c){};
};
//为了与内置操作符保持一致,加法返回一个右值,而不是引用
Love operator+(const Love &fir, const Love &sec){
Love ans;
ans.str = fir.str + sec.str ;
ans.agi = fir.agi + sec.agi ;
ans.intel = fir.intel + sec.intel;
return ans;
}
赋值操作符必须定义为成员函数,无论形参为何种类型
赋值必须返回*this 的引用
class Love{
public:
int str;
int agi;
int intel;
Love(): str(0), agi(0) , intel(0){}
Love(int a , int b ,int c): str(a), agi(b) , intel(c){};
Love& operator+=(const Love &test){
str += test.str;
agi += test.agi;
intel += test.intel;
return *this;
}
};
int main(){
Love boy ,girl(10,20,30);
boy += girl;
cout << boy.str << boy.agi << boy.intel << endl;
return 0;
}
在类外面的输入输出操作符
为什么IO操作符必须为非成员函数?
因为做操作数只能是该类类型的对象
比如 Love item;
item << cout ;
由于IO操作符通常对非公用数据成员进行读写,所以通常将IO操作符
设定为友元
class Love{
public:
int str;
int agi;
int intel;
Love(): str(0), agi(0) , intel(0){}
Love(int a , int b ,int c): str(a), agi(b) , intel(c){};
friend istream& operator>>
(istream& , Love&);
friend ostream& operator<<
(ostream& , const Love&);
};
//要有处理错误和文件结尾的措施
istream& operator>>(istream& in, Love &s){
in >> s.str >> s.agi >> s.intel;
if( !in )
Love(0,0,0);
return in;
}
ostream&
operator<<(ostream& out ,const Love &s){
out << "str:=" << s.str << " agi:="
<< s.agi << " Int:=" << s.intel;
return out;
}
一般来说, 左右对称的操作符比如 +, -, *, /, <, >, ==之类的习惯上定义在外面.
而像左边必须是类类型的操作符, 比如赋值, 自加, 自减, [], ->, (), 等必须定义在类的内部