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

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

  • 默认(空)构造函数
  • 复制构造函数
  • 析构函数
  • 赋值运算符 (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: 部分中删除这些操作的声明。

https://stackoverflow.com/questions/217911/

相关文章:

c++ - 使用字符串分隔符(标准 C++)在 C++ 中解析(拆分)字符串

c++ - 我可以使用 break 退出多个嵌套的 'for' 循环吗?

c++ - 如何实现 STL 风格的迭代器并避免常见的陷阱?

c++ - 删除 NULL 指针是否安全?

c++ - 如何将彩色文本输出到 Linux 终端?

c++ - 在现代 C++11/C++14/C++17 和 future 的 C++20 中枚举到字

c++ - new/delete 和 malloc/free 有什么区别?

c++ - 在 C 中使用移位运算符进行乘法和除法实际上更快吗?

c++ - 单引号在 C++ 中用于多个字符时有什么作用?

c++ - #pragma once 是安全的包含守卫吗?