为什么我必须提供默认的ctor?

时间:2010-04-01 19:56:12

标签: c++ arrays

如果我想创建一个我的类型的对象数组,为什么我必须提供默认的ctor? 谢谢你的回答

4 个答案:

答案 0 :(得分:8)

因为必须对它们进行初始化。

考虑是不是这样:

struct foo
{
    foo(int) {}

    void bar(void) {}
};

foo a[10];
foo f = a[0]; // not default-constructed == not initialized == undefined behavior

请注意,

int main(){
   // initializes with the int constructor
   foo a[] = {1, 2, 3};
}

// if the constructor had been explicit
int main(){
   // requires copy-constructor
   foo a[] = {foo(1), foo(2), foo(3)};
}

如果您确实需要一个对象数组,并且无法提供有意义的默认构造函数,请使用std::vector

如果你真的需要一个对象数组,不能给出有意义的默认构造函数,想要留在堆栈中,你需要懒惰地初始化对象。 I have written such a utility class。 (您将使用第二个版本,第一个使用动态内存分配。)

例如:

typedef lazy_object_stack<foo> lazy_foo;

lazy_foo a[10]; // 10 lazy foo's

for (size_t i = 0; i < 10; ++i)
{
    // create a foo, on the stack, passing `i` to the constructor
    a[i].create(i); 
}

for (size_t i = 0; i < 10; ++i)
    a[i].get().bar(); // and use it

// automatically destructed, of course

答案 1 :(得分:2)

将为数组中的每个对象调用默认构造函数。 您不必指定默认构造函数,因为将为您创建一个构造函数。

请确保不要将没有参数的构造函数声明为private或protected。

以下是为您创建的示例:

class C
{
};


C c[10];

然而,如果您将其设为私有,则会收到编译错误:

class C
{
private:
    C()
    {

    }
};

C c[10];

答案 2 :(得分:1)

定义数组时,不能指定ctor参数,因此必须使用默认的ctor构造数组中的每个对象。

通常,C ++编译器会自动为您创建默认的ctor。但是,如果使用参数定义ctor,则会自动创建默认ctor,并且必须显式写入。

答案 3 :(得分:0)

因为在初始化数组时,会为其项目调用默认构造函数。