c++ - 为什么 C++ 编译器不定义 operator== 和 operator!=?

标签 c++ operators

我非常喜欢让编译器为您做尽可能多的工作。在编写一个简单的类时,编译器可以“免费”为您提供以下内容:

  • 默认(空)构造函数
  • 复制构造函数
  • 析构函数
  • 赋值运算符 (operator=)

但它似乎无法为您提供任何比较运算符 - 例如 operator==operator!=。例如:

class foo
{
public:
    std::string str_;
    int n_;
};

foo f1;        // Works
foo f2(f1);    // Works
foo f3;
f3 = f2;       // Works

if (f3 == f2)  // Fails
{ }

if (f3 != f2)  // Fails
{ }

这样做有充分的理由吗?为什么执行逐个成员的比较会成为问题?显然,如果该类分配内存,那么您需要小心,但是对于一个简单的类,编译器肯定可以为您做到这一点吗?

最佳答案

如果编译器可以提供默认的复制构造函数,那么它应该能够提供类似的默认 operator==() 的论点有一定的意义。我认为决定不为该运算符提供编译器生成的默认值的原因可以通过 Stroustrup 在“C++ 的设计和演变”(第 11.4.1 节 - 复制控制)中关于默认复制构造函数的说法来猜测:

I personally consider it unfortunate that copy operations are defined by default and I prohibit copying of objects of many of my classes. However, C++ inherited its default assignment and copy constructors from C, and they are frequently used.

因此,与其说“为什么 C++ 没有默认的 operator==()?”,不如说问题应该是“为什么 C++ 有默认的赋值和复制构造函数?”,用答案是 Stroustrup 不情愿地包含了这些项目,因为它与 C 向后兼容(可能是大多数 C++ 缺陷的原因,但也可能是 C++ 流行的主要原因)。

出于我自己的目的,在我的 IDE 中,我用于新类的代码段包含私有(private)赋值运算符和复制构造函数的声明,因此当我生成一个新类时,我不会得到默认的赋值和复制操作 - 我必须明确如果我希望编译器能够为我生成这些操作,请从 private: 部分中删除这些操作的声明。

关于c++ - 为什么 C++ 编译器不定义 operator== 和 operator!=?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/217911/

相关文章:

javascript: !( booleanCondition() ) vs ( booleanCondition() == false )

c++ - 为什么我们在赋值运算符重载中使用引用返回而不是在加减运算中?

c++ - 如何显示打印预览类别?

字典/列表的此 Python 代码的 C++ 等价物?

c++ - Qt - 在文件开头重复写入

ios - 逻辑二进制中缀运算符出错

operators - Verilog问号(?)运算符

string - 在 C# 中检查两个字符串的相等性时, string.Equals() 或 == 哪个更好?

C++ 子类重载乘法运算符隐藏基重载解引用运算符

c++ - 重载 lambda 函数