为什么只能使用默认构造函数初始化对象数组?

时间:2014-05-26 15:45:33

标签: c++ constructor new-operator

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;
}

我很困惑,如果编译器实现“使用带参数的构造函数初始化对象数组”?

0 个答案:

没有答案