C++运算符重载 赋值运算符重载 --- 第六期

1. 运算符重载

1.1 介绍

C++为了增强代码的可续性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号

函数原型:返回值类型 operator操作符(参数列表)

1.2 如何使用

#include 
using namespace std;

class Data
{
public:
	Data(int year = 0,int month = 1,int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

//private:
	int _year;
	int _month;
	int _day;
};

bool operator>(const Data& d1,const Data& d2)
{
	if (d1._year > d2._year)
	{
		return true;
	}
	else if (d1._year == d2._year && d1._month > d2._month)
	{
		return true;
	}
	else if (d1._year == d2._year && d1._month == d2._month && d1._day > d2._day)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	Data d1(2022, 12, 7);
	Data d2(2023, 1, 21);
	cout << (d1 > d2) << endl;
	return 0;
}

这个是在类外部定义函数进行大小比较,不能访问类中被保护的变量,需要暴力将private注释掉,破坏了类的私密性。那么我们如何才能不需要破坏私密性,并能访问被保护的变量呢?

#include 
using namespace std;

class Data
{
public:
	Data(int year = 0,int month = 1,int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	bool operator>(const Data& d2)
	{
		if (_year > d2._year)
		{
			return true;
		}
		else if (_year == d2._year && _month > d2._month)
		{
			return true;
		}
		else if (_year == d2._year && _month == d2._month && _day > d2._day)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Data d1(2022, 12, 7);
	Data d2(2023, 1, 21);
	cout << (d1 > d2) << endl; 
	cout << d2.operator>(d1) << endl;
	return 0;
}

我们在类中定义函数,并且其中参数发生了改变,因为这是在类内部,所以类中函数的参数中会有个隐式参数this,而我们不能破坏原符号的含义,像>符号只能有两个参数进行比较,所以我们只填写一个参数就够了。

1.3 注意事项

注意:

• 不能通过连接其他符号来创建新的操作符:比如operator@

• 重载操作符必须有一个类类型参数

• 用于内置类型的运算符,其含义不能改变,例如:内置的整形+,不能改变其含义

• 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的,操作符有一个默认的形参this,限定为第一个形参

.*:: sizeof ?: 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

赋值运算符主要有四点:

1. 参数类型

2. 返回值

3. 检测是否给自己赋值

4. 返回*this

5. 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝

编译器默认生成赋值重载,跟拷贝构造做的事情完全相似

1、内置类型成员,会完成字节序值拷贝 --- 浅拷贝

2、自动类型成员变量,会调用它的operator

总结一下:

默认生成这个四个成员函数,

构造和析构处理机制是基本类似的 ,拷贝构造和赋值重载处理机制是基本类似的

你可能感兴趣的:(暴学C++,c++,算法,开发语言)