默认复制构造函数

时间:2012-09-25 07:11:44

标签: c++ constructor copy default copy-constructor

是否可以为已经 用户定义构造函数的调用(隐式)默认 复制构造函数 但这不是复制构造函数

如果可能的话,假设我们明确地定义了类的复制构造函数,现在可以调用(隐式)默认构造函数吗?

3 个答案:

答案 0 :(得分:88)

首先,让我们澄清一下我们的词汇量。默认构造函数是 可以不带任何参数调用的构造函数。复印件 构造函数是一个可以使用单个参数调用的构造函数 相同类型。鉴于此,“默认复制构造函数”将是一个 带有签名的构造函数:

class MyClass
{
public:
    static MyClass ourDefaultInstance;
    //  default copy constructor...
    MyClass( MyClass const& other = ourDefaultInstance );
};

不知何故,我不认为这就是你的意思。我认为是什么 你问的是隐式声明或隐式定义 复制构造函数;一个复制构造函数,其声明或定义是 由编译器隐式提供。编译器将始终提供 声明,除非你提供可以的声明 被视为复制构造函数。提供其他构造函数不会 防止编译器隐式声明复制构造函数。

这与默认构造函数任何用户定义的不同 构造函数将阻止编译器隐式声明a 默认构造函数。这意味着如果您有用户定义的副本 构造函数,编译器不会隐式声明默认值 构造

第二个重点是你不要打电话给构造函数。该 编译器在某些定义良好的上下文中调用它们:variable 主要是定义和类型转换。编译器只能调用 声明的构造函数(包括那些隐式的构造函数) 声明)。所以如果你有一个用户定义的构造函数(copy或 否则),并且不定义默认构造函数,编译器不能 调用构造函数,除非在有调用参数的上下文中 它与。

总结一下我认为你的问题是什么:编译器会提供 即使该类已定义其他用户,也是隐式复制构造函数 构造函数,如果这些构造函数都不能被视为副本 构造函数。如果你提供一个用户定义的复制构造函数,那么 编译器将提供隐式声明的默认复制构造函数。

答案 1 :(得分:7)

http://www.cplusplus.com/articles/y8hv0pDG/

如果尚未定义默认复制构造函数,则存在默认复制构造函数。所以是的,你可以调用默认的复制构造函数,如果你还没有定义一个复制构造函数,但是如果你在类中定义了一个复制构造函数,你将无法调用默认复制构造函数。

答案 2 :(得分:3)

没有默认的复制构造函数。有 默认构造函数和复制构造函数,它们是不同的 的东西。

隐式定义的复制构造函数(我认为是你的 表示“默认复制构造函数”)将复制非静态成员 类类型使用其复制构造函数,而不是它们的默认值 构造函数。您可以使用隐式定义的复制构造函数 不要定义自己的复制构造函数。