我非常喜欢让编译器为您做尽可能多的工作。在编写一个简单的类时,编译器可以“免费”为您提供以下内容:
- 默认(空)构造函数
- 复制构造函数
- 析构函数
- 赋值运算符 (
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/