2

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

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

或者也许应该将基类分配排除在检查之外?

4

1 回答 1

4

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

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

强调,没有

考虑会发生自我分配的情况。一些人为的东西:

D d;
d = d;

但是上面的代码是有缺陷的,一开始就不应该写。catch (...)这与拥有一个旨在捕获所有未处理异常的全局的想法相同。如果那个全球性catch的一切都试图继续下去,就好像什么都没发生一样,那么你将得到的只是一场噩梦。你不会阻止程序崩溃或做一些更糟糕的事情(比如杀死病人或在你应该购买 10k 股 IBM 时卖出),你只是阻止了它现在崩溃。

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

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

于 2013-05-23T19:37:09.663 回答