其他问题的答案说这是如何为派生类编写作业:
class D : public B
{
public:
D& operator=(const D& other)
{
B::operator=(other);
// D-specific stuff
return *this;
}
};
但不应该通常的“检查自我分配”吗?例如:
class D : public B
{
public:
D& operator=(const D& other)
{
if ( this != &other ) {
B::operator=(other);
// D-specific stuff
}
return *this;
}
};
或者基类分配可能会被排除在检查之外?
答案 0 :(得分:4)
警告 - 以下内容可能听起来有点强硬。
但不应该通常的“检查自我分配”吗?
着重,否。
考虑自我指派发生的环境。一些人为的设计:
D d;
d = d;
但上面的代码是有缺陷的,并且应该永远不会被写入。这与想要捕获所有未处理的异常的全局catch (...)
的想法相同。如果那个全局catch
- 所有人都试着继续,就好像什么也没发生过一样,那么你所得到的只是一场噩梦。你不会阻止程序崩溃或做更糟糕的事情(例如杀死病人或在你应该购买10k股IBM时出售),你只是阻止它立即崩溃。
自我分配,如上面的代码示例,同样存在缺陷。检查自我分配并继续进行,好像什么都没发生一样只是把头埋在沙子里,假装一切都只是极好的。实际情况是,您的代码中存在需要修复的错误。
如果永远不会发生自我指定,它应该(可能)是assert
离子。它不应该只是滚动。查找并修复导致自我分配的错误。不要围绕它编码。