C++:默认复制构造函数是否受到其他构造函数和析构函数存在的影响?

发布于 2024-10-31 19:41:33 字数 231 浏览 3 评论 0原文

据我们所知,如果有任何构造函数声明的(包括复制构造函数),默认构造函数(不带参数的构造函数)不是隐式创建的。默认复制构造函数(执行对象浅复制的构造函数)是否会发生同样的情况?另外,析构函数的存在是否会影响这一点?

As we know, if any constructor is declared (copy constructor included), default constructor (the one that takes no arguments) is not implicitly created. Does the same happen with a default copy constructor (the one that performs shallow copy of an object)? Also, does the presence of destructor affect this anyhow?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

羁绊已千年 2024-11-07 19:41:33

12.8 #4 复制类对象

如果类定义没有
显式声明一个复制构造函数,
一个是隐式声明的

并且析构函数不起作用

12.8 #4 Copying class objects

If the class definition does not
explicitly declare a copy constructor,
one is declared implicitly

And the destructor plays no part

柠檬色的秋千 2024-11-07 19:41:33

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

如果类定义没有
显式声明一个复制构造函数,
没有用户声明的移动
构造函数,并且没有
用户声明的移动分配
运算符,复制构造函数是
隐式声明为默认
(8.4.2)。这样的隐式声明
如果类有一个则不推荐使用
用户声明的复制赋值运算符
或用户声明的析构函数。

The answers here are correct but not complete. They are correct for C++98 and C++03. In C++11 you will not get a copy constructor if you have declared a move constructor or move assignment operator. Furthermore if you have declared a copy assignment operator or a destructor, the implicit generation of the copy constructor is deprecated. 12.8 [class.copy]:

If the class definition does not
explicitly declare a copy constructor,
there is no user-declared move
constructor, and there is no
user-declared move assignment
operator, a copy constructor is
implicitly declared as defaulted
(8.4.2). Such an implicit declaration
is deprecated if the class has a
user-declared copy assignment operator
or a user-declared destructor.

梦太阳 2024-11-07 19:41:33

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

No. You'll get a default copy constructor unless you supply your own copy constructor, and the presence or absence of a destructor makes no difference.

一萌ing 2024-11-07 19:41:33

否。请注意,它

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

不提供复制构造函数,而是生成默认的复制构造函数。

No. And note that

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

does not provide a copy constructor, and a default one is generated.

踏月而来 2024-11-07 19:41:33

除非您定义自己的复制构造函数,否则始终会创建默认的复制构造函数。不使用任何其他构造函数来定义不带参数的构造函数,以避免调用它,从而跳过真正的构造函数的代码。

The default copy constructor is always created, unless you define your own one. The constructor with no arguments isn't defined with any other constructor present to avoid calling it and therefore skipping the real constructor(s)'s code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文