运算符重载:妈妈我会自己写运算符了

发布于:2024-05-08 ⋅ 阅读:(30) ⋅ 点赞:(0)

目录

一、题目:

二、分析:

1.矩阵(matrix)部分:

2.程序部分:

三、代码:

四、提升:

1、思路:

2、重载流插入运算符“<<”

3、代码:

五、进阶:


来看题!

一、题目:

        有两个矩阵a和b,均为2行3列。求两个矩阵的和。重载运算符“+”,使之能用于该矩阵相加(如c=a+b).

二、分析:

1.矩阵(matrix)部分:

        是时候恶补一下线性代数的知识咯:矩阵的相加就是对应位置的元素加和。一看到矩阵,我们就会想到用一个二维数组来表示这个二行三列的数组,需要注意区分的一点是:定义矩阵的时候,数组名后面的下标是数组的长度,即每行每列各有多少个数,因此定义的时候的语句应当为int mat[2][3],表示这个矩阵有2行3列;而运算时第一行第一列的元素应当表示为mat[0][0]。

2.程序部分:

        这里主要就是要会重载运算符的语句就好了,重载运算符的语法为:

返回值类型 operator 运算符 (形参)

        这里需要注意的是,两个矩阵相加的结果仍然是一个矩阵,因此返回值类型应当是我们定义的矩阵类。

三、代码:

        由于相加后数字的位数可能不同,导致输出可能无法对齐,这里引用了<iomanip>头文件,调用了setw()控制符,固定了列宽,使输出更加整齐。下面的程序使用成员函数的方法进行重载。下面是一段可供参考的代码,重载运算符后加上基本的输入和输出函数就好了,很一bamn。↓

#include<iostream>
#include<iomanip>//setw控制符
using namespace std;
class matrix {
private:
	int matr[2][3];
public:
	matrix operator +(const matrix &m1);//常引用,只读不写
	void showmatrix();//输出函数
	void inputmatrix();//输入函数
};
matrix matrix::operator +(const matrix& m1) {
	matrix resm;//定义结果矩阵
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			resm.matr[i][j] = m1.matr[i][j] + matr[i][j];//对应位置元素加和
		}
	}
	return resm;//返回结果矩阵
}
void matrix::showmatrix() {//输出矩阵
	for (int i = 0; i < 2; i++) {
		cout << "|";
		for (int j = 0; j < 3; j++) {
			cout << setw(3) << matr[i][j] << setw(3);//固定列宽,输出优化
		}
		cout << "|" << endl;
	}
	return;
}
void matrix::inputmatrix(){
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			cin >> matr[i][j];
		}
	}
}
int main() {
	matrix m1, m2, resm;
	cout << "请输入第一个二行三列矩阵:" << endl;
	m1.inputmatrix();
	cout << "请输入第一个二行三列矩阵:" << endl;
	m2.inputmatrix();
	cout << "矩阵加和结果:" << endl;
	resm = m1 + m2;//运算符的重载,两个矩阵类相加
	resm.showmatrix();
}

运行结果:

四、提升:

1、思路:

        学会了“+”运算符的重载,坚强的华师学子怎么会轻易认输呢?我们发现流插入运算符和流提取运算符也是可以用“<<”左移运算符和">>"右移运算符重载的呀,那我们就试试吧~

        这里需要注意的一点是:C++规定,"=","[]","()","->"运算符必须作为函数成员重载,这个重载方法我们在“+”的重载中已经用到;而“<<”和“>>”,类型转换运算符函数不能定义为类的成员函数,只能作为友元函数。因此我们这里的重载需要用友元函数进行重载。

2、重载流插入运算符“<<”

ostream& operator <<(ostream&output,matrix&m) {
	for (int i = 0; i < 2; i++) {
		cout << "|";
		for (int j = 0; j < 3; j++) {
			cout << setw(3) << m.matr[i][j] << setw(3);
		}
		cout << "|" << endl;
	}
	return output;
}

       "operator<<"后面括号内的形参output是ostream类对象的引用,形参名output是用户任意起的,cout是头文件<iostream>中声明的ostream类的对象,后面的m是matrix的类对象,因此cout<<m;这个语句在编译器中被解释为 operator << (cout, m);于是就会输出矩阵中的数据成员。

3、代码:

        学会了流插入运算符,流提取运算符也是同理咯!有了流插入运算符的重载和流提取运算符的重载,我们就不需要输入和输出函数啦!改进后的代码如下↓

#include<iostream>
#include<iomanip>
using namespace std;
class matrix {
private:
	int matr[2][3];
	friend istream& operator >>(istream&,matrix&);//将该函数限定为友元函数
    //友元函数放在这里是为了提醒大家是友元函数放在类里就可以,不受访问权限限制哦!!
public:
	matrix operator +(const matrix& m1);
	friend ostream& operator <<(ostream&,matrix&);//将该函数限定为友元函数

};
matrix matrix::operator +(const matrix& m1) {//“+”运算符的重载
	matrix resm;
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			resm.matr[i][j] = m1.matr[i][j] + matr[i][j];
		}
	}
	return resm;
}
ostream& operator <<(ostream&output,matrix&m) {//流插入运算符的重载
	for (int i = 0; i < 2; i++) {
		cout << "|";
		for (int j = 0; j < 3; j++) {
			cout << setw(3) << m.matr[i][j] << setw(3);
		}
		cout << "|" << endl;
	}
	return output;
}
istream& operator >>(istream& input, matrix& m) {//留提取运算符的重载
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			input >> m.matr[i][j];
		}
	}
	return input;
}
int main() {
	matrix m1, m2, resm;
	cout << "请输入第一个二行三列矩阵:" << endl;
	cin >> m1;//调用流提取运算符的重载,可以直接输入数组~
	cout << "请输入第一个二行三列矩阵:" << endl;
	cin >> m2;/调用流提取运算符的重载,可以直接输入数组~
	cout << "矩阵加和结果:" << endl;
	resm = m1 + m2;
	cout << resm;//调用流插入运算符的重载,可以直接输出数组~
}

        运行结果同第三部分的运行结果 

五、进阶:

        还可以用运算符的重载求行列式(),热爱学习的CS23的小伙伴们可以尝试一下~晚点发代码滴思密达~

        


网站公告

今日签到

点亮在社区的每一天
去签到