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

时间:2014-07-11 23:38:13

标签: c++ copy-constructor assignment-operator

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

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

1 个答案:

答案 0 :(得分:10)

如果你能像Igor Tandetnik建议的那样在适当的RAII包装中隔离特定处理:那就去吧。

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

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 << "\n";
     }
     void operator = (const x& other)
     {
         x_base::operator =(other); 
         descr = "assigned ";
         descr += name;
         descr += " at ";
         descr += CurrentTimeAsString();
         std::cout << descr << "\n";
     }
     std::string descr;
};

如果您以后添加不需要特定处理的数据成员,您只需将它们添加到x_base。

相关问题