C ++中的“几乎默认”复制构造函数(&赋值运算符)

“Almost default” copy constructor (& assignment operator) in C++

我发现自己经常做的一件事是生成"几乎默认"的复制构造函数和赋值运算符。也就是说,我发现自己处于编译器提供的复制和分配操作符对大多数数据成员都有效的情况下,但是有一个特定的数据成员需要以不同的方式处理。这意味着我必须显式地创建一个复制构造函数/分配操作符,包括显式地列出所有具有简单复制语义的数据成员。对于有大量数据成员的类,或者稍后添加成员变量但未添加到复制构造函数/赋值运算符的类,这可能会很恼人。

有没有办法告诉C++编译器,一个显式声明的复制构造函数/赋值操作符应该像隐式的一样工作,除了以后运行的一些额外代码?(这样的语法是C++ 98兼容的,还是需要C++ 11或C++ 14的支持?)


如果你能像igor tandetnik建议的那样,用一个合适的RAII包装器隔离特定的操作:去做。

如果您仍然需要在复制构造函数和/或分配运算符中进行特定处理(例如在容器或日志中注册对象创建/分配),则可以将默认复制构造/分配的数据成员分组为单独的类,您将其用作基类或数据成员,并将其作为组合处理,因此:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct x_base {
  int a,b,c,d;
  std::string name;
};

struct x : x_base {
     x(const x& other)
         : x_base(other)
     {
         descr ="copied";
         descr += name;
         descr +=" at";
         descr += CurrentTimeAsString();
         std::cout << descr <<"
"
;
     }
     void operator = (const x& other)
     {
         x_base::operator =(other);
         descr ="assigned";
         descr += name;
         descr +=" at";
         descr += CurrentTimeAsString();
         std::cout << descr <<"
"
;
     }
     std::string descr;
};

当您稍后添加不需要特定处理的数据成员时,您可以简单地将它们添加到x_Base。