使用具有已删除赋值运算符的成员清除类实例

问题描述 投票:0回答:1

我想使用赋值运算符清除/重新安装类的实例,但该类中的某些成员已删除其赋值运算符。因此,当我尝试将其分配给新实例时,它会保留其旧值。

下面是一个例子:

#include <cstdio>
class C
{
    C operator= (const C&) = delete;
};

class B
{
public:
    int x = 0;
    C c;
    B& operator=(const B& other)
    {
        return B();
    }
};
int main()
{
    B b;
    b.x = 5;
    b = B();
    printf("%i\n", b.x); // prints 5, should print 0
    return 0;
}

如果没有编写清除其所有成员的方法,是否有一些简单的解决方法?为什么会这样?

c++
1个回答
1
投票

为什么会这样?

您当前对operator=()的实现是fubar。

B& operator=(B const &other)
{
    x = other.x;
    return *this;
}

但是,在执行任何操作之前,您还应该测试自我分配,因为复制成员可能非常昂贵:

B& operator=(B const &other)
{
    if(this != &other)
        x = other.x;

    return *this;
}
© www.soinside.com 2019 - 2024. All rights reserved.