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类型的参数,但在调用该函数时参数不需要进行传递,编译器会自动传递。

相关推荐
传奇开心果编程12 分钟前
【Rust入门知识点学与练】第10课:Option 和 Result(错误处理入门)
开发语言·学习·rust
leonkay26 分钟前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发
坐吃山猪37 分钟前
【多线程】CompletableFuture使用
java·开发语言·多线程
CHPCWWHSU1 小时前
DeepSeek-Harness-Qt将浏览器端Agent装入桌面应用
开发语言·qt
前端 贾公子1 小时前
第10章:RAG(2)
开发语言·python
爱学堂IT分享1 小时前
图灵Java互联网架构师六期
java·开发语言
传奇开心果编程2 小时前
【Rust入门知识点学与练】第3课:String 与 &str 的区别
开发语言·学习·rust
秋名RG2 小时前
Java 核心特性一览
java·开发语言
平头哥AI2 小时前
Day 01 | go run 跑通第一个 Go 程序,go build 留下一个能拷走的 exe
开发语言·后端·golang
HugoStudio_SWAN3 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法