如何在C++中使用默认和自己的复制构造函数?

pab*_*blo 8 c++ constructor deep-copy copy-constructor shallow-copy

我有一个很长的班级,有很多成员.我想为它编写复制构造函数.但是如果我编写自己的拷贝构造函数,我就失去了对deafult拷贝构造函数的访问权限.

我只是想在我自己的拷贝构造函数中修复一些指针.所以我希望对象的浅拷贝可以通过默认的拷贝构造函数来完成.

当有我自己的拷贝构造函数时,是否有可能访问默认的拷贝构造函数?

Jam*_*nze 11

在结构中包装您不想更改的内容,并从中私有地派生.在复制构造函数中,只需调用基类的复制构造函数即可.

  • @SteveJessop 可能还有其他批评。例如,如果班级有足够多的成员,这就会成为一个问题。至于指针......不知道为什么它们需要特殊处理,很难确定,但是_如果_这是动态分配对象和深度复制的问题,那么任何一个类中的多个指针都会导致问题。 (2认同)

Pio*_*ycz 6

不,你不能同时拥有默认和自己的复制c-tor.

但是这个问题有两种解决方法:


1将指针包含在具有已定义复制语义的某个类中

例:

class A {
public:
private:
   int trivial1;
   int trivial2;
   ...
   SomePointer  nontrivialMember;
};

class SomePointer {
public:
  SomePointer(const SomePointer&); // here the non trivial part of A copy semantics
  int* nonTrivialMember;
};
Run Code Online (Sandbox Code Playgroud)

2将平凡的参数包含在一些简单的结构中

例:

class A {
public:
   A(const A& o) : data(o.data) {
     // non trivial part
   }
private:
   struct Data {
     int trivial1;
     int trivial2;
     ...
   } data;
   int* nontrivialMember;
};
Run Code Online (Sandbox Code Playgroud)

我总是选择第一个解决方案.

[UPDATE]

还有第三个解决方案,与我的第二个解决方案非常相似,将您的琐碎部分包含在私有继承的基类中.我还是更喜欢第一种解决方案.

  • @ user877329首先选择的主要原因是只实现必要的复制/移动语义.必要时我的意思是编译器本身无法定义的.在第一个解决方案中,您只处理指针.在其他解决方案中,您还必须复制一个类的这个小部分. (2认同)