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

目录

一、题目:

二、分析:

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的小伙伴们可以尝试一下~晚点发代码滴思密达~

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尊享面试100题(314.二叉树的垂直遍历python)

题目关键词&#xff0c;从左到右&#xff0c;从上到下&#xff0c;那么使用bfs宽度优先算法。 使用字典v保存每一列的值。 class Solution:def verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []v defaultdict(list)qu deque()…

Windows+Linux的虚拟串口工具

文章目录 1.Windows虚拟串口工具1.1 安装教程1.2 使用方法 2.Linux系统虚拟串口工具2.1 socat安装2.2 开启虚拟串口2.3 测试2.3.1 命令测试2.3.2 Cutecom工具测试 2.4 关闭虚拟串口 3.参考资料 1.Windows虚拟串口工具 下载地址&#xff1a;https://www.downxia.com/downinfo/4…

C 语言笔记:字符串处理函数

一、获取字符串长度函数 头文件&#xff1a;#include <string.h> 函数定义&#xff1a;size_t strlen(const char *s); 函数功能&#xff1a; 测字符指针 s 指向的字符串中字符的个数&#xff0c;不包括’\0’ 返回值&#xff1a;字符串中字符个数 #include <stdio.…

怿星科技CEO潘凯:汽车软件研发工具链 国产玩家迎「历史性机会」

「智能汽车时代&#xff0c;国内非常有机会出现类似Vector的企业。」 这是怿星科技CEO潘凯深信的事情&#xff0c;他在行业内已经深耕约18年&#xff0c;创业也已经10年有余&#xff0c;带领着一个约300人的公司&#xff0c;2024年4月与高工智能汽车见面时&#xff0c;正值公司…

vitis 2020.1 Up date XSA文件后,编译不通过

原来是可以编译通过的&#xff0c;升级XSA文件后&#xff0c;出现各种问题&#xff0c;pmufw没法编译通过 xpfw_config.h:14:10: fatal error: xparameters.h: No such file or directory Vitis 2020.2 - fatal error: xparameters.h: No such file or directory (xilinx.com)…

遇到螺纹连接过程中的软连接,怎么办?——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 在螺纹连接过程中遇到软连接时&#xff0c;首先需要明确软连接的概念及其特点。软连接通常指的是在螺栓拧紧过程中&#xff0c;由于紧固件与被连接件之间的材料、表面状况或装配工艺等因素&#xff0c;导致拧紧力矩不能…

前端上传大文件

在前端实现大文件上传&#xff0c;通常涉及以下几个关键步骤和技术要点&#xff0c;以确保上传过程既高效又稳定&#xff1a; 1. 文件切片 目的&#xff1a;将大文件分割成多个小块&#xff0c;以减少单次请求的负担&#xff0c;提高上传速度&#xff0c;并且增强上传的稳定性…

如何使用cPanel的Transfers功能迁移cPanel账户

近期由于我们的原虚拟主机提供商不再支持低版本的PHP&#xff0c;我们准备将所有的cPanel账户都迁移到在Hostease购买的独立服务器中&#xff0c;新购买的独立服务器配置了cPanel&#xff0c;下面我就介绍如何使用cPanel的Transfers功能&#xff0c;将旧服务器的cPanel账户迁移…

Mybatis 源码分析

《黑马架构师_源码系列-主流框架&中间件》-- MyBatis &#xff08;讲师&#xff1a;子慕&#xff09; * 手写持久层框架-仿写mybatis * Mybatis架构设计&主要组件 * Mybatis如何完成的初始化? * Mybatis如何完成的sql解析及执行? * Mybatis如何设置的参数? * Mybat…

QT外部库:zlib

前言 新建项目&#xff1a;pro文件中新增代码 LIBS -lz 在main.cpp函数中#include "zlib.h",如果此时运行代码提示没有找到对应的函数&#xff0c;那么就qt安装目录&#xff1a;D:\C\qt5.12.7\Tools\mingw730_64\x86_64-w64-mingw32\include&#xff08;这里是博主…

