题目要求
有两个矩阵 a 和 b,均为2行3列。求两个矩阵之和。重载运算符 “+” ,使之能用于矩阵相加。如 c = a + b 。
——谭浩强的《C++面向对象程序设计》第4章习题第4小题
在第4题的基础上,重载流插入运算符 “<<” 和流提取运算符 “>>” ,使之能用于该矩阵的输入和输出。
——谭浩强的《C++面向对象程序设计》第4章习题第5小题
程序4-4
/* ************************************************************************* @file: main.cpp @date: 2020.12.3 @author: Xiaoxiao @brief: 矩阵相加 重载运算符 " + " @blog: https://blog.csdn.net/weixin_43470383/article/details/110562970 ************************************************************************* */ #include <iostream> using namespace std; class Matrix { public: Matrix(); // 声明默认构造函数 void input(); void display(); friend Matrix operator + (Matrix&, Matrix&); // 声明重载运算符"+"的友元函数 private: int mat[2][3]; // 2×3 矩阵 }; Matrix::Matrix() // 定义默认构造函数 { for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) mat[i][j] = 0; } Matrix operator + (Matrix &a, Matrix &b) // 定义重载运算符"+"的友元函数 { Matrix c; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) c.mat[i][j] = a.mat[i][j] + b.mat[i][j]; return c; } void Matrix::input() { cout << "pls input 2×3 matrix" << endl; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) cin >> mat[i][j]; } void Matrix::display() { for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { cout << mat[i][j] << " "; } cout << endl; } } int main() { Matrix a, b, c; cout << "Matrix a:" << endl; a.input(); cout << "Matrix b:" << endl; b.input(); cout << "Matrix c = Matrix a + Matrix b" << endl; c = a + b; c.display(); system("pause"); return 0; }
运行结果4-4
Matrix a:
pls input 2×3 matrix
7 9 8
6 2 4
Matrix b:
pls input 2×3 matrix
1 3 5
8 5 2
Matrix c = Matrix a + Matrix b
8 12 13
14 7 6
流插入和流提取运算符重载
如果想要输入和输出用户自己声明的类型的数据,必须对 “<< ” 和 “>>” 进行重载。
只能将重载 “<< ” 和 “>>” 的函数作为友元函数,而不能将它们定义为成员函数。
对 “<<” 和 “>>” 重载的函数形式如下:
istream & operator >> (istream &, 自定义类 &) ostream & operator << (ostream &, 自定义类 &)
例如:
friend istream & operator >> (istream &in, Matrix &m) // 定义重载运算符"<<"的友元函数 { cout << "pls input 2×3 matrix" << endl; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) in >> m.mat[i][j]; return in; } friend ostream & operator << (ostream &out, Matrix &m) // 定义重载运算符"<<"的友元函数 { for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { out << m.mat[i][j] << " "; } out << endl; } return out; }
程序4-5
/* ************************************************************************* @file: main.cpp @date: 2020.12.4 @author: Xiaoxiao @brief: 矩阵相加 重载运算符 "+"、"<<"、">>" @blog: https://blog.csdn.net/weixin_43470383/article/details/110562970 ************************************************************************* */ #include <iostream> using namespace std; class Matrix { public: Matrix(); // 声明默认构造函数 void input(); void display(); friend Matrix operator + (Matrix&, Matrix&); // 声明重载运算符"+"的友元函数 friend istream & operator >> (istream &, Matrix &); // 声明重载运算符"<<"的友元函数 friend ostream & operator << (ostream &, Matrix &); // 声明重载运算符">>"的友元函数 private: int mat[2][3]; // 2×3 矩阵 }; Matrix::Matrix() // 定义默认构造函数 { for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) mat[i][j] = 0; } Matrix operator + (Matrix &a, Matrix &b) // 定义重载运算符"+"的友元函数 { Matrix c; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) c.mat[i][j] = a.mat[i][j] + b.mat[i][j]; return c; } istream & operator >> (istream &in, Matrix &m) // 定义重载运算符"<<"的友元函数 { cout << "pls input 2×3 matrix" << endl; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) in >> m.mat[i][j]; return in; } ostream & operator << (ostream &out, Matrix &m) // 定义重载运算符"<<"的友元函数 { for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { out << m.mat[i][j] << " "; } out << endl; } return out; } int main() { Matrix a, b, c; cout << "Matrix a:" << endl; cin >> a; cout << "Matrix b:" << endl; cin >> b; cout << "Matrix c = Matrix a + Matrix b" << endl; c = a + b; cout << c; system("pause"); return 0; }
运行结果4-5
Matrix a:
pls input 2×3 matrix
7 9 8
6 2 4
Matrix b:
pls input 2×3 matrix
1 3 5
8 5 2
Matrix c = Matrix a + Matrix b
8 12 13
14 7 6