将成员变量标记为不复制

时间:2017-09-06 15:38:51

标签: c++

我有一个包含POD成员的类。我需要复制所有成员,除了一个(示例中的成员a)。我现在这样做的方式如下:

class Example
{
private:
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
    double e = 0;

public:
    Example& operator=(const Example &rhs)
    {
        b = rhs.b;
        c = rhs.c;
        d = rhs.d;
        e = rhs.e;         

        return *this;
    }

    Example() {};

    Example(const Example& toCopy)
    {
       *this = toCopy;
    }
};

有没有办法将变量标记为不复制,因为这样做很冗长,如果我以后修改这个类就容易出错?

2 个答案:

答案 0 :(得分:3)

你可以在结构中包装“奇怪的人”a,并分别定义结构行为:

class Example
{
private:
    CopyLess a;
    int b = 0;
    int c = 0;
    int d = 0;
    double e = 0;

    struct CopyLess {
        int a = 0;
        CopyLess& operator=(const CopyLess&) { return *this; }
        CopyLess(const CopyLess&) {}
    };              
};

请注意,我不再为Example编写任何特殊成员了,因为默认设置符合您的要求。以这种方式编写代码以避免尽可能多地编写特殊成员称为“零度规则”,更多信息和示例:http://www.nirfriedman.com/2015/06/27/cpp-rule-of-zero/

答案 1 :(得分:0)

不,您无法使隐式复制分配跳过成员。正如您所做的那样定义自定义赋值运算符是实现所需行为的方法。

  

如果我稍后修改这个类

,这样做是冗长的,容易出错

您可以将复制的成员分组到单个子对象中。这样,自定义副本分配对于更改并不脆弱,并且详细程度与复制成员的数量保持不变。

奖励:您不需要单独为成员指定值初始化,但是整个子对象的值初始化就足够了。

class Example
{

    int a = 0;
    struct {
        int b;
        int c;
        int d;
        double e;
    } state = {};

public:
    Example& operator=(const Example &rhs)
    {
        state = rhs.state;
        return *this;
    }
...

由于成员是私有的,因此不会更改该类的现有API。