首页 > 后端开发 > C++ > 正文

为什么 C 中可以隐式调用私有默认构造函数?

Susan Sarandon
发布: 2024-11-12 04:30:02
原创
954 人浏览过

Why Can a Private Default Constructor Be Implicitly Invoked in C  ?

什么时候私有构造函数不是私有构造函数?

在 C 中,将默认构造函数声明为私有似乎是一种简单的方法来防止对象实例化。然而,令人惊讶的是,私有默认构造函数仍然可以被隐式调用。

问题:

考虑以下代码:

class C {
    C() = default;
};

int main() {
    C c; // error: default constructor private
    auto c2 = C(); // error: default constructor private
}
登录后复制

为什么构造函数看起来是私有的,但可以用大括号隐式调用初始化?

答案:

关键在于C 14规范。用户提供的构造函数是显式声明的构造函数,无需默认或删除。由于 C 的默认构造函数在其第一个声明中被显式默认,因此不被视为用户提供的。

因此,根据 8.5.1/1 的规定,C 缺少用户提供的构造函数并成为聚合。规格。聚合被定义为没有私有或受保护的非静态数据成员、没有基类、没有虚函数以及没有用户提供的构造函数的类。这解释了为什么大括号初始化可以成功创建 C 对象,尽管默认构造函数在技术上是私有的。

以上是为什么 C 中可以隐式调用私有默认构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板