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

相关推荐
Luna-player6 小时前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
小草cys6 小时前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
小鸡吃米…7 小时前
Python PyQt6教程三-菜单与工具栏
开发语言·python
aini_lovee7 小时前
寻找 MAC 协议的 MATLAB 仿真
开发语言·macos·matlab
獭.獭.7 小时前
C++ -- STL【unordered_set和unordered_map的使用】
c++·stl·unordered_map·unordered_set
Jelena157795857927 小时前
Java爬虫淘宝拍立淘item_search_img拍接口示例代码
开发语言·python
郝学胜-神的一滴7 小时前
Python数据模型:深入解析及其对Python生态的影响
开发语言·网络·python·程序人生·性能优化
一水鉴天7 小时前
整体设计 定稿 之26 重构和改造现有程序结构 之2 (codebuddy)
开发语言·人工智能·重构·架构
star _chen8 小时前
C++ std::move()详解:从小白到高手
开发语言·c++
lzhdim8 小时前
C#开发者必知的100个黑科技(前50)!从主构造函数到源生成器全面掌握
开发语言·科技·c#