之间的重要区别
class B {
public:
B(){}
int i;
int j;
};
和
class B {
public:
B() = default;
int i;
int j;
};
是 B() = default; 定义的默认构造函数被认为是 not-user defined . 这意味着在值初始化的情况下,如
B* pb = new B(); // use of () triggers value-initialization
完全没有使用构造函数的特殊类型的初始化将发生,对于内置类型,这将导致零初始化 . 如果是 B(){} ,则不会发生这种情况 . C标准n3337 § 8.5 / 7说
对类型为T的对象进行值初始化意味着: - 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(并且如果T没有可访问的默认构造函数,则初始化是错误的); - 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的,如果T的隐式声明的默认构造函数是非平凡的,则调用该构造函数 . - 如果T是数组类型,则每个元素都是值初始化的; - 否则,对象被零初始化 .
例如:
#include
class A {
public:
A(){}
int i;
int j;
};
class B {