如何正确编写派生类的赋值运算符

时间:2013-05-23 19:23:51

标签: c++ derived-class assignment-operator

其他问题的答案说这是如何为派生类编写作业:

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;
    }
};

或者基类分配可能会被排除在检查之外?

1 个答案:

答案 0 :(得分:4)

警告 - 以下内容可能听起来有点强硬。

  

但不应该通常的“检查自我分配”吗?

着重,

考虑自我指派发生的环境。一些人为的设计:

D d;
d = d;

但上面的代码是有缺陷的,并且应该永远不会被写入。这与想要捕获所有未处理的异常的全局catch (...)的想法相同。如果那个全局catch - 所有人都试着继续,就好像什么也没发生过一样,那么你所得到的只是一场噩梦。你不会阻止程序崩溃或做更糟糕的事情(例如杀死病人或在你应该购买10k股IBM时出售),你只是阻止它立即崩溃

自我分配,如上面的代码示例,同样存在缺陷。检查自我分配并继续进行,好像什么都没发生一样只是把头埋在沙子里,假装一切都只是极好的。实际情况是,您的代码中存在需要修复的错误。

如果永远不会发生自我指定,它应该(可能)是assert离子。它不应该只是滚动。查找并修复导致自我分配的错误。不要围绕它编码。