C++之运算符重载案例

  • 不是所有的操作符都能重载,下面操作符不能重载
cpp 复制代码
:: . ?: sizeof typeid
  • 实现一个3*3的矩阵类,支持如下操作符:
    • 运算类双目操作符:+ - *
    • 赋值类双目操作符:+= -= *=
    • 单目操作符:-(相反数)
    • 输出操作符:<<
cpp 复制代码
#include <iostream>
using namespace std;
class Mat33{
private:
    int m_a[3][3];
public:
    Mat33(void){
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                m_a[i][j] = 0;
            }
        }
    }
    Mat33(int a[][3]){
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                m_a[i][j] = a[i][j];
            }
        }
    }
    // + a+b
    const Mat33 operator+(const Mat33& m) const{
        int a[3][3] = {0};
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                a[i][j] = m_a[i][j] + m.m_a[i][j];
            }
        }
        Mat33 result(a);
        return result;
    }
    // - a-b
    const Mat33 operator-(const Mat33& m) const{
        int a[3][3] = {0};
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                a[i][j] = m_a[i][j] - m.m_a[i][j];
            }
        }
        Mat33 result(a);
        return result;
    }
    // * a*b
    const Mat33 operator*(const Mat33& m) const{
        int a[3][3] = {0};
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                for(int k=0; k<3; k++){
                    a[i][j] += m_a[i][k] * m.m_a[k][j];
                }
            }
        }
        Mat33 result(a);
        return result;
    }
    // += a += b;
    Mat33& operator+=(const Mat33& m){
    *this = *this + m; // operator+
    return *this;
    }
    // -= a -= b;
    Mat33& operator-=(const Mat33& m){
        *this = *this - m; // operator-(m)
        return *this;
    }
    // *= a *= b;
    Mat33& operator*=(const Mat33& m){
        *this = *this * m; // operator*
        return *this;
    }
    //-(取负) -a;
    const Mat33 operator-(void) const{
        Mat33 m;
        return m - *this; // operator-(m)
    }
    /*
    * os << a;
    * */
    friend ostream& operator<<(ostream& os, const Mat33& m){
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                os << m.m_a[i][j] << " ";
            }
            cout << endl;
        }
        return os;
    }
};
int main(void){
    int a1[3][3] = {1,2,3,4,5,6,7,8,9};
    int a2[3][3] = {9,8,7,6,5,4,3,2,1};
    Mat33 m1(a1);
    Mat33 m2(a2);
    cout << m1 << endl;
    cout << m2 << endl;
    cout << "m1+m2: "<< endl;
    cout << m1 + m2 << endl;
    cout << "m1-m2: "<< endl;
    cout << m1 - m2 << endl;
    cout << "m1*m2: "<< endl;
    cout << m1 * m2 << endl;
    cout << "m1 += m2: "<< endl;
    cout << (m1 += m2) << endl;
    cout << "m1 -= m2: "<< endl;
    cout << (m1 -= m2) << endl;
    cout << "m1 *= m2: "<< endl;
    cout << (m1 *= m2) << endl;
    cout << "-m2" << endl;
    cout << -m2 << endl;
    return 0;
}
相关推荐
JAVA+C语言12 分钟前
C++ STL map 系列全方位解析
开发语言·c++
cpp_250117 分钟前
P1796 汤姆斯的天堂梦
数据结构·c++·算法·题解·洛谷·线性dp
Lisssaa22 分钟前
打卡第二十六天
c++
4ever.ov01 小时前
定时器/时间轮
开发语言·c++·c·muduo·llinux
C^h2 小时前
RTthread中的内存池理解
linux·数据库·c++·算法·嵌入式
lcj25112 小时前
蓝桥杯C++:数据结构(功能导向速查)
数据结构·c++·蓝桥杯
liulilittle2 小时前
eBPF tc prog
服务器·网络·c++·网络协议·tcp/ip·性能·perf
cui_ruicheng2 小时前
C++ 新特性(下):可变参数模板与 STL 扩展机制
开发语言·c++·c++11
|_⊙2 小时前
C++ 多态
c++
福楠3 小时前
现代C++ | 智能指针
c语言·开发语言·c++