某些语言结构需要复制构造函数:
- 按值传递
- 按值返回
- 复制样式初始化(尽管在这种情况下通常会省略复制)
如果语言要求复制,并且您提供了复制构造函数,则可以使用它(当然,假设 cv-qualifications 是可以的)。
由于您没有提供复制构造函数,因此您将获得编译器生成的复制构造函数。这通过复制每个数据成员来工作,即使这对您的班级来说不是正确的做法。例如,如果您的 not-a-copy-constructor 显式执行任何深层复制或分配资源,那么您需要禁止编译器生成的副本。
如果编译器生成的副本适用于您的类,那么您的非副本构造函数基本上是无害的。不过,我认为这不是一个特别好的主意:
void some_function(const MyClass &foo);
MyClass *ptr = new MyClass();
const MyClass *ptr2 = ptr;
some_function(ptr); // compiles, but copies *ptr and uses the copy
MyClass bar(ptr2); // doesn't compile -- requires pointer-to-non-const
即使假设编译器生成的副本对您的类没有好处,进行必要的更改也不需要进行大量重构。假设您的非构造函数实际上并未修改其参数所指向的对象,因此在修复签名后您拥有:
MyClass::MyClass(const MyClass* my_class) {
// maybe treat null pointer specially
// do stuff here
}
你需要:
MyClass::MyClass(const MyClass& my_class) {
do_stuff(my_class);
}
MyClass::MyClass(const MyClass* my_class) {
// maybe treat null pointer specially
do_stuff(*my_class);
}
MyClass::do_stuff(const MyClass& my_class) {
// do stuff here
}
您还需要将任何初始值设定项列表从旧构造函数复制到新构造函数,并根据my_class 不是新构造函数中的指针这一事实对其进行修改。
删除旧的构造函数可能需要大量重构,因为您必须编辑任何使用它的代码。不过,您不必删除旧的构造函数来修复默认复制构造函数的任何问题。