在C ++中初始化构造函数初始化列表中的char数组

时间:2012-11-03 06:08:46

标签: c++ arrays class initialization-list

可以像这样使用初始化吗?

class Foo
{
public:
   Foo() : str("str") {}
   char str[4];
};

这个?

int main()
{
   char str[4]("str");
}

两个都在gcc 4.7.2中给我一个错误:

  

错误:用作初始化程序的数组

Comeau编译两者。

3 个答案:

答案 0 :(得分:5)

这段代码是有效的C ++ 03,gcc在这里根本不符合。

允许此语法初始化字符数组的语言与允许任何其他类型的语言相同;没有例外会禁止它在字符数组上使用。在这些情况下,()=初始化是等效的,字符数组应该根据8.5.2进行初始化。

Here's确认的gcc错误报告,涵盖了这一点。

答案 1 :(得分:4)

在C ++ 03中,无法按照您的提及初始化非静态成员数组。在g ++中你可以拥有初始化列表的扩展名,但这是一个C ++ 11特性。

函数中的局部变量可以像这样初始化:

char str[] = "str"; // (1)
char str[] = {'s','t','r',0}; // (2)

虽然您可以将维度称为4,但最好未提及以避免意外数组越界。

我建议在两种情况下使用std::string

答案 2 :(得分:2)

在C ++ 03中,这是不可能的。由于非标准扩展,Comeau可能会编译它。

在C ++ 11中,您可以这样做:

Foo() : str({'s','t','r'}) {}       //C++11 only

或者,您可能更喜欢这个内容:

class Foo
{
public:
   Foo() {}
   char str[4] = "str"; //in-class initialization (C++11 only)
};

此外,您可以考虑使用std::stringstd::vector<char>,而不管您使用的C ++版本。