class A
{
public:
A() {}
A(int _x) : x(_x) {}
private:
int x;
};
int main()
{
A a[100](1); //compile error
A ptr = new A[100](1); // compile error
return 0;
}
如我们所知,示例代码将遇到编译错误,因为对象数组只能由默认构造函数初始化。
为什么不能使用带参数的构造函数初始化对象?
我最近读过 Inside the C ++ Object Model 这本书。正如本书所提到的,在初始化对象数组时,进程将调用一个函数(在cfront 2.0中名为vec_new
),该函数接受构造函数指针并调用构造函数而不带任何参数。这意味着该函数只能调用默认构造函数,因此只能使用默认构造函数初始化对象数组。
但是,为什么编译器使用vec_new
初始化对象数组?
如果编译器没有调用vec_new
,它可以扩展代码来初始化数组中的所有对象,如示例代码:
int main()
{
A ptr = new A[100](1);
////// expanded code, I suppose
/** 1. allocate memory to ptr
* 2. constuct 100 object respectively
* int i = 0;
* char *tmp_ptr = (char *)ptr;
* while(i++ < 100) {
* tmp_ptr = A::A(tmp_ptr, 1);
tmp_ptr += sizeof(A);
}
*/
return 0;
}
我很困惑,如果编译器实现“使用带参数的构造函数初始化对象数组”?