为什么复制构造函数调用另一个类的默认构造函数?

时间:2009-12-20 05:39:34

标签: c++ copy-constructor

我想知道为什么会发生这样的错误。

no matching function for call to 'Foo::Foo()'

在复制构造函数的代码中?假设Foo只是一个具有普通字段的对象(没有动态分配的内存等),它定义的唯一构造函数是一个带有一个参数的构造函数。

我甚至不知道构造函数需要考虑。如果代码说的是

bar = thing.bar; //

和bar是Foo类型,具有上述规格,它不应该只生成一个浅拷贝并用它来完成吗?为什么需要调用默认构造函数?

3 个答案:

答案 0 :(得分:8)

如果你没有定义构造函数,编译器将生成一个默认构造函数,但是如果你定义一个构造函数(就像一个复制构造函数),编译器将不会生成默认构造函数,因此您还需要定义该构造函数。

答案 1 :(得分:3)

听起来你已经定义了复制构造函数而没有定义任何其他构造函数。

一旦显式声明构造函数,编译器就不再为您提供默认构造函数。因此,您不再具有首先构造类对象的机制(因此无法复制它)。

答案 2 :(得分:1)

如果你说,你正在做“像

这样的事情
bar = thing.bar;

它可能位于类的复制ctor的 body 中 - 因此bar字段首先使用其类的默认ctor进行初始化,然后使用该类的赋值运算符进行此语句。如果bar的班级只有副本ctor,没有默认ctor,则您需要在之前添加bar(thing.bar)条,以便您的班级副本开放{并删除该分配(无论如何通常都是一个好主意,但在“无默认ctor”条件下是强制性的。)