首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的“几乎默认”复制构造函数(&赋值运算符)

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

Stack Overflow用户
提问于 2014-07-12 07:38:13
回答 1查看 1.1K关注 0票数 10

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-07-12 08:22:14

如果你能像Igor Tandetnik建议的那样,将特定的处理隔离在一个合适的RAII包装器中:那就去做吧。

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

代码语言:javascript
复制
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即可。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24708101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档