C++ 值初始化c++;
在阅读关于值初始化的参考资料时,我得出以下结论:C++ 值初始化c++;,c++,c++11,C++,C++11,在阅读关于值初始化的参考资料时,我得出以下结论: 如果T是没有默认构造函数或具有 用户提供或删除的默认构造函数,对象为 默认初始化 例如: struct T3 { int mem1; std::string mem2; T3() { } // user-provided default constructor }; struct T1 { int mem1; std::string mem2; }; // implicit default constru
struct T3
{
int mem1;
std::string mem2;
T3() { } // user-provided default constructor
};
struct T1
{
int mem1;
std::string mem2;
}; // implicit default constructor
阅读关于违约的文章
如果T是非POD(直到C++11)类类型,则构造函数是
考虑并承受针对空的过载解决方案
参数列表。所选构造函数(默认值之一)
调用构造函数)以提供新
对象
如果T是数组类型,则数组的每个元素都是
默认初始化
否则,什么也不做:自动存储对象
持续时间(及其子对象)初始化为不确定
价值观
这适用于该示例,T是类类型,这意味着重载解析应该选择用于初始化值的候选对象(用户提供的默认构造函数),但它是空的,因此mem1
应该保留不确定的值(这是真的),但相同的值应该是mem2
,但这是“默认初始化”为“”,为什么呢?它是递归工作的吗?类类型的T的每个成员都服从第一条规则
我现在很困惑
2) 如果T是具有默认构造函数的类类型,则 用户提供或删除(即,它可能是具有 隐式定义或默认构造函数),对象为 零初始化,如果它有 非平凡默认构造函数 例如:
struct T3
{
int mem1;
std::string mem2;
T3() { } // user-provided default constructor
};
struct T1
{
int mem1;
std::string mem2;
}; // implicit default constructor
mem1
初始化为0,但是“非平凡”默认构造函数意味着什么mem2
也默认初始化为“”,但我仍然不确定,“非平凡默认构造函数”是什么意思?默认构造函数应该由编译器生成,但它如何决定什么是非平凡的——如果非平凡的默认构造函数意味着它必须初始化对象——与上面的问题相同,它是否意味着每个对象都用默认构造函数初始化
mem2也应该是一样的,但这是“默认初始化”为“”,为什么?它是递归工作的吗?类类型的T的每个成员都服从第一条规则
你的怀疑是对的。默认初始化类时,默认初始化其每个成员,因为构造函数中未指定初始化。因为std::string
有一个用户提供的调用的默认构造函数,它将字符串对象初始化为nothing
然而,“非平凡”默认构造函数意味着什么
一个平凡的构造函数是一个什么都不做的构造函数。对于类型T
,如果
- 构造函数不是用户提供的(即隐式定义或默认)
没有虚拟成员函数T
没有虚拟基类T
没有带大括号或同等初始值设定项的非静态成员T
的每个直接基都有一个微不足道的默认构造函数T
- 类类型的每个非静态成员都有一个普通的默认构造函数
T1
的情况下,您没有一个平凡的构造函数,因为std::string
的默认构造函数是非平凡的
mem2也应该是一样的,但这是“默认初始化”为“”,为什么?它是递归工作的吗?类类型的T的每个成员都服从第一条规则
你的怀疑是对的。默认初始化类时,默认初始化其每个成员,因为构造函数中未指定初始化。因为std::string
有一个用户提供的调用的默认构造函数,它将字符串对象初始化为nothing
然而,“非平凡”默认构造函数意味着什么
一个平凡的构造函数是一个什么都不做的构造函数。对于类型T
,如果
- 构造函数不是用户提供的(即隐式定义或默认)
没有虚拟成员函数T
没有虚拟基类T
没有带大括号或同等初始值设定项的非静态成员T
的每个直接基都有一个微不足道的默认构造函数T
- 类类型的每个非静态成员都有一个普通的默认构造函数
T1
的情况下,您没有一个平凡的构造函数,因为std::string
的默认构造函数是非平凡的
这适用于examle,T是类类型,这意味着重载解析应该选择候选值来对值进行初始化(用户提供的默认构造函数),但它是空的,因此mem1应该保留Indermined值(这是真的),但同样应该是mem2,但这是“默认初始化”为“”,为什么
如果从中省略一个数据成员,那么它是默认初始化的,这对于std::string
意味着调用它的默认构造函数并将其初始化为空字符串。默认构造函数没有成员初始值设定项列表,因此所有成员都将获得默认初始化
“非平凡”默认构造函数是什么意思
您可以找到一个普通构造函数的需求。一个非平凡的默认构造函数只是一个默认构造函数,它不遵守平凡构造函数的所有要求。简而言之,一个微不足道的默认构造函数除了标记对象生命周期的开始之外,根本不做任何事情(即使在引擎盖下)
这是否意味着每个对象都使用默认构造函数初始化
如前所述,默认构造函数(与任何其他构造函数一样)将默认初始化me中未另行指定的任何数据成员