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;
}
相关推荐
寻寻觅觅☆8 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc8 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
ceclar12310 小时前
C++使用format
开发语言·c++·算法
lanhuazui1010 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee4410 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索
老约家的可汗10 小时前
初识C++
开发语言·c++
crescent_悦11 小时前
C++:Product of Polynomials
开发语言·c++
小坏坏的大世界11 小时前
CMakeList.txt模板与 Visual Studio IDE 操作对比表
c++·visual studio
乐观勇敢坚强的老彭11 小时前
c++寒假营day03
java·开发语言·c++
愚者游世12 小时前
brace-or-equal initializers(花括号或等号初始化器)各版本异同
开发语言·c++·程序人生·面试·visual studio