C++"+"运算符重载问题
- C/C++ code
#include <iostream>using namespace std;const int M=3;const int N=4;class matrixadd{private:int a[M][N];public: matrixadd() { for(int i=0;i<M;i++) for(int j=0;j<N;j++) a[i][j]=0; } matrixadd( int x[M][N]) {for(int i=0;i<M;i++) for(int j=0;j<N;j++) a[i][j]=x[i][j]; }matrixadd operator+(matrixadd b); matrixadd operator=(matrixadd &b) { for(int i=0;i<M;i++) for(int j=0;j<N;j++) a[i][j]=b.a[i][j]; return *this; } void show() {int k=0; for(int i=0;i<M;i++) for(int j=0;j<N;j++) { cout<<a[i][j]<<" "; k=k+1; if(k%N==0) cout<<endl; } }};matrixadd matrixadd:: operator+(matrixadd b){matrixadd d; for(int i=0;i<M;i++) { for(int j=0;j<N;j++) {d.a[i][j]=a[i][j]+b.a[i][j]; } } return d; }void main(){int k1=0;int x1[M][N],x2[M][N];cout<<"请输入第一个矩阵:"<<endl;for(int i=0;i<M;i++)for(int j=0;j<N;j++){ cin>>x1[i][j];}cout<<"请输入第二个矩阵:"<<endl;for(int i1=0;i1<M;i1++)for(int j1=0;j1<N;j1++){ cin>>x2[i1][j1];}matrixadd ma1(int x1[M][N]), ma2(int x2[M][N]), ma3;ma3=ma1+ma2;ma3.show();}本代码功能是两个三行四列的矩阵的相加,运用‘+’运算符相加,调试后一直提示:
error C2296: '+' : illegal, left operand has type 'class matrixadd (__cdecl *)(int [][4])'
求大神指点迷津,实在想不出错误
[解决办法]
这行:matrixadd ma1(int x1[M][N]), ma2(int x2[M][N]), ma3;
改成:matrixadd ma1(x1), ma2(x2), ma3;
[解决办法]
++ 正解
[解决办法]
建议用友元函数重载+或-,理由:
1. 这样可以保持原操作数(矩阵)不发生改变
2. 如果操作符有前后关系时,比如-号,a - b和b - a是不一样的,用有缘函数重载这类操作符,使用起来更灵活一些
参考实现代码:
- C/C++ code
#include <iostream>using namespace std;class Matrix{private: double* data; int row; int column;public: Matrix(int row, int column) { this->row = row; this->column = column; data = new double[row * column]; } Matrix(const Matrix& matrix) { row = matrix.row; column = matrix.column; data = new double[row * column]; for(int i = 0; i < row; ++i) { for(int j = 0; j < column; ++j) { *(data + i * column + j) = *(matrix.data + i * column + j); } } } double* get_data() { return data; } int get_row() { return row; } int get_column() { return column; } friend Matrix* operator+(const Matrix& matrix1, const Matrix& matrix2) { if((matrix1.row != matrix2.row) || (matrix1.column != matrix2.column)) { cout << "Fails to add two matrices with different row or column." << endl; } Matrix* matrix = new Matrix(matrix1.row, matrix1.column); for(int i = 0; i < matrix1.row; ++i) { for(int j = 0; j < matrix1.column; ++j) { *(matrix->data + i * matrix1.column + j) = *(matrix1.data + i * matrix1.column + j) + *(matrix2.data + i * matrix1.column + j); } } return matrix; } friend Matrix* operator-(const Matrix& matrix1, const Matrix& matrix2) { if((matrix1.row != matrix2.row) || (matrix1.column != matrix2.column)) { cout << "Fails to minus a matrix with different row or column." << endl; } Matrix* matrix = new Matrix(matrix1.row, matrix1.column); for(int i = 0; i < matrix1.row; ++i) { for(int j = 0; j < matrix1.column; ++j) { *(matrix->data + i * matrix1.column + j) = *(matrix1.data + i * matrix1.column + j) - *(matrix2.data + i * matrix1.column + j); } } return matrix; } void display() { for(int i = 0; i < row; ++i) { for(int j = 0; j < column; ++j) { cout << *(data + i * column + j) << "\t"; } cout << endl; } } ~Matrix() { delete[] data; }};int main(int argc, char** argv){ // 初始化矩阵a Matrix a(2, 2); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 2; ++j) { *(a.get_data() + i * 2 + j) = 1 + i * 2 + j; } } // 显示矩阵a a.display(); cout << "============" << endl; // 初始化矩阵b Matrix b(2, 2); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 2; ++j) { *(b.get_data() + i * 2 + j) = 2 + i * 2 + j; } } // 显示矩阵b b.display(); cout << "============" << endl; // 两矩阵相加 Matrix* c = a + b; c->display(); cout << "============" << endl; delete c; // 两矩阵相减 Matrix* d = b - a; d->display(); cout << "============" << endl; delete d; return 0;}
[解决办法]
operator重载真是常见的各种不规范
1 不需要友元 除非你需要+的左边是其它类型 但是建议给operator+加const保证不修改
2 参数应该为const引用
3 赋值的参数也同样
4 赋值应当返回引用而不是实例