gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:24:53 26 4
gpt4 key购买 nike

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

  • 默认(空)构造函数
  • 复制构造函数
  • 析构函数
  • 赋值运算符 (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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com