6

このような初期化を使用しても問題ありませんか?

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

この?

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

どちらもgcc 4.7.2でエラーを出します:

エラー: 初期化子として配列が使用されました

コモーは両方をコンパイルします。

4

3 に答える 3

5

C++03 では、おっしゃる通り、非静的メンバー配列を初期化できません。g++ では、初期化子 listの拡張機能を使用できる場合がありますが、これは C++11 の機能です。

関数内のローカル変数は、次のように初期化できます。

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

次元を として言及することはできますが、境界外の偶発的な配列を避けるために言及しない4方がよいでしょう。

std::string両方の場合に使用することをお勧めします。

于 2012-11-03T06:13:14.523 に答える
3

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)
};

また、使用している C++ のバージョンに関係なく、std::stringまたは使用することを検討することもできます。std::vector<char>

于 2012-11-03T06:19:13.850 に答える