一个已经定义了用户自定义构造函数但不是拷贝构造函数的类,能否调用(隐式)默认拷贝构造函数?
如果可能的话,那么假设我们显式定义了类的拷贝构造函数,现在可以调用(隐式)默认构造函数吗?
一个已经定义了用户自定义构造函数但不是拷贝构造函数的类,能否调用(隐式)默认拷贝构造函数?
如果可能的话,那么假设我们显式定义了类的拷贝构造函数,现在可以调用(隐式)默认构造函数吗?
首先,让我们明确一下我们的词汇。默认构造函数是可以不带任何参数调用的构造函数。复制构造函数是可以通过一个相同类型的单个参数调用的构造函数。基于此,"默认复制构造函数"将具有类似以下签名的构造函数:
class MyClass
{
public:
static MyClass ourDefaultInstance;
// default copy constructor...
MyClass( MyClass const& other = ourDefaultInstance );
};
一些误解,我认为你询问的是隐式声明或隐式定义的复制构造函数;一种复制构造函数,其声明或定义由编译器隐含提供。除非您提供可视为复制构造函数的声明,否则编译器将始终提供该声明。提供其他构造函数不会阻止编译器隐含声明复制构造函数。ourDefaultInstance
将是未定义行为。 - James Kanzehttp://www.cplusplus.com/articles/y8hv0pDG/
如果您没有定义拷贝构造函数,那么默认的拷贝构造函数就会存在。因此,如果您没有定义拷贝构造函数,您可以调用默认的拷贝构造函数;但是,如果您在类中定义了拷贝构造函数,您将无法调用默认的拷贝构造函数。
=delete
来完成的。 - MSaltersprivate
的复制构造函数来阻止其他人使用它。或者,甚至只是声明它但不实现!T(const T&);
- Aaron McDaid不存在所谓的默认复制构造函数。有默认构造函数和复制构造函数,它们是不同的事情。
隐式定义的复制构造函数(我认为这就是你所说的“默认复制构造函数”)将使用它们的复制构造函数而不是默认构造函数来复制类类型的非静态成员。当你没有定义自己的复制构造函数时,隐式定义的复制构造函数会被使用。