我可以在默认初始化和值初始化之间进行选择,也可以选择数组的全部或部分
Can I choose between default-initalisation and value-initialisaion or all or part of an array?
自C++2003以来,我们既有值初始化,也有默认初始化。意思是:
struct Foo {
int i;
std :: string s;
};
Foo f1; // f1.s is default-constructed, f1.i is uninitialised
Foo f2 = Foo (); // f1.s is default-constructed, f1.i is zero
对吧?
现在假设我有这类
class Bar : public Foo {
int n;
Foo f [SIZE];
public:
Bar ();
};
当我为Bar
编写构造函数时,我可能希望默认或值初始化父类或f[]
成员。我认为初始化父级的选择很简单:
Bar :: Bar () : Foo (), n (-1) {} // Parent is value-initialised (Foo::i is zero)
Bar :: Bar () : n (-1) {} // Parent is default-initialised (Foo::i is undefined)
但是f[]
成员呢?
- 如何默认初始化所有成员
- 如何对所有成员进行初始化
- 如果我使用C++11初始值设定项列表,如果初始值设定值列表的大小与
SIZE
不同,会发生什么
实际上,根据标准值,初始化似乎是调用任何形式的用户定义默认构造函数的过程,或者对没有默认构造函数的对象进行零初始化(参见8.5[dll.init]第7段:
值初始化类型为T的对象意味着:
--如果T是一个(可能是cv限定的)类类型(第9条),具有用户提供的构造函数(12.1),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化形式不正确);
--如果T是一个(可能是cv限定的)非并集类类型,没有用户提供的构造函数,则对象为零初始化,如果T隐式声明的默认构造函数是非平凡的,则调用该构造函数。
--如果T是数组类型,那么每个元素都被值初始化;——否则,对象初始化为零。
从这个意义上讲,您可以使用成员初始值设定项列表中的f()
对自C++1998以来的数组成员进行值初始化。如果你想使用特定的值,你需要使用C++2011和初始化器列表,例如f({ 1, 2, 3 })
。如果参数的数量少于元素的数量,则对其余元素进行值初始化。实际上,是从一个空的初始化器列表中初始化的(8.5.1[dcl.init.agr]第7段):
如果列表中的初始值设定项子句少于聚合中的成员,则每个成员未显式初始化的应从空的初始化器列表进行初始化。
根据8.5.4[dcl.init.list]第3段,项目符号7:
- 否则,如果初始值设定项列表没有元素,则对象被值初始化
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- 选择用于赋值初始化的转换函数的优先级
- 未选择引用到数组的构造函数进行列表初始化
- 成员变量的初始化必须延迟。此类的最佳设计选择是什么?
- 有没有一种非重复的方法允许程序员在成员初始化的复制和移动语义之间进行选择
- 根据 c-tor 的特定条件选择要初始化的变量
- 如何使用运行时选择基 CTOR 初始化不可复制的基类
- 是否可以使用有条件选择的字符串文本初始化字符数组
- 为复杂对象初始化选择哪种设计
- 我可以在默认初始化和值初始化之间进行选择,也可以选择数组的全部或部分
- C++类:是否可以在构造函数主体中选择成员的构造函数?(无需双重初始化成员)