📜  C++ |运算符重载|问题3(1)

📅  最后修改于: 2023-12-03 15:13:58.375000             🧑  作者: Mango

C++ 运算符重载问题3

C++ 的运算符重载是一种强大的编程机制,它可以使用户定义的类实现与内置数据类型相同的语法行为。运算符重载的一个重要应用是创建自定义容器(如向量或列表),其语法类似于 STL 容器,但具有自定义规则和数据结构。

在本文中,我们将介绍 C++ 中的运算符重载问题3,其中重载的运算符分别是小于 (<) 和大于 (>) 运算符,可能会出现比较对象类型不同的情况。

问题描述

假设有一个名为 Person 的类,其中包含两个数据成员 nameage,分别表示人名和年龄。现在我们要比较两个 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
注意事项
  • 在 C++ 中定义 > 运算符时,要确保其与 < 运算符相反,以避免不必要的混淆。
  • 如果同时定义了 >< 运算符,通常也应定义 >=<= 运算符,以便可完整对所有操作符组合进行定义。
  • 运算符重载只适用于用户自定义类型,不能用于内置类型或 C++ 标准库类型。