在为我的一个类(包含其他UDT的一些对象)编写一个复制构造函数时,我需要为那些UDT创建一个默认构造函数,即使它们从来没有真正意图拥有一个。
是否可以实现一个空白的默认构造函数并完成它?调用默认构造函数的唯一时间是在复制期间,创建对象时,然后将相应对象的值复制到其中。因此,在默认构造函数中分配给对象的任何值都将永远不会被使用。
我看到的问题是某些成员变量未在空白默认构造函数中初始化。我应该只写一个给出虚拟值的东西吗?还有其他推荐的方法可以解决这个问题吗?
编辑:我知道如果我要为其他类定义复制构造函数,复制构造函数不需要默认构造函数,但我没有,所以它确实需要它。
答案 0 :(得分:5)
如果在复制构造函数中使用初始化列表,则不需要默认构造函数:
#include <iostream>
using namespace std;
class Foo {
Foo(); /* no default constructor */
public:
Foo(int i) { cout << "Foo constructor (int)" << endl; }
Foo(const Foo& f) { cout << "Foo constructor (copy)" << endl; }
};
class Bar {
Foo f;
public:
Bar() : f(1) { cout << "Bar constructor (default)" << endl; }
Bar(const Bar& b) : f(b.f) { cout << "Bar constructor (copy)" << endl; }
};
int main(void) {
Bar b;
Bar b_=b;
return 0;
}
结果:
Foo constructor (int)
Bar constructor (default)
Foo constructor (copy)
Bar constructor (copy)
答案 1 :(得分:4)
您确定需要复制构造函数吗?有一个默认构造函数可以正常的类,但你需要一个自定义复制构造函数,这是不寻常的(但并非不可能)。也许你可以为你的班级发布代码?
答案 2 :(得分:3)
在我看来,你需要为其他类定义copy c'tors,因为你是通过复制其他对象来创建它们的对象。
答案 3 :(得分:2)
你说:
创建对象时然后 相应对象的值 被复制到它。
但问问自己 - 那个“相应对象”的价值是如何实现的。即如何创建相应的对象?
This previous SO discussion可能有助于为您澄清问题。
答案 4 :(得分:1)
这听起来不像是实现复制构造函数的最佳方法。如果包含的类型本身提供了复制构造函数 - 使用它们。毕竟,类型可能没有提供默认构造函数。
答案 5 :(得分:1)
我首先要问为什么复制这些UDT涉及默认构造函数,而不是更合适的 copy 构造函数。我还会问一个对象在默认初始化状态下意味着什么 - 如果它确实意味着什么,那么一定要实现它。
如果你对默认初始化没有合理的意义,并且你绝对必须使用默认构造函数来定义对象,我想可以提供实现默认构造函数。
但是,并非所有对象都可以获得默认构造函数,因此修复问题的根源仍然是一个好主意。
答案 6 :(得分:0)
您可以通过要求其他对象也具有复制构造函数来阻止默认构造函数(或者使用传递构造对象所需的所有信息的特殊构造函数。通常具有不初始化所有成员变量的默认构造函数是非常的糟糕的想法。至少要确保另一个类的默认构造函数初始化所有成员。
答案 7 :(得分:0)
记住一个拇指规则,只要某些东西不是规范的一部分,编译器就不会为你做。
如果您的类包含用户定义的类型,并且您创建它的对象,则编译器必须为每个对象调用默认的构造函数。
但是初始化对象的数据成员不是编译器的任务,但你可以这样做。
对于您提到的情况,您需要自己的自定义复制构造函数和赋值运算符。
答案 8 :(得分:0)
如果您不希望编译器生成复制构造函数或根本不需要复制构造函数,则声明私有复制构造函数,但不为其提供任何定义(代码)。编译器将看到声明而不生成声明。也可以使用赋值运算符执行此操作。
我用我的单身人士课做这件事。
答案 9 :(得分:0)
如果您的类不是默认构造的,请不要创建默认构造函数。 如果是,那么我相信你可以找出合理的初始化,这就是你应该使用的。
答案 10 :(得分:0)
问题,你所说的方式,似乎毫无意义。复制构造函数不需要默认构造函数,因为您似乎相信。 Copy-constructor是一个完全独立的完整构造函数,它完全构造一个对象。
如果使用copy-constructor构造对象,则不需要默认对象。如果使用默认构造函数构造对象,则无法在其上使用复制构造函数。不可能将两个不同的构造函数“应用”到同一个对象。
如果以两种方式构造对象,那么它们将成为两个完全独立的构造函数,每个构造函数都有自己独立的目的。在这种情况下,您应该问自己的问题是您希望您的对象是如何构建的。只有你知道。
同样,您需要澄清您的问题。我怀疑(根据你的描述)你可能想要实现的不是复制构造函数,而是复制赋值运算符。但这只是一个疯狂的猜测。