Default constructors
默认构造函数
默认构造函数是一个构造函数,它可以在没有参数%28的情况下调用,既可以用空参数列表定义,也可以用为每个参数%29提供的默认参数调用。具有公共默认构造函数的类型为DefaultConstructible
...
句法
ClassName ( ) ; | (1) | |
---|---|---|
ClassName :: ClassName ( ) body | (2) | |
ClassName() = delete ; | (3) | (since C++11) |
ClassName() = default ; | (4) | (since C++11) |
解释
1%29默认构造函数声明。
2%29类主体外构造函数的定义。
3%29抑制编译器自动生成默认构造函数。
4%29显式强制编译器自动生成默认构造函数。
ClassName
封闭类的标识符。
期间调用默认构造函数。默认初始化和值初始化...
隐式声明的默认构造函数
如果没有为类类型提供任何类型的用户声明构造函数,则为%28。struct
,,,class
,或union
%29,编译器将始终将默认构造函数声明为inline public
它的阶级成员。
If some user-declared constructors are present, the user may still force the automatic generation of a default constructor by the compiler that would be implicitly-declared otherwise with the keyword default. | (since C++11) |
---|
隐式声明%28或默认在其第一次声明%29默认构造函数中具有异常规范,如动态异常规范%28直到C++17%29异常规格%28自C++17%29。
隐式定义的默认构造函数
如果未将隐式声明的默认构造函数定义为“删除”,则定义为%28,也就是说,编译器将生成函数体并编译为%29。ODR-使用,它的效果与用户定义的构造函数的空体和空初始化程序列表完全相同。也就是说,它调用这个类的基和非静态成员的默认构造函数。
If some user-defined constructors are present, the user may still force the automatic generation of a default constructor by the compiler that would be implicitly-declared otherwise with the keyword default. | (since C++11) |
---|
删除隐式声明的默认构造函数
类的隐式声明或默认默认构造函数。T
在C++11%29定义为自C++11%29以来的删除%28之前,未定义的%28(如果下列任何一项为真):
T
具有一个没有默认初始化项的引用类型成员。%28自C++11%29
T
有一个const
自C++11%29以来,没有用户定义的默认构造函数或默认成员初始化程序%28的.
T
具有一个成员%28,而没有默认的成员初始化器%29%28,因为C++11%29具有已删除的默认构造函数,或者其默认构造函数不明确或无法从此构造函数访问。
T
具有一个直接或虚拟的基,其中包含已删除的默认构造函数,或者从此构造函数中不明确或不可访问。
T
具有直接或虚拟基,其中具有已删除的析构函数,或无法从此构造函数访问的析构函数。
T is a union with at least one variant member with non-trivial default constructor, and no variant member of T has a default member initializer. T is a non-union class with a variant member M with a non-trivial default constructor, and no variant member of the anonymous union containing M has a default member initializer. | (since C++11) |
---|
T
是union
具有至少一个具有非平凡默认构造函数的变体成员,而没有T
具有默认的成员初始化程序。
T
是一个具有变体成员的非联合类。M
具有一个非平凡的默认构造函数,并且匿名联合的任何变体成员都不包含M
具有默认的成员初始化程序。
%28自C++11%29
T
是union
它的所有变体成员都是const
...如果没有用户定义的构造函数,并且隐式声明的默认构造函数并不简单,那么用户仍然可以阻止编译器使用关键字DELET
E自动生成隐式定义的默认构造函数。%28自C++11%29平凡默认构造函数类的默认构造函数。T
是微不足道的%28i.e。如果下列所有操作都为真,则不执行操作%29:
- 构造函数不是用户提供的%28i。e.是隐式定义的或默认的%29。
T
没有虚拟成员函数
T
没有虚拟基类。
T has no non-static members with default initializers. | (since C++11) |
---|
T
没有默认初始化项的非静态成员。%28自C++11%29
- 每一个直接的基地
T
有一个简单的默认构造函数
- 类类型的每个非静态成员都有一个简单的默认构造函数。
简单的默认构造函数是不执行任何操作的构造函数。所有与C语言%28POD类型%29兼容的数据类型都是轻微的默认构造。不像在C中但是,不能通过简单地重新解释适当对齐的存储来创建具有简单默认构造函数的对象,例如用std::malloc
*安置---正式要求新的职位引入一个新对象避免潜在的未定义的行为。
缺陷报告
以下行为更改缺陷报告追溯应用于先前发布的C++标准。
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 2084 | C++11 | default member initializers have no effect on whether a defaulted default constructor of a union is deleted | they prevent the defaulted default constructor from being defined as deleted |
例
二次
struct A
{
int x;
A(int x = 1): x(x) {} // user-defined default constructor
};
struct B: A
{
// B::B() is implicitly-defined, calls A::A()
};
struct C
{
A a;
// C::C() is implicitly-defined, calls A::A()
};
struct D: A
{
D(int y): A(y) {}
// D::D() is not declared because another constructor exists
};
struct E: A
{
E(int y): A(y) {}
E() = default; // explicitly defaulted, calls A::A()
};
struct F
{
int& ref; // reference member
const int c; // const member
// F::F() is implicitly defined as deleted
};
int main()
{
A a;
B b;
C c;
// D d; // compile error
E e;
// F f; // compile error
}
二次
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。