【问题标题】:Why do I have to provide default ctor?为什么我必须提供默认 ctor?
【发布时间】:2010-04-01 19:56:12
【问题描述】:

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

【问题讨论】:

  • 请记住,如果您没有创建其他构造函数,则会自动创建默认构造函数。
  • @atch 这是我一直告诉你应该使用 std::vector 的原因之一!
  • @GMan 我会非常怀疑没有明确声明至少一个构造函数的类(或结构)。这种类型当然是可能的,但在我的经验中很少见。

标签: c++ arrays


【解决方案1】:

因为它们必须被初始化。

如果不是这样,请考虑:

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

【讨论】:

  • 但是你说的“a[0]; // 不是默认构造的 == 没有初始化 == 未定义的行为!” 它并不能真正说服我,因为这不是真的原语。那么原语是否可以具有未定义的行为,但不能使用用户定义的类型?我该如何理解这种方法?如果我不想拥有 dflt ctor 怎么办?
  • @atch:POD 类型没有初始化。一旦存在空间,POD 的生命周期就开始了。
  • 你确定原语是 POD 的吗?我一直坚信 POD 类似于结构,只有数据,没有其他任何东西;
  • @atch:是的,“GMan - 拯救独角兽”很确定,我也是 :)
【解决方案2】:

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

只要确保您没有将没有参数的构造函数声明为私有或受保护。

这是为您创建的示例:

class C
{
};


C c[10];

如果将其设为私有,则会出现编译错误:

class C
{
private:
    C()
    {

    }
};

C c[10];

【讨论】:

    【解决方案3】:

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

    通常,C++ 编译器会自动为您创建默认 ctor。但是,如果您使用参数定义一个 ctor,那么默认 ctor 的自动创建将被禁止,您必须明确编写一个。

    【讨论】:

    • 你可以指定一个值来初始化。
    • @GMan:这是他们在 C++0X 中添加的内容之一吗?做C#这么久了,没跟上....
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多