Echarts之桑基图的配置,带你感受数据流动之美。

一、桑基图的作用 ECharts中的桑基图&#xff08;Sankey diagram&#xff09;是一种用于显示数据流量、能量转移、材料流动等复杂关系的图表类型。它可以反映不同节点之间的流动关系、数量、比例等信息。 桑基图可以用于展示各种复杂的关系&#xff0c;比如流程图、资源分配、…

《Decoupled Contrastive Learning for Long-Tailed Recognition》阅读笔记

论文标题 《Decoupled Contrastive Learning for Long-Tailed Recognition》 针对长尾识别的解耦对比学习 作者 Shiyu Xuan 和 Shiliang Zhang 来自北京大学计算机学院多媒体信息处理国家重点实验室 初读 摘要 监督对比损失&#xff08;Supervised Contrastive Loss, SC…

前后端分离项目中的一些疑惑

1、前后端分离项目&#xff0c;浏览器发起请求后&#xff0c;请求的是前端服务器还是后端服务器&#xff1f; 在前后端分离的项目中&#xff0c;当浏览器发起请求时&#xff0c;它首先会请求的是前端服务器。 前后端分离的工作流程大致如下&#xff1a; 用户在浏览器中输入网…

阿里巴巴Java开发规范——编程规约(4)

阿里巴巴Java开发规范——编程规约&#xff08;4&#xff09; 编程规约 &#xff08;六&#xff09;并发处理 1. 【强制】获取单例对象需要保证线程安全&#xff0c;其中的方法也要保证线程安全。 说明&#xff1a;资源驱动类、工具类、单例工厂类都需要注意。 2. 【强制】…

有没有国内个人可用的GPT平替?推荐5个AI工具

随着AI技术的快速发展&#xff0c;AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头&#xff0c;国内很多小伙伴往往望而却步&#xff0c;究其原因&#xff0c;就是它的使用门槛高&#xff0c;还有成本的考量。 不过&#xff0c;随着GPT技术的火热&#xff0c;国内也涌…

MY SQL 实验一:

一、实验目的 通过实验了解MYSQL数据库服务器的基本架构及基本的使用方法。 二、实验原理、条件 本实验采用著名的开源数据库软件MYSQL 作为实验平台。MYSQL有多种版本&#xff0c;常用的是服务器版。数据库引擎是用于存储、处理和保护数据的核心服务。MYSQL有多个数据库引擎&a…

苍穹外卖面试总结

项目介绍 我完成了一个外卖项目&#xff0c;名叫苍穹外卖&#xff0c;是跟着黑马程序员的课程来自己动手写的。 项目基本实现了外卖客户端、商家端的后端完整业务。 商家端分为员工管理、文件上传、菜品管理、分类管理、套餐管理、店铺营业状态、订单下单派送等的管理、数据…

2024数学-微积分和线性代数/本科研究生专业考试/考研/论文/重点公式考点汇总/最难公式投票

## 整体公式汇总列表 http://www.deepnlp.org/equation/category/math #### 微积分 ## 几何级数http://www.deepnlp.org/equation/arithmetic-and-geometric-progressions ## 级数收敛http://www.deepnlp.org/equation/convergence-of-series ## 二项式展开 http://www.dee…

Elasticsearch:开启高效搜索与分析的新篇章

Elasticsearch&#xff1a;开启高效搜索与分析的新篇章 文章目录 Elasticsearch&#xff1a;开启高效搜索与分析的新篇章前言一、Elasticsearch的起源与特点起源特点1、分布式架构&#xff1a;2、实时性&#xff1a;3、全文搜索&#xff1a;4、可扩展性&#xff1a;5、数据类型…

电商店铺经验分享,抖店/视频号小店统统适用(2024新版)

我是王路飞。 如果你已经开通了抖店或者视频号小店&#xff0c; 但是做了几天发现做不起来/不好做。 不要担心&#xff0c;也不要放弃。 既然已经选择了电商这条路&#xff0c;就要对项目有信心&#xff0c;对自己有信心。 我给你们分享一些我做电商的一些踩坑经验&#xf…