📅  最后修改于: 2023-12-03 15:13:58.375000             🧑  作者: Mango
C++ 的运算符重载是一种强大的编程机制,它可以使用户定义的类实现与内置数据类型相同的语法行为。运算符重载的一个重要应用是创建自定义容器(如向量或列表),其语法类似于 STL 容器,但具有自定义规则和数据结构。
在本文中,我们将介绍 C++ 中的运算符重载问题3,其中重载的运算符分别是小于 (<) 和大于 (>) 运算符,可能会出现比较对象类型不同的情况。
假设有一个名为 Person
的类,其中包含两个数据成员 name
和 age
,分别表示人名和年龄。现在我们要比较两个 Person
对象,需要定义 <
和 >
运算符,以便在排序或查找时使用。
但是,问题在于如果我们只重载 <
运算符,那么 >
运算符会使用默认规则,即将两个运算数交换并使用 <
运算符,这不是我们想要的结果。
class Person {
public:
std::string name;
int age;
bool operator<(const Person& other) const {
return age < other.age;
}
};
std::vector<Person> persons{
{"Alice", 21},
{"John", 28},
{"Jane", 23},
};
std::sort(persons.begin(), persons.end()); // OK
std::find(persons.begin(), persons.end(), Person{"John", 28}); // OK
std::find(persons.begin(), persons.end(), Person{"Jack", 32}); // OK
std::find_if(persons.begin(), persons.end(), [](const Person& p) { return p > Person{"Jack", 32}; }); // NG!
如上所述,当我们尝试使用自定义比较函数查找 Person
小于 {"Jack", 32}
的元素时,会发生错误,因为 >
运算符的默认行为不是我们想要的。
为了解决这个问题,我们需要定义 >
运算符,该运算符只是 <
运算符的相反版本。
class Person {
public:
std::string name;
int age;
bool operator<(const Person& other) const {
return age < other.age;
}
bool operator>(const Person& other) const { // 新增部分
return age > other.age;
}
};
现在,我们既可以使用 <
运算符又可以使用 >
运算符来比较 Person
对象了,且它们的行为是自定义的,而不是默认的行为。
std::find_if(persons.begin(), persons.end(), [](const Person& p) { return p > Person{"Jack", 32}; }); // OK
>
运算符时,要确保其与 <
运算符相反,以避免不必要的混淆。>
和 <
运算符,通常也应定义 >=
和 <=
运算符,以便可完整对所有操作符组合进行定义。