如果我想创建一个我的类型的对象数组,为什么我必须提供默认的ctor? 谢谢你的回答
答案 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)
因为在初始化数组时,会为其项目调用默认构造函数。