2

こんにちは、私は C++ を学ぶのが初めてで、簡単な質問があります。

5 つの構造体を含む配列を作成している場合、構築時に以下に示すように配列をクリアするか、宣言したときのままにしておく必要があります。

言い換えれば、次のようなことをしています

person a[5];

for(int i = 0; i < 5; i++)
{
    a[i].name= "";
    a[i].value= 0; 
}

このようなことをするのと同じですが、基本的に後でこれらをループしてこれらの値を設定することに注意してください。

person[5];
4

7 に答える 7

3

いいえ、あなたはしません。必要なのは、適切なデフォルトコンストラクターですperson

于 2013-03-14T16:41:01.573 に答える
3

またはpersonであると仮定して、 のデフォルト コンストラクタを記述するだけです。各配列要素を自動的に初期化するために呼び出されます。structclass

一般に、おそらく代わりに使用することを好むはずstd::vector<person>ですが、確かに言うのに十分なコンテキストが与えられていません.


デフォルトのコンストラクタは次のようになります (これstd::stringには独自のデフォルト コンストラクタがあるため、何もする必要はありません)。

struct person {
    std::string name;
    int value;

    person() : value(0) {}
};

今これ:

person a[5];

それ以上の努力なしで適切に初期化されます。


とにかく後で要素を「適切に」初期化することを計画している場合は、ベクターを使用すると、無駄なダミーの初期化を簡単にスキップできます。

struct person {
    std::string name;
    int value;

    person() : value(0) {}
    person(std::string const &n, int v) : name(n), value(v) {}
};

std::vector<person> people;
people.reserve(5);
// just create each person with the right values in the first place:
for (int i = 0; i < 5; ++i) {
    people.push_back(person(get_name(i), get_value(i)));
}

最後に、初期化されていないメモリがあっても構わない場合は、最初のバージョン (コンストラクターもループもなし) で問題ありません。ただし、どの要素/メンバーが有効でどれがガベージかを見失うことは、バグの肥沃な原因であることに注意してください。

于 2013-03-14T16:41:16.640 に答える
2

静的ストレージ期間を持つPODタイプのみが、作成時にゼロ初期化されます。ただし、初期化されていない変数を使用すると未定義の動作が発生するため、冗長である可能性がある場合でも、変数を明示的に初期化することをお勧めします。

ただし、ループで初期化するのではなく、デフォルトのコンストラクターを定義することをお勧めします。これにより、インスタンスのperson構築時にインスタンスのデータメンバーが初期化されます。

struct person
{
    person() : value(0) { }

    std::string name;
    int value;
}

また、などのSTLコンテナを使用する方が、 Cスタイルの配列std::vectorを使用するよりもはるかに優れていることに注意してください:)

于 2013-03-14T16:44:47.673 に答える
2

ベクトルを使用できない理由はありますか? それは彼らの C++ の方法であり、その方がはるかに簡単で、バグが発生する可能性が低くなります。次に例を示します。

 #include <vector>

 std::vector<person> a ;

 a.push_back( person(...) ) ;

また、前述のように、配列を使用する必要がある場合personは、後で初期化する必要がないことを保証するためにデフォルトのコンストラクターを用意してください。例えば:

class person
{
   public:
     person() : value(0) {...} // default constructor
}; 
于 2013-03-14T16:41:11.397 に答える
2

前述のように person[5] は 6 番目の位置です

C++ では配列を使用せず、代わりにベクトルを使用します

于 2013-03-14T16:41:21.970 に答える
0

配列を宣言する最初の行で、既定のpersonコンストラクターが 5 回 (配列の要素ごとに 1 回) 呼び出されます。personコンストラクターが要素nameと要素を適切な値に初期化する場合value、ループは必要ありません。

于 2013-03-14T16:41:40.897 に答える
0

いいえ、それらは同じではありません。

最初の例では:

person a[5];

タイプ person の、長さ 5 の配列を宣言しています。

ただし、これは次のとおりです。

person[5]

これは無効です - 変数名がなく、割り当てられるものも、後でループできるものもありません。

于 2013-03-14T16:41:53.210 に答える