我们本篇重点介绍的就是赋值重载函数。如果我们定义了两个日期类Date d1、d2,如果我想要比较两个对象的大小,我应该怎么办呢?这里就要重点讲到今天的知识:运算符重载。

1. 运算符重载

为了增强代码的可读性,C++中引入了运算符重载的概念,运算符重载是一种有着特殊函数名的函数:

  • 函数名字:关键字operator + 需要重载的运算符符号
  • 函数原型返回值类型 operator + 操作符(参数列表)

我们接下来使用一个Date类来进行说明:

代码语言:javascript

AI代码解释

class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
 
int main()
{
	Date d1(2025, 8, 6);
    Date d2(2025, 8, 6);
	
	if (d1 == d2)
	{
	   cout << "==" << endl;
	}
 
	return 0;
}

我们正常的想法,不就是通过运算符==来比较两个变量的大小嘛,那么上面的代码能不能正常运行呢?

答案是:不行的

原因:只有内置类型的变量才能使用各种运算符,对于Date这种我们自定义类型的的对象是不能直接使用的。而为了是的自定义类型对象能够使用这些运算符,C++给出了运算符重载的概念。

注意:这里的运算符重载和之前我们学习的函数重载是不一样的!函数重载是函数名相同但参数列表不同,而运算符重载是我们重新定义运算符的规则和意义。

这里C++给出了一个关键字operator,后面加上运算符,称作函数运算符重载。

然后我们还是通过上面Date d1、d2比较的例子来对此进行说明,例如我们这里将==运算符重载:

代码语言:javascript

AI代码解释

operator==(参数1,参数2)  

同时这里还有一件事情值得注意!就是运算符重载的参数列表,是由该运算符的操作数决定的,例如:++只需要一个操作数(所以重载++的参数列表只需要一个参数)、但是<、<<、!=都需要两个操作数(所以这些运算符重载的参数列表需要两个参数)。

所以我们最后以代码形式呈现就是这样:

代码语言:javascript

AI代码解释

 bool operator==(Date d1, Date d2)
{
    return d1._year == d2._year
        && d1._month == d2._month
        && d1._day == d2._day;
}

但是我们发现:

这是因为Date类中的成员变量都是private私有的,不能被类外访问,当然这个问题很好解决,我们甚至有很多解决方法:

  • 将成员变量改成public公有的(但是这种方法显然不好)
  • 提供函数接口(也就是说,在类中写一个函数,拿到私有的成员变量,然后类外调用函数,太麻烦)
  • 友元(会破坏封装,之后会学到)
  • 将函数放在类中(这个方法是常用的方法)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