目录
一、题目:
二、分析:
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的小伙伴们可以尝试一下~晚点发代码滴思密达~