C++自定义矩阵并重载“+”运算符,指针返回错误

    xiaoxiao2021-12-14  18

    问题:

    重载“+”运算符,得到结果中指针保存的值错误。

    解决过程:

    原因:没有重载“=”运算符,而图中所示的方法调用了“=”运算符,默认的“=”运算符,int变量成功返回值,但是指针只能返回野指针。

    Matrix& operator=(/*const*/ Matrix & m);

    注意:要实现重载,还需要定义拷贝构造函数:

    Matrix(const Matrix &); //拷贝构造函数

    补充:后来发现,如果不调用“=”运算符,即使重载“=”也没有关系,即按照下面的形式使用:

    (M1 + M2).Output()

    小结:

            以Matrix为返回值的函数,在返回时会调用拷贝构造函数。由于自己定义矩阵的数值保存使用了指针,如果直接调用“=”运算符会导致得到的值错误,所以在使用“=”的话,一定要自己定义“=”运算符来拷贝指针的内容。

    直接上代码吧,已经正常运行了

    代码一:使用指针保存数据,需要重载“=”运算符

    其中,“=”运算符中的“const”符号可以不加。

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<iomanip> using namespace std; class Matrix { public: Matrix() { row = 0; column = 0; } Matrix(int, int); //构造函数 Matrix(const Matrix &); //拷贝构造函数 ~Matrix(); //析构函数 void Creat(); //矩阵赋值函数 void Output(); //矩阵输出函数 Matrix operator+(Matrix & m2); //声明重载矩阵运算符 + Matrix& operator=(const Matrix & m); private: int row; int column; double **pt; }; // 定义重载运算符 + Matrix Matrix::operator+(Matrix & m) { Matrix temp(m); if (row != m.row || column != m.column) cout << "矩阵M1和矩阵M2不是同类型矩阵,不能相加!" << endl << endl; else { temp.row = row; temp.column = column; //temp.pt = new double*[temp.row]; for (int i = 0; i < temp.row; i++){ //temp.pt[i] = new double[temp.column]; for (int j = 0; j < temp.column; j++) { temp.pt[i][j] = pt[i][j] + m.pt[i][j]; } } } return temp; } Matrix& Matrix::operator=(const Matrix & x) { if (pt) { for (int i = 0; i < row; ++i) delete[] pt[i]; delete[] pt; } row = x.row; column = x.column; pt = new double *[row]; for (int i = 0; i < row; ++i) pt[i] = new double[column]; for (int i = 0; i < row; i++) for (int j = 0; j < column; j++) pt[i][j] = x.pt[i][j]; return *this; } //创建row行column列的矩阵,并将其初始化为零阵 Matrix::Matrix(int r, int c) :row(r), column(c) { if (row < 1 || column < 1) cout << "矩阵的行数和列数都必须大于0!" << endl; else { pt = new double*[row]; for (int i = 0; i < row; i++) { *(pt + i) = new double[column]; for (int j = 0; j < column; j++) { *(*(pt + i) + j) = 0.0; } } } } //拷贝构造函数,以矩阵A创建新矩阵B并以A对B进行初始化 Matrix::Matrix(const Matrix &m) { row = m.row; column = m.column; pt = new double*[row]; for (int i = 0; i < row; ++i) { pt[i] = new double[column]; } for (int i = 0; i < row; ++i) { for (int j = 0; j < column; ++j) { pt[i][j] = m.pt[i][j]; } } } //析构函数,对堆中的动态空间进行释放 Matrix::~Matrix() { if (pt != NULL) { for (int i = 0; i < row; i++) delete[] pt[i]; delete[] pt; } } //矩阵赋值函数,对已创建的矩阵以人工输入的方式进行赋值 void Matrix::Creat() { cout << "请输入" << row*column << "个数作为矩阵元素:" << endl; for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { cin >> *(*(pt + i) + j); } } cout << "===============================================================================" << endl; } //矩阵输出函数,以矩阵的形式将矩阵输出 void Matrix::Output() { for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { cout << left << setw(5) << *(*(pt + i) + j); } cout << endl; } } int _tmain(int argc, _TCHAR* argv[]) { system("COLOR 0e"); int r, c; cout << "请输入矩阵A的行数(N)和列数(M):" << endl; cin >> r >> c; Matrix M1(r, c); M1.Creat(); cout << "请输入矩阵B的行数(N)和列数(M):" << endl; cin >> r >> c; Matrix M2(r, c); M2.Creat(); Matrix M3; M3= M1 + M2; M3.Output(); // cin >> r >> c; // getchar(); return 0; }

    代码二:数据部分使用std::vector保存,就可以不重载“=”运算符了:

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<iomanip> #include <vector>; using namespace std; class Matrix { public: Matrix() { row = 0; column = 0; pt.resize(row*column); } Matrix(int, int); //构造函数 Matrix(const Matrix &); //拷贝构造函数 ~Matrix(); //析构函数 void Creat(); //矩阵赋值函数 void Output(); //矩阵输出函数 Matrix operator+(Matrix & m2); //声明重载矩阵运算符 + //Matrix& operator=(/*const*/ Matrix & m); private: int row; int column; vector<double> pt; }; // 定义重载运算符 + Matrix Matrix::operator+(Matrix & m) { Matrix temp(m.row, m.column); if (row != m.row || column != m.column) cout << "矩阵M1和矩阵M2不是同类型矩阵,不能相加!" << endl << endl; else { temp.row = row; temp.column = column; //temp.pt = new double*[temp.row]; for (int i = 0; i < temp.row; i++){ //temp.pt[i] = new double[temp.column]; for (int j = 0; j < temp.column; j++) { temp.pt.at(i*column + j) = pt.at(i*column + j) + m.pt.at(i*column + j); } } } return temp; } // Matrix& Matrix::operator=(/*const*/ Matrix & x) // { // if (pt) // { // for (int i = 0; i < row; ++i) // { // delete[] pt[i]; // } // delete[] pt; // } // row = x.row; // column = x.column; // pt = new double *[row]; // for (int i = 0; i < row; ++i) // pt[i] = new double[column]; // for (int i = 0; i < row; i++) // for (int j = 0; j < column; j++) // pt[i][j] = x.pt[i][j]; // // return *this; // } //创建row行column列的矩阵,并将其初始化为零阵 Matrix::Matrix(int r, int c) :row(r), column(c) { pt.resize(row*column); if (row < 1 || column < 1) cout << "矩阵的行数和列数都必须大于0!" << endl; else { for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { pt.at(i*column + j) = 0.0; } } } } //拷贝构造函数,以矩阵A创建新矩阵B并以A对B进行初始化 Matrix::Matrix(const Matrix &m) { row = m.row; column = m.column; pt.resize(row*column); for (int i = 0; i < row; ++i) { for (int j = 0; j < column; ++j) { pt.at(i*column + j) = m.pt.at(i*column + j); } } } //析构函数,对堆中的动态空间进行释放 Matrix::~Matrix() { if (!pt.empty()) { pt.clear(); } } //矩阵赋值函数,对已创建的矩阵以人工输入的方式进行赋值 void Matrix::Creat() { cout << "请输入" << row*column << "个数作为矩阵元素:" << endl; for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { cin >> pt.at(i*column + j); } } cout << "===============================================================================" << endl; } //矩阵输出函数,以矩阵的形式将矩阵输出 void Matrix::Output() { for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { cout << left << setw(5) << pt.at(i*column + j); } cout << endl; } } int _tmain(int argc, _TCHAR* argv[]) { system("COLOR 0e"); int r, c; cout << "请输入矩阵A的行数(N)和列数(M):" << endl; cin >> r >> c; Matrix M1(r, c); M1.Creat(); cout << "请输入矩阵B的行数(N)和列数(M):" << endl; cin >> r >> c; Matrix M2(r, c); M2.Creat(); Matrix M3(r,c); M3= M1 + M2; M3.Output(); cin >> r >> c; return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-970879.html

    最新回复(0)