C++ | 重载 | 实验七

描述

定义一个类MatrixAdd,其数据成员为一个M*N的矩阵(即二维数组),其中M和N是两个预先定义的符号常数。通过重载运算符”+”和”=”,实现矩阵相加和赋值运算。

具体要求如下:

(1)私有数据成员

int a[M][N]:存放二维数组值。

(2)公有成员函数

    MatrixAdd():缺省构造函数,空操作。

    MatrixAdd(int x[M][N]):构造函数,用x初始化数据成员a。

    MatrixAdd operator+(MatrixAdd &b):重载加法运算符”+”实现两个矩阵相加。 l

    void operator=(MatrixAdd &b):重载赋值运算符”=”实现两个矩阵赋值。 l

    定义“<<”和“>>”运算符重载函数,实现矩阵的输入输出。

    (3)在主函数中完成对该类的测试。

     注意:在程序的开头,定义符号常数M和N的值分别为2和3,表示二维数组的行数和列数。在主函数中定义整型数组a[M][N]和b[M][N],它们的初值取上述示例值。定义三个MatrixAdd类的对象A、B和C,并用数组a和b初始化对象A和B。将A加B后赋值给C。然后输出对象C的数据成员a矩阵的值。

 

输入

两个2X3矩阵

输出

两个矩阵之和

样例输入

1 2 3
4 5 6
2 2 2
3 3 3

样例输出

3 4 5
7 8 9
#include <iostream>
using namespace std;
const int M = 2;
const int N = 3;
class MatrixAdd
{
public:
	MatrixAdd() {}//缺省构造参数,需要它是因为有被定义时无参数的对象 C ,用时需要加{}
	MatrixAdd(int x[M][N]) //带参构造函数,main函数里规定的值->形参x[M][N]->实参a[M][N]
	{
		for (int i = 0; i < M; i++)
		{
			for (int j = 0; j < N; j++)
			{
				a[i][j] = x[i][j]; //注意不要写成[M][N]
			}
		}
	}
	MatrixAdd operator+(MatrixAdd &b);
	void operator=(MatrixAdd b);//void函数不能加&,不知道为什么
	friend istream& operator>>(istream& i, MatrixAdd& d1);
	friend ostream& operator<<(ostream& o, MatrixAdd& d2);

private:
	int a[M][N];
};

MatrixAdd MatrixAdd::operator+(MatrixAdd &b)//A.a[M][N]+B.a[M][N]等价于A.a[M][N].MatrixAdd( b.a[M][N] )
{
	MatrixAdd m;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			m.a[i][j] = a[i][j] + b.a[i][j];
		}
	}
	return m;
}


void MatrixAdd::operator=(MatrixAdd b)
{
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			a[i][j] = b.a[i][j];//赋值语句,每个具体数值->形参x[M][N]->实参a[M][N]
		}
	}
}


istream& operator>>(istream& i, MatrixAdd& d1)
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			i >> d1.a[i][j];
		}
	}
	return i;
}

ostream& operator<<(ostream& o, MatrixAdd& d2)
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			o << d2.a[i][j] << "  ";
		}
		o << endl;
	}
	return o;
}


int main()
{
	int a[M][N] = { { 1,2,3 },{ 4,5,6 } };
	int b[M][N] = { { 2,2,2 },{ 3,3,3 } };
	MatrixAdd A(a), B(b), C;
	C = A + B;//重载“=”的意义在此.但不重载也无所谓,直接用于这样的赋值。
	          //系统已经为每一个新声明的类重载了一个赋值运算符,作用是逐个复制类的数据成员
	          //但如果数据成员包括指向 动态分配内存 的指针成员时,需要重载
	/*C.show();*/
	cout << C;
	system("pause");
	return 0;
}



 

posted @ 2018-12-03 23:18  心碎人俱乐部  阅读(40)  评论(0)    收藏  举报