一、注意点
如果这边不用返回引用的话,就变成了临时对象,下一条语句就会自动被析构了。!!!
这个是不能用来遍历new出的二维数组的。
每次new的时候都会在堆中(随机),和你一次性开一组(连续存放的)不一样
二、题目
设计一个矩阵类,要求矩阵类中重载运算符加(+)和赋值(=),主函数定义类对象并调用重载的运算符。
提示:
(1) 本题考虑可加(即加与被加矩阵的行列数必须分别相等)和可赋值(等号左值的行列数变为右值的行列数)情况,其他情况输出“ program terminated! ”
(2) 要求分别输入矩阵 am 和 bm 的行列数,各矩阵元素,分别计算 cm=am+bm;am=bm; 并进行输出
(3) 定义相应的构造函数和析构函数
(4) 类中的成员变量应当有三个:int row,col;分别表示矩阵的行数和列数,另外还需要定义一个一级指针或二级指针用来申请动态空间,存放rowcol个整数
代码:
#include<iostream>
#include <stdlib.h>
using namespace std;
class Matrix
{
public:
Matrix() { row = 0; col = 0; p = nullptr; }
Matrix(int row, int col);
void disp();
Matrix& operator+(Matrix& b)
{
if (row == b.row && col == b.col)
{
int i = 0;
for (i = 0; i < row * col; i++)
{
p[i] += b.p[i];
}
}
else
{
cout << "program terminated!";
exit(0);
}
return (*this);
}
Matrix& operator=(Matrix&b)
{
if (row == b.row && col == b.col||row==0)
{
if (row == 0)
{
row = b.row;
col = b.col;
int i = 0;
delete p;
p = new int[row * col];
for (i = 0; i < row * col; i++)
{
p[i] = b.p[i];
}
}
else
{
int i = 0;
for (i = 0; i < row * col; i++)
{
p[i] = b.p[i];
}
}
}
else
{
cout << "program terminated!";
exit(0);
}
return (*this);
}
~Matrix()
{
delete[]p;
}
private:
int row;
int col;
int* p;
};
Matrix::Matrix(int row, int col)
{
int i=0;
this->row = row;
this->col = col;
p = new int[row * col];
cout << "请输入该矩阵元素:" << endl;
for (i = 0; i < row * col; i++)
{
cin >> p[i];
}
}
void Matrix::disp()
{
for (int i = 0; i < row; i++)
{
cout << '\t';
for (int j = 0; j < col; j++)
cout << *(p + i * col + j) << '\t';
cout << endl;
}
}
int main()
{
int row_a, col_a, row_b, col_b;
cout << "请输入am矩阵的行数和列数:" << endl;
cin >> row_a >> col_a;
Matrix am(row_a, col_a);
cout << "请输入bm矩阵的行数和列数:" << endl;
cin >> row_b >> col_b;
Matrix bm(row_b, col_b), cm;
cout << "am:" << endl;
am.disp();
cout << "bm:" << endl;
bm.disp();
cm = am + bm;
cout << "cm=am+bm:" << endl;
cm.disp();
am = bm;
cout << "am=bm:" << endl;
am.disp();
return 0;
}
注意点:
①返回引用!!!
②重载= 的时候,
要记得先删除原有的p开的数组,再开一块内存,
在题目中C是nullptr(默认),如果没有
这句话开辟空间,是不能够进行下面的赋值的。