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;
}
相关推荐
qeen8712 小时前
【数据结构】哈希表的C++实现与封装
数据结构·c++·散列表·哈希表
乐观勇敢坚强的老彭14 小时前
C++信奥GESP四级的常见题型和解题模板速查表
开发语言·c++
欧特克_Glodon14 小时前
OpenCV计算机视觉开发入门与实践<二十二>:图像平滑之线性滤波
c++·人工智能·opencv·计算机视觉
沙盘客15 小时前
AFSIM 示例解读(09)· 传感器全家桶 sensor_demos(下):ESM / SAR / 被动测向
c++·经验分享·后端
大鹏的NLP博客15 小时前
WSL2 资源治理:从 ONNX Runtime CUDA 编译 OOM 到 `.wslconfig` 防御配置
c++·深度学习·onnx runtime
星星.72215 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
老当益壮梁奶奶15 小时前
Linux 软件编程学习笔记(六):线程编程入门与实践
linux·c语言·c++·笔记·学习
小小龙学IT15 小时前
Dear ImGui 开源即时模式 GUI 库深度解析
c++·ui·开源
ShineWinsu16 小时前
对于TRAE中配置Qt的解析
开发语言·c++·ide·vscode·qt·ai·trae
小小龙学IT17 小时前
第一节 QML 背景介绍
c++·qt·js