我非常乐于让编译器为您完成尽可能多的工作。在编写简单的类时,编译器可以为您提供以下“免费”功能:
- 默认(空)构造函数
- 复制构造函数
- 析构函数
- 赋值运算符(
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
{ }
是否有充分的理由呢?为什么进行逐成员比较会是一个问题?显然,如果该类分配了内存,那么您要格外小心,但是对于简单的类,编译器肯定可以为您执行此操作吗?
==
默认的自动分配是一个错误,就像=
在某些条件下存在默认的自动分配()一样。(关于指针的参数是不一致的,因为逻辑既适用于=
和==
,也适用于第二种)。