8

众所周知,如果声明了任何构造函数(包括复制构造函数),则不会隐式创建默认构造函数(不带参数的构造函数)。默认复制构造函数(执行对象浅拷贝的构造函数)也会发生同样的情况吗?此外,析构函数的存在是否会影响这一点?

4

5 回答 5

9

12.8 #4复制类对象

如果类定义没有显式声明复制构造函数,则隐式声明

析构函数不起作用

于 2011-04-11T09:44:30.737 回答
6

这里的答案是正确的,但并不完整。它们适用于 C++98 和 C++03。在 C++11 中,如果您声明了移动构造函数或移动赋值运算符,您将不会获得复制构造函数。此外,如果您声明了复制赋值运算符或析构函数,则不推荐使用隐式生成复制构造函数。12.8 [class.copy]:

如果类定义没有显式声明复制构造函数,没有用户声明的移动构造函数,也没有用户声明的移动赋值运算符,则复制构造函数被隐式声明为默认值 (8.4.2)。如果类具有用户声明的复制赋值运算符或用户声明的析构函数,则不推荐使用此类隐式声明。

于 2011-04-11T15:21:53.840 回答
3

不。除非您提供自己的复制构造函数,否则您将获得默认的复制构造函数,并且析构函数的存在与否没有区别。

于 2011-04-11T09:31:43.277 回答
3

不,请注意

MyClass
{
    template <typename T> MyClass(const T&);
};

不提供拷贝构造函数,默认生成一个。

于 2011-04-11T09:36:24.143 回答
1

除非您定义自己的副本构造函数,否则始终会创建默认的复制构造函数。没有参数的构造函数没有与存在的任何其他构造函数一起定义,以避免调用它并因此跳过真正的构造函数的代码。

于 2011-04-11T09:34:00.347 回答