编辑:将我的问题更改为更有意义的问题
如果我有课:
class A{
public:
int nr;
int *a;
A();
};
A::A(): nr(0), a = new int[10]{}
这 chrases,但如果我有
A::A(): nr(0) {a = new int[10];}
有用。请向我解释这种行为。
编辑:将我的问题更改为更有意义的问题
如果我有课:
class A{
public:
int nr;
int *a;
A();
};
A::A(): nr(0), a = new int[10]{}
这 chrases,但如果我有
A::A(): nr(0) {a = new int[10];}
有用。请向我解释这种行为。
nr(0)
是数据成员的初始化器nr
。
{a = new T[10]; }
是一个构造函数主体,它在初始化列表中的初始化完成a
后为数据成员赋值。
{}
是一个空的构造函数体,这意味着构造函数什么都不做(除了 initializenr
当然,因为它在初始化列表中)。
a = new int[10]
在初始化列表和构造函数主体之间是无意义的,语言的语法不允许这样做。它不应该编译,但是如果你找到了一个接受它的编译器然后它崩溃了,你必须查看那个编译器的文档以获得解释。
它应该看起来像这样:
template<class T>
class A {
public:
int nr;
T *a;
A();
};
template<class T>
A<T>::A() : nr(0), a( new T[42]) { }
也不应该编译。正确的方法是这样的:
A::A(): nr( 0 ), a( new int[5] ){}
A<T>::A(): nr( 0 ), a( new T[10] ){}