您的位置:首页 > 编程语言 > C语言/C++

简单说说c++ 中操作符重载,什么情况返回引用等

2014-05-24 15:35 134 查看
~~~~我的生活,我的点点滴滴!!

这里就拿两个例子来说明,什么时候需要返回引用,什么时候不需要,然后对于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; 
}


一般来说, 左右对称的操作符比如 +, -, *, /, <, >, ==之类的习惯上定义在外面.
而像左边必须是类类型的操作符, 比如赋值, 自加, 自减, [], ->, (), 等必须定义在类的内部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: