草庐IT

【C++实验】运算符重载(两个矩阵相加)

饥饿的半导体 2024-06-17 原文

运算符重载

  • 运算符重载概念
    对已有的运算符赋予新的含义,用一个运算符表示不同功能的运算,从而适用于用户自定义类型的数据(比如复数、矩阵等)之间的运算
  • 运算符重载方法
    定义一个重载运算符函数,在需要时系统自动调用该函数,完成相应的运算。
    运算符重载实质上是函数的重载。
    运算符重载函数的格式:
    函数类型 operator 运算符(形参)
    { …}
  • 重载形式:
    重载为类成员函数
    重载为友元函数
  • 用成员函数实现运算符重载函数
    调用格式是“对象名.成员名
    此时对象就是一个参与运算的操作数
    除此之外还需要另一个操作数
  • 重载运算符的规则(限制)
    1. C++中可以重载除下列运算符外的所有运算符:. .* :: ?:
    2. 只能重载C++语言中已有的运算符,不可臆造新的。
    3. 不改变原运算符的优先级和结合性。
    4. 不能改变操作数个数。
    5. 经重载的运算符,其操作数中至少应该有一个自定义类型

实验内容

分别输入两个2*3的矩阵,利用运算符重载,计算两个矩阵的和

代码展示

#include <iostream>
using namespace std;
class Matrix   
{
	private:
		int i,j;
		int m[2][3];
	public:
		Matrix();   //声明构造函数
		Matrix operator+(Matrix &m2);  //运算符重载函数
		void input()  //输入矩阵函数
		{
			for (i=0;i<2;i++)
			{
				for (j=0;j<3;j++)
				cin>>m[i][j];
			}
		}
		void display()  //输出矩阵函数
		{
			for (i=0;i<2;i++)
			{
				for (j=0;j<3;j++)
				{
					cout<<m[i][j]<<" ";
				}
				cout<<endl;
			}
		}
};
Matrix::Matrix()  //定义构造函数
{
	for (int i=0;i<2;i++)
	{
		for (int j=0;j<3;j++)
		{
			m[i][j]=0;
		}
	}
}

Matrix Matrix::operator+(Matrix &m2) //定义运算符重载函数
{
	Matrix M;
	for(i=0;i<2;i++)
	{
		for(j=0;j<3;j++)
		{
			M.m[i][j]=m[i][j]+m2.m[i][j];
	//相当于M.m[i][j]=this->m[i][j]+m2.m[i][j];
		}		
	}	
	return M;
}

int main()
{
	Matrix a,b,c; 
	cout<<"请输入一个2x3矩阵a="<<endl;
	a.input();
	cout<<"请输入一个2x3矩阵b="<<endl; 
	b.input();
	c=a+b;
//相当于a.operator+(b)
	cout<<"这两个矩阵的和为c=\n";c.display();
	return 0; 
}

输出结果

有关【C++实验】运算符重载(两个矩阵相加)的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  4. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  5. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  6. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

  7. ruby - 定义自定义 Ruby 运算符 - 2

    问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out

  8. arrays - 如何在下面的示例中将两个值数组分组为 n 个值数组? - 2

    我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby​​库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_

  9. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

  10. ruby - 在两个 ActiveRecord 类之间合并/复制属性的好方法? - 2

    之前有人问过这个问题,我发现了以下clip关于如何一次设置一个类对象的所有属性,但由于批量分配保护,这在Rails中是不可能的。(例如,您不能Object.attributes={})有没有一种很好的方法可以将一个类的属性合并到另一个类中?object1.attributes=object2.attributes.inject({}){|h,(k,v)|h[k]=vifObjectModel.column_names.include?(k);h}谢谢。 最佳答案 利用assign_attributes使用:without_prote

随机推荐