c++ - 类型是否需要默认构造函数才能声明它的数组?

标签 c++ arrays constructor

我注意到当你声明一个数组时,默认构造函数是必须要用到的。那正确吗? 有没有异常(exception)?

例如,

struct Foo{
Foo(int i  ) {}
};

int main () {
    Foo f[5];
    return 0;
}

上面的代码无法编译。

最佳答案

其他答案都可以,但是,为了完整性:您也可以使用数组初始化语法:

Foo f[5] = {1,2,3,4,5};

如果 Foo 的构造函数不是显式的,这会起作用。如果是,你必须......明确:

Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)};

注意1:这两种情况之间的区别可能并不明显,因此值得注意:第一种情况下,数组元素直接由初始化列表中的 int,通过调用 Foo(int) 构造函数。在第二种情况下,初始化列表由使用 explicit Foo(int) 构造函数构造的 Foo 组成,数组元素是复制构造的来自初始化列表中的元素。因此,在后一种情况下需要 Foo 的复制构造函数。

[1] 感谢 MSalters 的评论。

关于c++ - 类型是否需要默认构造函数才能声明它的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231414/

相关文章:

c++ - 在 C++ 中声明变量而不指定其数据类型

c++ - 如何更改 Qt qtableWidget 项目的间距

javascript - 无法读取自定义原型(prototype)中数组未定义的属性 'push'

c++ - 在不使用单独的 typedef 的情况下声明函数指针数组的语法是什么?

c++ - MSVC2015 初始化应保持未初始化的类成员

scala - 我需要一个具体示例,说明如何在不可变 _case_ 类的主构造函数中定义局部参数

javascript - 在 JavaScript 的命名空间中存储可重用常量

c++ - 如何在 ROOT (CERN) 中禁用屏幕输出

c++ - boost::atomic 编译问题

PHP foreach 替换数组内的值