C++操作符重载

又看了一遍操作符的东西,感觉之前对操作符的理解还停留在很浅的认知上(仅仅会用哈哈),所以做一下笔记来加深一下印象。

一、为什么会有操作符重载?

如果要回答这个问题,我们其实应该仔细想一下如果没有操作符重载会怎样呢?这其实很容易就联想到了C语言,因为他就没有操作符重载这一说。虽然C语言中没有类class这一概念,但是他有着和类及其相似的结构体struct,那么如果我们构建两个结构体进行相加的话,我们会怎么做呢?我们会创建类似于下面的函数:

#include<stdio.h>

struct vector
{
	//vector的构造函数
	vector():x(0),y(0){}
	vector(double a,double b):x(a),y(b){}

	double x,y;
};

vector add(const vector& a,const vector& b);

int main()
{
	vector a,b(2,3),c;
	a.x=1;
	a.y=2;
	c=add(a,b);
	printf("c为:%f %f\n",c.x,c.y);

	return 0;

}

vector add(const vector& a,const vector& b)
{
	return vector(a.x+b.x,a.y+b.y);			//利用构造函数构造一个临时的vector对象
}

在这里插入图片描述

在C语言中我们会通过构建add这个函数来实现了两个结构体的相加操作,但是这种方式不仅代码不够简洁精炼,而且也会给我们增加阅读的难度,因为这不符合我们生活中"+"的用法。所以才有了后面C++的操作符重载。

二、操作符重载作用的对象

在任何语言中操作符所作用的对象都是某种数据结构,就好像C++中的int、double等等,这些数据结构从C++语言诞生起就遵循着某种运算法则,就如我们常用到的int+int=int,int+double=double等。而这些C++内置的运算法则是不允许我们去更改的,这就好像你要把1+1=2修改成1+1=3,不是不能改,而是改了之后这会打破大家共有的认知。就好像数学上总是有公理和定理之分,没人能解释的了公理是怎么回事,但是定理却总是能用公理来进行解释。而C++中的这些内置的运算法则就像高悬在C++世界的天道法则一样,生活在C++世界中的诸多的变量和对象都按这这法则工作着,所以C++的创造者们为了避免打破这法则而带来的麻烦,那么诸如像下面的这种行为都是不允许的。

double operator +(int a, int b)
{
}

既然动不了“天道法则”,那总要让我们自己修仙创建自己的规则吧,在这一点上C++还是很通情理的。使用操作符重载就可以实现我们自定义类型的加减乘除等等运算,所以也就是说操作符重载只能作用于我们自定义的数据类型,如下所示:

#include<iostream>
#include<vector>

using namespace std;

vector<int> operator + (const vector<int> a, const vector<int> b)		//非成员函数
{
	return vector<int>{a[0] + b[0], a[1] + b[1]};
}

int	main()
{
	vector<int> a(2, 1), b(2, 2),c;
	//cout << a[0]<<" "<<a[1]<<endl;
	c = a + b;
	cout << c[0] << " " << c[1] << endl;
	system("pause");
	return 0;
}

在这里插入图片描述

其实我刚开始学的时候还有点迷惑,vector也是C++内置的数据类型啊,为啥他不会被禁止呢?所以我又到书上找了找vector的定义,找到了这一句话。

在这里插入图片描述


也就是说C++只有vector的类型模板而并没有vector《double》这个数据类型,因此C++就将它认定为我们自定义的数据类型。
除了上述的将操作符重载为非成员函数之外,我们还经常将它作为成员函数,如下所示:

#include<iostream>
#include<vector>

using namespace std;

class point
{
public:
	double x, y;

	point(double,double);
	point& operator +(const point& other);		//成员函数
	~point();

private:

};

point::point(double a=0, double b=0)
	:x(a),y(b)
{
}

point & point::operator+(const point& other)
{
	return point(x + other.x, y + other.y);
}

point::~point()
{
}
int	main()
{
	point a(1, 3), c;
	c = a + b;
	cout << c.x << " " << c.y<< endl;
	system("pause");
	return 0;
}

在这里插入图片描述


在这个函数中值得人注意的就是重载操作符“+”的时候,参数列表中只能有一个参数,因为在类中其拥有默认隐式的一个参数:this指针,这样它就拥有了两个参数。因此这也就导致了该重载函数不允许再添加参数,否则会报错“参数太多”。
无论是作为成员函数还是非成员函数,操作符重载其本质上和C语言中的“add”函数是一样的,也是一个函数,只不过是用“+”代替了“add”函数而已,并且其作用的对象只能是我们自定义的数据类型(class或struct等)。

参考书籍:《C++ primer》

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...