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

目录

一、题目:

二、分析:

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;导致拧紧力矩不能…

如何使用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…

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; 用户在浏览器中输入网…

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

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

MY SQL 实验一:

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

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

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

自主抓取IMAP流量

自主抓取IMAP流量 根据测试需求&#xff0c;需要抓取IMAP流量包&#xff0c;使用wireshark Python&#xff08;IMAP库&#xff09;实现 实现Python 代码 不废话直接上&#xff1b; 注意别用SSL&#xff0c;这个是加密无法被抓包&#xff1b;port&#xff1a;143是公开&…

深入浅出 BERT

Transformer 用于学习句子中的长距离依赖关系&#xff0c;同时执行序列到序列的建模。 它通过解决可变长度输入、并行化、梯度消失或爆炸、数据规模巨大等问题&#xff0c;比其他模型表现更好。使用的注意力机制是神经架构的一部分&#xff0c;使其能够动态突出显示输入数据的…

WMS仓储管理系统库存分类的详细讲解

在当今日益复杂和快速变化的商业环境中&#xff0c;仓库管理成为了一个企业不可或缺的关键环节。WMS仓储管理系统解决方案凭借其自动化和信息化的优势&#xff0c;为企业带来了革命性的改变&#xff0c;特别是在库存分类方面。接下来&#xff0c;我们将深入探讨WMS仓储管理系统…

智慧农业可视化,探索未来农业的新天地

在科技日新月异的今天&#xff0c;农业领域也迎来了翻天覆地的变化。不再只是面朝黄土背朝天&#xff0c;现代科技与农业的结合正在逐步改变着我们的耕种方式。 一、智慧农业&#xff0c;未来已来 步入智慧农业展馆&#xff0c;仿佛进入了一个科幻世界。看似复杂的农业数据&am…

API开发淘宝(京东)API接口:获取淘宝京东等平台数据的api接口分享

接口应用场景——电商产品定价 电商平台产品的定价问题是很多品牌非常重视的一个问题&#xff0c;产品的定价取决于很多因素&#xff0c;包括成本、供需情况、促销策略及竞争对手的价格等。因此&#xff0c;想要更合理地定价&#xff0c;品牌需要获取到影响产品定价的各类数据&…

Windows下 nignx启动报nginx: [emerg] bind() to 0.0.0.0:80 failed (10013:

1、Windows下 nignx启动报nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 解决办法&#xff1a; &#xff08;原因是端口被占用了&#xff09; 1、找到nginx.conf文件 2、修改…