我希望这不会被看到"主要是基于意见的"或者"太广泛"。这是一个相当直接的问题:
重载赋值运算符提供解决方案的一些示例问题是什么?
我认为我还没有看到过它会有用的情况,特别是考虑到一个程序充满了惊人的隐含行为的负面影响以及"烟雾和镜子&#34 ;
答案 0 :(得分:3)
示例:
struct X
{
int *p;
X(): p{new int[42]}
~X() { delete p; }
};
如果你做了
将会发生什么X x, y;
x = y;
?默认赋值运算符将复制原始指针,并且您最终会被x
和y
的析构函数两次删除相同的指针。实际上,你最好在这里声明一个复制构造函数(或者更好的是,使用智能指针)。请注意
X x = some_obj;
调用复制构造函数(如果rhs是prvalue,则调用elided)。当您说
时,仅在构建之后调用赋值运算符x = some_other_obj; // x is already constructed here
如果你问operator=
是否应该存在(与Java相比),那么这可能是个人偏好的问题。