C++ 笔记7 |操作符重载

二十 操作符重载(operator)

1 双目操作符重载 L#R

1.1 计算类双目操作符: + - …

1)表达式结果是右值,不能对表达式结果再赋值
2)左右操作数既可以是左值也可以是右值
3)两种具体实现方式
–》成员函数形式(左调右参)
L#R的表达式可以被编译器处理为"L.operator#®"成员函数调用形式,该函数的返回就是表达式结果。
–》全局函数形式(左右都参)
L#R的表达式可以被编译器处理为"operator#(L,R)"全局函数调用形式,该函数的返回就是表达式结果。
注:通过friend关键字可以把一个全局函数声明为某个类的友元,对于友元函数可以访问类中的任何成员。

#include <iostream>
using namespace std;
//复数类
class Complex{
   
public:
    Complex(int r,int i):m_r(r),m_i(i){
   }
    void print(void) const {
   
        cout << m_r << '+' << m_i << 'i' << endl;
    }
    //重载+:成员函数形式
    //c1+c2 ==> c1.operator+(c2)
    //1)修饰返回值:禁止对表达式结果再赋值
    //2)常引用参数:支持常量型右操作数
    //3)常成员函数:支持常量型左操作数
    const Complex operator+(const Complex& c)const{
   
        Complex res(m_r+c.m_r,m_i+c.m_i);
        return res;
    }
private:
    int m_r;//实部
    int m_i;//虚部

    //友元函数
    friend const Complex operator-(
            const Complex& l,const Complex& r);
};
//重载-:全局函数形式
//c2-c1 ==> operator-(c2,c1)
const Complex operator-(const Complex& l,const Complex& r){
   
    Complex res(l.m_r-r.m_r,l.m_i-r.m_i);
    return res;
}

int main(void){
   
    const Complex c1(1,2);
    const Complex c2(3,4);
    c1.print();
    c2.print();
    //Complex c3 = c1.operator+(c2)
    Complex c3 = c1 + c2;
    c3.print();//4+6i
    
    //Complex c4 = operator-(c2,c1)
    Complex c4 = c2 - c1;
    c4.print();//2+2i

    return 0;
}

1.2 赋值类双目操作符: += -= …

1)表达式结果是左值,就是左操作数的自身
2)左操作数一定是左值,右操作数可以是左值也可以是右值
3)两种具体实现方式
–》成员函数形式(左调右参),L#R ==> L.operator#®
–》全局函数形式(左右都参),L#R ==> operator#(L,R)

#include <iostream>
using namespace std;
class Complex{
   
public:
    Complex(int r,int i):m_r(r),m_i(i){
   }
    void print(void) const {
   
        cout << m_r << '+' << m_i << 'i' << endl;
    }
    //+=:成员函数形式
    //c1+=c2 ==> c1.operator+=(c2)
    Complex& operator+=(const Complex& c){
   
        m_r += c.m_r;
        m_i += c.m_i;
        return *this;
    }
    //-=:全局函数形式
    //友元函数可以定义在类的内部,但本质还是全局函数
    //c1-=c2 ==> operator-=(c1,c2)
    friend Complex& operator-=(Complex& l,const Complex& r){
   
        l.m_r -= r.m_r;
        l.m_i -= r.m_i;
        return l;
    }
private:
    int m_r;//实部
    int m_i;//虚部
};
int main(void){
   
    Complex c1(1,2);
    Complex c2(3,4);
    c1+=c2;//c1.operator+=(c2)
    c1.print();//4+6i

    Complex c3(5,6);
    (c1+=c2) = c3;
    c1.print();//5+6i

    c1-=c2;//operator-=(c1,c2)
    c1.print();//2+2i

    (c1-=c2) = c3;
    c1.print();//5+6i

    return 0;
}

2 单目操作符重载 #O

1.1 计算类单目操作符:-(负) ~(位反) …

1)表达式结果是右值,不能对表达式结果再赋值
2)操作数既可以是左值也可以是右值
3)两种具体实现方式
–》成员函数形式:#O ==> O.operator#()
–》全局函数形式:#O==> operator#(O)

#include <iostream>
using namespace std;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值