41

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

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

4

3 回答 3

106

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

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

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

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

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

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

于 2012-09-25T07:45:17.787 回答
13

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

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

于 2012-09-25T07:14:48.713 回答
3

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

隐式定义的复制构造函数(我认为这是“默认复制构造函数”的意思)将使用它们的复制构造函数复制类类型的非静态成员,而不是它们的默认构造函数。当您没有定义自己的复制构造函数时,将使用隐式定义的复制构造函数。

于 2012-09-25T07:15:10.303 回答