默认复制构造函数

sou*_*912 33 c++ constructor default copy copy-constructor

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

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

Jam*_*nze 92

首先,让我们澄清一下我们的词汇量.默认构造函数是一个可以在没有任何参数的情况下调用的构造函数.复制构造函数是一个构造函数,可以使用相同类型的单个参数进行调用.鉴于此,"默认复制构造函数"将是具有以下签名的构造函数:

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

不知何故,我不认为这就是你的意思.我认为你所询问的是隐式声明或隐式定义的复制构造函数; 复制构造函数,其声明或定义由编译器隐式提供.除非您提供可被视为复制构造函数的声明,否则编译器将始终提供声明.提供其他构造函数不会阻止编译器隐式声明复制构造函数.

这与默认构造函数不同 - 任何用户定义的构造函数都将阻止编译器隐式声明默认构造函数.这意味着如果您有用户定义的复制构造函数,编译器将不会隐式声明默认构造函数.

第二个重点是你不要调用构造函数.编译器主要在某些定义良好的上下文中调用它们:变量定义和类型转换.编译器只能调用声明的构造函数(包括那些隐式声明的构造函数).因此,如果您有用户定义的构造函数(复制或其他),并且没有定义默认构造函数,则编译器不能调用构造函数,除非在具有调用它的参数的上下文中.

总结一下我认为您的问题是什么:即使该类具有其他用户定义的构造函数,编译器也将提供隐式复制构造函数,前提是这些构造函数都不能被视为复制构造函数.如果您提供用户定义的复制构造函数,则编译器将提供隐式声明的默认复制构造函数.

  • @James Kanze:非常好的解释,默认的复制构造函数,我的意思是由编译器隐式定义. (3认同)
  • 只是偶然发现了这一点.关于答案中的最后一句:根据[this](http://en.cppreference.com/w/cpp/language/copy_constructor)引用,在C++ 11代中可以通过使用关键字强制隐式复制构造函数尽管存在用户定义的复制构造函数,但是`default`. (3认同)

Cra*_*sta 11

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

如果尚未定义,则存在默认的复制构造函数.因此,如果您尚未定义复制构造函数,则可以调用默认复制构造函数,但是如果您在类中定义了复制构造函数,则无法调用默认复制构造函数.

  • 我不明白您的最后声明-您可以清理此答案吗? (2认同)

归档时间:

查看次数:

65184 次

最近记录:

6 年,10 月 前