C ++中的对象数组初始化

时间:2016-02-16 22:36:25

标签: c++

我想创建一个对象数组。目前我使用std::string a[10]种语法,但我不确定这是否是最好的做法。

首先,std::string a[10]实际调用构造函数并为10个字符串分配内存吗?我认为std::string a声明a但是没有将对象绑定到它(我可能错了)。那么std::string a[10]呢?

其次,在“宣布''数组通过std::string a[10](如果我没有弄错声明),如何初始化元素?请看下面我的困惑。

这给出了错误:

std::mutex a[100];
for (int i = 0; i<100; i++)
{
    a[i] = std::mutex(); // error;
}

虽然这很好:

std::thread a[100];
for (int i = 0; i<100; i++)
{
    a[i] = std::thread(func, NULL);
}

令我困惑的是,为什么这两个片段会产生不同的结果。第二个片段只是将对象复制到已创建的a[i]吗?如果是这样,我可能会做错事......

2 个答案:

答案 0 :(得分:2)

  

我可能错了

你肯定是错的。你错误地将C ++用于其他语言,可能是Java或C#。

在C ++中,当您说std::string s;时, 一个std::string,它已完全初始化并构建。这也适用于数组类型。

此外,pro-tip:删除C数组并使用std::array代替,它更优越。

至于你的例子之间的区别,它们都是不好的做法,但第一个是非法的,主要是因为mutex是一种不可移动的特殊花,这种情况非常罕见,但在技术上是合法的。对于绝大多数类型(首先都有默认构造函数),你所做的是不好的做法,但应该是允许的。

如果你想在这样的循环中构造对象,你应该看看std::vector<T>然后在循环中使用push_back,因为这样可以避免不必要的默认构造要求和随机的MAX_SIZE常量。

答案 1 :(得分:1)

  

首先,std :: string a [10]是否实际调用构造函数并为10个字符串分配内存?

是。如果要手动初始化实例,请使用指针数组或就地分配(在堆栈上)。

  

第二,在通过std :: string a [10]“声明”数组后(如果我没有弄错声明),如何初始化元素?请看下面我的困惑。

数组元素由no-args构造函数初始化。在代码中,为元素分配不同的值。有些对象允许这样做,有些则不允许。