class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
这个对吗?
class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
这个对吗?
A::A() : a(), ptr() { }
如果你这样做,就能确保在构造完成后,A::a
的所有 5 个元素都将具有值 '\0'
,而 A::ptr
将为 null。
抱歉,C++不支持像这样初始化数组。
你只能在 A
的构造函数中为其成员赋值,或者如果你不关心值是什么的话,可以使用值初始化:
struct A {
int x[5];
A() : x();
};
C++0x确实允许您提供所有值:
struct A {
int x[5];
A() : x{1,2,3,4,5} {}
};
struct A {
int x[5];
A(std::initializer_list<int[5]>& i) // or whatever the T should be
: x{i} // or x(i)
{}
}
A a({1,2,3,4,5)};
std::array<>
而不是 C 数组,在构造函数初始化列表中可以方便地初始化并从静态成员函数返回。 - ildjarnstd :: initializer_list <>
初始化数组,因为数组没有构造函数。但您仍然需要在封闭类型的构造函数中迭代某些内容。而这并不是真正的问题的原因就是ildjarn所说的那样。 - Lightness Races in OrbitA() : a{1, 2, 3, 4, 5} { }
没有问题(当然,并不意味着它在C++0x中是允许的)。 - James McNellisstd::initializer_list<>
的情况;基本的逐元素初始化确实是有效的,不是吗? - Lightness Races in Orbitstd::array<>
是一个聚合体。它没有除默认/复制和(可能)移动之外的构造函数(因此也没有初始化列表构造函数)。请注意,您可以编写像template<typename ...T> A(T... t):x{t...} { }
这样的构造函数,然后编写A a{1, 2, 3}
,但这看起来会创建许多小的模板实例化。不确定它会导致多少代码膨胀。请参见https://dev59.com/QW855IYBdhLWcg3w1oE8#4118050。 - Johannes Schaub - litb