c++ - "Almost default"C++ 中的复制构造函数(和赋值运算符)

标签 c++ copy-constructor assignment-operator

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

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

最佳答案

如果您可以按照 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。

关于c++ - "Almost default"C++ 中的复制构造函数(和赋值运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24708101/

相关文章:

c++ - 在 C++ 中编写复制构造函数和赋值运算符的 list

c++ - 为什么我不能在此代码中获得返回值优化?

c++ - 当我们复制/分配派生类对象时,如何在继承中复制基类成员?

c++ - 成员函数 .begin() 和 std::begin()

c++ - STL 中没有 basic_ostream 的 writesome 函数的理由是什么?

C++继承复制构造函数调用?

c++ - 堆栈上的构造函数/析构函数调用顺序

c++ - 重载 operator= 作为非成员

c++ - 从字节流中读取 uint32_t

c++ - 使用动态库(dll/dylib)进行内存管理