繁体   English   中英

默认内置构造函数和非参数化用户创建的默认构造函数之间有什么区别吗?

[英]Is there any difference between default built-in constructor and non-parameterized user-created default constructor?

为什么会这样:

 #include<iostream> using namespace std; class student{ int rollNumber; int age; public: student(){ } }; int main(){ student const s; }

但这不起作用?

 #include<iostream> using namespace std; class student{ int rollNumber; int age; }; int main(){ student const s; }

在这两种情况下,都有一个默认构造函数。

顶部有一个用户定义的默认构造函数,底部有一个内置的默认构造函数。

默认的内置构造函数和非参数化的用户创建的默认构造函数有什么区别吗?

第二种,内置的默认构造函数会和用户自定义的非参数化构造函数一样吗?

有谁知道为什么会这样?

C++ 具有const-default-constructible类型 ( [dcl.init.general]p8 ) 的概念。 它要求如果一个 const 限定类型T是默认初始化的,它必须是 const-default-constructible。

对于类,它必须有一个用户提供的构造函数,或者每个成员都必须有一个默认的成员初始化器或者本身是 const-default-constructible。

这就是为什么第一个示例编译( student(){}是用户提供的),而第二个示例失败( int rollNumber;int age;没有初始化程序)。

至于为什么,答案是“标准是这样说的”。 [diff.dcl]p4给出了这样做的理由:

无法分配 const object,因此必须对其进行初始化以保持有用的值。

从 C++98 开始就是这样。

虽然我同意这似乎过于严格的限制(如果所有成员都是可变的怎么办?如果您想读取单个成员的默认成员初始化程序,而让其他成员未初始化怎么办?如果您想构造一个虚拟 object在所有未初始化的情况下传递给其他东西?)在所有情况下,您都可以执行类似student _s; const student& s = _s; student _s; const student& s = _s; 为基本相同的效果。


这是编译器提供的默认构造函数和显式student() {}之间的区别之一。 还有一些是:

  • 用户提供的不是微不足道的,也不是聚合的(而且这个不能在常量表达式中使用)
  • noexcept是自动确定的
  • 编译器提供的一个可能会被delete
  • 用户提供的构造函数将显式实例化 class 主体中成员/基的所有默认构造函数/成员初始化程序(而不是在您尝试使用它时)

可能还有更多。 通常,这些是用户提供的构造函数和编译器生成的构造函数之间的区别, const-default-constructible 似乎是默认构造函数的唯一独特之处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM