C++赋值运算符重载

运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,它同样具有返回值、函数名及参数列表。

复制代码
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	bool operator<(Date& d)//运算符重载
	{
		if (_year < d._year)
		{
			return true;
		}
		else if (_year == d._year && _month < d._month)
		{
			return true;
		}
		else if (_year == d._year && _month == d._month && _day < d._day)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool DateLess(Date& d)
	{
		if (_year < d._year)
		{
			return true;
		}
		else if (_year == d._year && _month < d._month)
		{
			return true;
		}
		else if (_year == d._year && _month == d._month && _day < d._day)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2025, 8, 1);
	Date d2(2024, 8, 1);
	cout << d1.DateLess(d2) << endl;//调用函数
	cout << (d1 < d2) << endl;//调用函数重载
	return 0;
}

通过上述代码可以看出,运算符重载相比函数调用更易懂,增强了代码的可读性。

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

**注:**不能通过链接C++外的符合创造出新的操作符

重载操作符必须有一个类类型对象,形参比操作数少一个是因为成员函数存在隐藏的this指针

用于内置类型的运算符其含义不能发生改变

'.*' '::' 'sizeof' '?:' '.'这五个运算符不能重载

赋值运算符重载

复制代码
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	bool operator!=(Date& d)
	{
		return _year != d._year || _month != d._month || _day != d._day;
	}
	Date& operator=(Date& d)//赋值运算符重载
	{
		if (*this != d)//避免自己给自己赋值
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;//返回*this,这样符合连续赋值的含义
	}
	void Print()
	{
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d(2021, 2, 5);
	Date d1;
	d1 = d;
	d.Print();
	d1.Print();
	return 0;
}

赋值运算符只能重载成类的成员函数不能重载成全局函数

赋值运算符与拷贝构造函数相似,如果涉及到资源申请必须显示定义。

前置++与后置++重载

复制代码
	Date& operator++()//前置++
	{
		_day += 1;
		return *this;
	}
	Date& operator++(int)//后置++
	{
		Date tmp(*this);
		_day += 1;
		return tmp;
	}

由于前置++和后置++都是一元运算符,因此为了让其能够形成正确的重载,C++规定后置++重载时要加一个int类型的参数,但在调用该函数时参数不需要进行传递,编译器会自动传递。

相关推荐
Scott9999HH7 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_841495648 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr8 小时前
2607C++,soui与安卓
c++·soui
码智社8 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海8 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖9 小时前
JDK 26 新特性详解
java·开发语言
马优晨10 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
fqbqrr12 小时前
2607C++,使用微软detours勾挂工具
c++
人邮异步社区12 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大12 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf