空的和默认的构造函数和成员初始化
Empty and defaulted constructor and member initialization
考虑以下代码:
template <class T>
struct myclass
{
// Select only one constructor in the following
myclass() = default; // 0
myclass() {}; // 1
myclass(): i{}, ptr{}, var{}, arr{}, vec{}, str{} {} // 2
myclass(): i(), ptr(), var(), arr(), vec(), str() {} // 3
// Data members
int i;
T* ptr;
T var;
std::array<int, 3> arr;
std::vector<T> vec;
std::string str;
};
及其用途:
myclass<std::array<double, 3>> a;
myclass<std::array<double, 3>> b{};
myclass<std::array<double, 3>> c();
auto d = myclass<std::array<double, 3>>{};
auto e = myclass<std::array<double, 3>>();
因此,总共选择了 constructors/method 个结构,我们有 4 * 5 = 20 个案例:a0, a1, a2, a3, b0, b1, b2, b3, ..., e3
。我的问题是:
什么情况导致初始化成员(i
设置为零,ptr
设置为nullptr
,arr
用零填充)以及什么情况导致给未初始化的成员?
首先,c
是函数的声明(烦人的解析)
- a、0、1 是 default initialization。
- b、d、e、2、3 是 value initialization。
对于 built-in 的 2、3,value-initialization 将执行 zero-initialization
2、3会调用std::string
、std::vector
的默认构造函数(这么空)
2 will value initialize std::array
(它的元素是value initialized)
3 将 aggregate-initialize std::array
这是其元素的聚合(value-initialization,因此 0
用于 int
、double
)。
对于0、1,built-in的默认初始化不会初始化它们
0、1 将调用 std::string
、std::vector
的默认构造函数(如此空)
std::array
的默认初始化将默认初始化其元素(int
和 double
未初始化)
对于 myClass
,对于 1、2、3:
- default-initialization 调用默认构造函数。
- value-initialization 调用默认构造函数。
对于myClass
,对于0:
default-initialization 执行其成员的默认初始化。
value-initialization执行零初始化,然后默认初始化。
因此成员将被初始化为 2、3、b-0、d-0、e-0
考虑以下代码:
template <class T>
struct myclass
{
// Select only one constructor in the following
myclass() = default; // 0
myclass() {}; // 1
myclass(): i{}, ptr{}, var{}, arr{}, vec{}, str{} {} // 2
myclass(): i(), ptr(), var(), arr(), vec(), str() {} // 3
// Data members
int i;
T* ptr;
T var;
std::array<int, 3> arr;
std::vector<T> vec;
std::string str;
};
及其用途:
myclass<std::array<double, 3>> a;
myclass<std::array<double, 3>> b{};
myclass<std::array<double, 3>> c();
auto d = myclass<std::array<double, 3>>{};
auto e = myclass<std::array<double, 3>>();
因此,总共选择了 constructors/method 个结构,我们有 4 * 5 = 20 个案例:a0, a1, a2, a3, b0, b1, b2, b3, ..., e3
。我的问题是:
什么情况导致初始化成员(i
设置为零,ptr
设置为nullptr
,arr
用零填充)以及什么情况导致给未初始化的成员?
首先,c
是函数的声明(烦人的解析)
- a、0、1 是 default initialization。
- b、d、e、2、3 是 value initialization。
对于 built-in 的 2、3,value-initialization 将执行 zero-initialization
2、3会调用std::string
、std::vector
的默认构造函数(这么空)
2 will value initialize std::array
(它的元素是value initialized)
3 将 aggregate-initialize std::array
这是其元素的聚合(value-initialization,因此 0
用于 int
、double
)。
对于0、1,built-in的默认初始化不会初始化它们
0、1 将调用 std::string
、std::vector
的默认构造函数(如此空)
std::array
的默认初始化将默认初始化其元素(int
和 double
未初始化)
对于 myClass
,对于 1、2、3:
- default-initialization 调用默认构造函数。
- value-initialization 调用默认构造函数。
对于myClass
,对于0:
default-initialization 执行其成员的默认初始化。
value-initialization执行零初始化,然后默认初始化。
因此成员将被初始化为 2、3、b-0、d-0、e-0