【C++】运算符重载

这是C++的特色,也是C++比较难的一个基本语法,但是,如果你把运算符重载看成一个特殊的类方法,且这个类方法的名称就是运算符,一切就变得简单了。

下面用一个简单的程序说明这个问题:

声明两个3x3二维矩阵a,b,其实就是Matrix类,里面就用私有的长度为9的一维数组存储数据。只是打印的时候,打成二维数组的样子

实现~a或者~b就能直接打印a与b,也就是~相当于把a,b打印出来,此乃单目运算符重载。

实现a+b,返回另一个相加之后的矩阵c。

也就是说做到如下图的效果:

代码如下:

#include <iostream>
using namespace std;
class Matrix{
private:
	int matrix[9];//用一个长度为9的一维数组存储3x3的矩阵
public:
	Matrix(){//这里为Matrix类写两个不同参数的构造方法,主要是为了编程方便。
		for(int i=0;i<9;i++){
			this->matrix[i]=0;
		}
	}
	Matrix(int m11,int m12,int m13,int m21,int m22,int m23,int m31,int m32,int m33){//这个构造方法写得很明显了,传来9个数,分别赋予给矩阵的11位置,12位置……
		this->matrix[0]=m11;this->matrix[1]=m12;this->matrix[2]=m13;
		this->matrix[3]=m21;this->matrix[4]=m22;this->matrix[5]=m33;
		this->matrix[6]=m31;this->matrix[7]=m32;this->matrix[8]=m33;
	}
	void operator ~ (){//对单目运算符~的重载,这里严格要求,不能有形式参数。
		for(int i=0;i<9;i++){
			if(i%3==0){
				cout<<endl;
			}
			cout<<matrix[i]<<" ";//这里没有标明主人的matrix代表参与运算的Matrix类的私有成员matrix。不是我偷懒不写this->,是本来不能有this->。下同
		}
		cout<<endl;
	}
	Matrix operator + (Matrix &b){//对双目运算符+的重载,这里严格要求形式参数仅能为一个。代表运算符后面的Matrix类。
		Matrix c;
		for(int i=0;i<9;i++){
			c.matrix[i]=matrix[i]+b.matrix[i];//这里没有标明主人的matrix代表运算符前者的Matrix类的私有成员matrix
		}
		return c;
	}
};

int main(){
	Matrix a(1,2,3,4,5,6,7,8,9);
	Matrix b(9,8,7,6,5,4,3,2,1);
	cout<<"矩阵a如下:";
	~a;
	cout<<"矩阵b如下:";
	~b;
	cout<<"矩阵a、b相加之后如下:";
	~(a+b);
	return 0;
}

看完代码,运算符重载的作用很显然了,如果要声明一个类打印方法,按照各大面向对象的编程语言,基本上都要为这个类开一个void xx()的打印方法,然后这个xx的打印方法,就把类的私有成员this->aa,this->bb通通打印出来,在主函数调用的话,要a.xx()这样调用才能调用。

把~重载之后,可以直接对Matrix这个类进行打印。相当于在Matrix这个类中,声明一个叫~的打印方法,把原来C/C++中位取反的运算符重载了。

之后对+的重载,主要是两个Matrix类中私用成员进行运算。相当于在Matrix这个类中声明一个类似addMatrix(Matrix &b)的方法,里面实现this->matrix[i]与b.matrix[i]的相加,之后在主函数Matrix c=a.addMatrix(b)的意思了。

最后值得注意的一点:运算符重载仅能用于类里的私有成员之间的运算,不能用于C语言的标准类型直接的运行。比如,我想把^重载成两个int之间的幂运算,是绝对不可以的。这是C语言的规则,不为什么。运算符重载一开始就是用于自定义类直接的运算。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 03:10:57

【C++】运算符重载的相关文章

关于运算符重载

运算符重载需遵循以下原则: 1.除了类所属关系运算符".".成员指针运算符".*".作用域运算符"::".sizeof运算符.三目运算符"?:"之外,C++中所有的运算符都可以进行重载 2.重载运算符限制在C++已有的运算符范围内,不允许创建新的运算符 3.重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符的操作数的个数及语法结构 4.运算符重载不能改变运算符用于内置类型的对象的含义,只能用于自定义类型对象之间,

运算符重载

关键字:operator 相见:<高质量程序设计指南> P255 如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符. 如果运算符被重载为类的成员函数,那么一元运算符没有参数(但是++和--运算符的后置版本除外),二元运算符只有右侧参数,因为对象自己成了左侧参数. 运算符重载的特殊性 如果重载为成员函数,则this对象发起对它的调用 如果重载为全局函数,则第一个参数发起对它的调用 禁止用户发明该语言运算符集合中不存在的运算符 除了函数调用运算符

C++ 运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.比如对象a和对象b, 那么 a+b 就需要用户自己定义它怎么相加,这时就用到了运算符重载. 运算符重载规则如下: ①. C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符. ②. 重载之后运算符的优先级和结合性都不会改变. ③. 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造.一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对

Kotlin中复合赋值(+=,-=,……)运算符重载

本篇建立在已经了解了kotlin中运算符重载的理念以及如何实现的基础上. 来我们首先写一个简单的类,然后重载运算符+,+=,-,-=这个几个运算符.代码如下: data class Point(var x: Int, var y: Int) { operator fun plus(point: Point): Point { return Point(this.x + point.x, this.y + point.y) } operator fun plusAssign(point: Poin

第十章 运算符重载

第十章 运算符重载 1.运算符重载的方法 (实质:函数重载) *一般格式: 函数类型名operator 运算符名称(参数表){函数体:} 2.运算符重载的规则 *不允许定义新的运算符 *允许重载的运算符 双目运算符 +(加法)  - (减法)  * (乘法) / (除法)   %(取模) 关系运算符 ==(等于) != (不等)  <   >   <=   >= 逻辑运算符 ||(或)   && (与)  !(非) 单目运算符 + (正)  -(负)   *(指针)

C++运算符重载的妙用

运算符重载(Operator overloading)是C++重要特性之中的一个,本文通过列举标准库中的运算符重载实例,展示运算符重载在C++里的妙用.详细包含重载operator<<,operator>>支持cin,cout输入输出.重载operator[],实现下标运算.重载operator+=实现元素追加:重载operator()实现函数调用.假设你对C++的运算符重载掌握的游刃有余.那就无需继续往下看了. 运算符重载带来的优点就是--让代码变得简洁.以下将展示几个标准库因使

网易云课堂_C++开发入门到精通_章节4:运算符重载

课时23运算符重载 运算符重载 重载赋值运算符 Person& Person::operator=(const Person& other) { //检查自赋值 if (this == &other) { return *this; } //释放原有的内存资源 delete[]m_data; int length = strlen(other.m_data); m_data = new char[length + 1]; strcpy(m_data, other.m_data);

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

C++:运算符重载函数之&quot;++&quot;、&quot;--&quot;、&quot;[ ]&quot;的应用

5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++(X &ob) //友元函数重载,其中ob为类X的对象的引用 对于后缀方式++ob,可以用运算符函数重载为: ob.operator++(int) //成员函数重载 或 operator++(X &ob,int) //友元函数重载,其中ob为类X的对象的引用 调用时,参数int一般被传递给值0

C++:运算符重载函数之成员运算符重载函数

5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表) {       函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义. 在类的内部,声明成员运算符重载函数原型的格式如下: class X{      ...      函数类型 operator运算符(参数表); };