值初始化c++
Value initialization c++
读取值初始化时的cppreference,我得出了以下结论:
- 如果T是一个没有默认构造函数或具有用户提供或删除的默认构造函数,对象为默认初始化
示例:
struct T3
{
int mem1;
std::string mem2;
T3() { } // user-provided default constructor
};
正在阅读关于默认初始化的文章
如果T是非POD(直到C++11)类类型,则构造函数为考虑并根据空载情况进行过载解决参数列表。所选的构造函数(它是默认的构造函数之一构造函数)来为新的对象
如果T是数组类型,则该数组的每个元素都是默认初始化;
否则,什么都不做:具有自动存储的对象持续时间(及其子对象)初始化为不确定价值观
这适用于示例,T是类类型,这意味着重载解析应该选择用于初始化值的候选者(用户提供的默认构造函数),但它是空的,因此mem1
应该保留未确定的值(这是真的),但mem2
应该相同,但这是";默认初始化";至"&";,为什么?它能递归工作吗?类类型T的每个成员都服从第一条规则?
我现在很困惑。
2)如果T是一个具有默认构造函数的类类型用户提供或删除(也就是说,它可能是一个具有隐式定义或默认构造函数),对象为0初始化,如果它有非平凡默认构造函数;
示例:
struct T1
{
int mem1;
std::string mem2;
}; // implicit default constructor
mem1
被零初始化为0;非琐碎的";违约建设者的手段?CCD_ 4也默认初始化为"0"&";,尽管我仍然不确定;非平凡默认构造函数";方法默认构造函数应该由编译器生成,但是它如何决定什么是非平凡的——如果非平凡的默认构造函数意味着它必须初始化对象——和上面的问题一样,它是否意味着每个对象都用默认构造函数初始化?
应该是mem2,但那是"默认初始化"为",为什么?它能递归工作吗?类类型T的每个成员都服从第一条规则?
你的怀疑是正确的。默认初始化类时,由于构造函数中未指定初始化,因此默认初始化其每个成员。由于std::string
有一个用户提供的默认构造函数被调用,并且它将字符串对象初始化为零。
然而,"非平凡"的默认构造函数意味着什么?
一个琐碎的构造函数就是一个无所事事的构造函数。对于类型T
,如果
- 构造函数不是用户提供的(即,隐式定义或默认)
T
没有虚拟成员功能T
没有虚拟基类T
没有带大括号或相等初始值设定项的非静态成员T
的每个直接基都有一个平凡的默认构造函数- 类类型的每个非静态成员都有一个琐碎的默认构造函数
因此,在T1
的情况下,您没有琐碎的构造函数,因为std::string
的默认构造函数是非琐碎的。
这适用于examle,T是类类型,这意味着重载解析应该选择要初始化值的候选者(用户提供的默认构造函数),但它是空的,所以mem1应该保留未定义的值(这是真的),但mem2应该是一样的,但这是"默认初始化"为",为什么?
如果从成员初始值设定项列表中省略了一个数据成员,则它是默认初始化的,这对std::string
来说意味着调用它的默认构造函数并将其初始化为空字符串。默认构造函数没有成员初始值设定项列表,因此所有成员都将默认初始化。
"非平凡"默认构造函数意味着什么?
您可以在这里找到对琐碎构造函数的要求。非平凡的默认构造函数只是一个默认构造函数,它不尊重平凡构造函数的所有要求。简而言之,一个琐碎的默认构造函数除了标记对象生命周期的开始之外,根本不做任何事情(即使是在后台)。
这是否意味着每个对象都用默认构造函数初始化?
如前所述,默认构造函数(与任何其他构造函数一样)将默认初始化成员初始值设定项列表中未指定的任何数据成员。由于默认情况下为空,默认构造函数将递归地导致默认初始化,除非内部成员使用成员初始值设定项列表指定替代初始化。
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 继承:构造函数,初始化C++11中基类的类C数组成员