如何使用成员初始化列表来初始化数组? [英] How can i use member initialization list to initialize an array?
问题描述
A类{
public:
A();
private:
char a [5];
int * ptr;
};
A :: A():a(0),ptr(0){}
这是正确的吗?
03从它的C ++ 03标准中,§8.5/ 7:$ c
一个对象的初始值是一个空的圆括号,即(),应进行值初始化。
并从§8.5/ 5开始:
value-initialize 类型
T
的对象表示:
- if
T
是一个具有用户声明的构造函数的类类型,然后调用T
的默认构造函数如果T
没有可访问的默认构造函数,则是错误的);
- 如果
T
是没有用户声明的构造函数的非联合类类型,那么T
的每个非静态数据成员和基类组件都是值初始化的; li>
- 如果
T
是数组类型,则每个元素都是值初始化的;
- 否则,对象为零初始化
类型
T
的对象表示:
- if
T
是标量类型,对象设置为0
(零)的值转换为T
;
- 如果
T
是非联合类类型,非静态数据成员和每个基类子对象都是零初始化的;
- 如果
T
是联合类型,成员)是零初始化的;
- 如果
T
是数组类型,每个元素都是零初始化的;
- 如果
T
是引用类型,则不执行初始化。
所以,如果你的构造函数定义改为
A :: A ):a(),ptr(){}
的5个元素将具有值
'\0'
和 A的
:: ptr
将为null。
class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
Is this right?
The only sensible thing you can do with a C-array in C++03 is value-initialize it (in C++11 and beyond it can be list-initialized).
From the C++03 standard, §8.5/7:
An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.
And from §8.5/5:
To value-initialize an object of type
T
means:
- if
T
is a class type with a user-declared constructor, then the default constructor forT
is called (and the initialization is ill-formed ifT
has no accessible default constructor);- if
T
is a non-union class type without a user-declared constructor, then every non-static data member and base-class component ofT
is value-initialized;- if
T
is an array type, then each element is value-initialized;- otherwise, the object is zero-initialized
To zero-initialize an object of type
T
means:
- if
T
is a scalar type, the object is set to the value of0
(zero) converted toT
;- if
T
is a non-union class type, each nonstatic data member and each base-class subobject is zero-initialized;- if
T
is a union type, the object’s first named data member) is zero-initialized;- if
T
is an array type, each element is zero-initialized;- if
T
is a reference type, no initialization is performed.
So, if your constructor definition is changed to
A::A() : a(), ptr() { }
then you are guaranteed that post-construction, all 5 elements of A::a
will have the value '\0'
and A::ptr
will be null.
这篇关于如何使用成员初始化列表来初始化数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!