【C++之运算符重载2】矩阵相加 重载运算符 “+”、“<<”、“>>”

简介: 【C++之运算符重载2】矩阵相加 重载运算符 “+”、“<<”、“>>”

题目要求


有两个矩阵 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


相关文章
|
2月前
|
C++
【C++基础】运算符详解
这篇文章详细解释了C++中运算符的用法,包括算术运算符、赋值运算符、比较运算符和逻辑运算符,以及它们在表达式中的作用和示例。
25 2
|
2月前
|
C++
C++(十九)new/delete 重载
本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
|
2月前
|
C++
C++(十五) 运算符重载
C++中的运算符重载允许对已有运算符的功能进行重新定义,从而扩展语言功能、简化代码并提升效率。重载遵循特定语法,如 `friend 类名 operator 运算符(参数)`。重载时需注意不可新增或改变运算符数量、语义、优先级、结合性和返回类型。常见示例包括双目运算符 `+=` 和单目运算符 `-` 及 `++`。输入输出流运算符 `&lt;&lt;` 和 `&gt;&gt;` 也可重载。部分运算符只能作为成员函数重载。
|
3月前
|
C++
c++学习笔记02 运算符
C++学习笔记,介绍了C++中的运算符,包括基本的加减乘除、求模、前后置递增递减、赋值运算符、比较运算符和逻辑运算符的使用及其注意事项。
38 6
|
3月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
41 0
|
4月前
|
NoSQL 编译器 Redis
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
|
4月前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
4月前
|
NoSQL Redis C++
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
|
4月前
|
自然语言处理 程序员 C++
C++基础知识(五:运算符重载)
运算符重载是C++中的一项强大特性,它允许程序员为自定义类型(如类或结构体)重新定义标准运算符的行为,使得这些运算符能够适用于自定义类型的操作。这样做可以增强代码的可读性和表达力,使得代码更接近自然语言,同时保持了面向对象编程的封装性。
|
4月前
|
Java 程序员 C++