我非常支持让编译器尽可能地为你做更多工作。当编写一个简单类时,编译器可以免费为您提供以下内容:
- 默认(空)构造函数
- 复制构造函数
- 析构函数
- 赋值运算符(
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
{ }
这是有什么好的理由吗?为什么逐成员比较会有问题?显然,如果类分配内存,那么你需要小心,但对于一个简单的类,编译器肯定可以为你完成这个任务,不是吗?
==
是一个错误,就像在某些条件下有一个默认自动分配(=
)一样。(关于指针的论点是不一致的,因为这个逻辑既适用于=
,也适用于==
,而不仅仅是后者。) - alfC