2017-05-17 27 views
-1

の一部である値の配列によってコピーには、次のC++のstruct考える:C/C++ - 構造体

void do_something(const Person& p) { 
    Person person_copy = p; 
} 

質問です:

typedef struct Person { 
    std::string name; 
    std::string children[MAX_NUM_CHILDREN]; 
} Person; 

質問は次のシナリオでは何が起こるか、です実際にはタイプstd::string*のメンバーである配列がpであるかどうかは、ポインタとしてコピーされるか、children配列内のすべての文字列がコピーコンストラクタを使用して値によってコピーされますか?

+3

C++で 'struct'を' typedef'する必要はありません。 'struct Person {...};'で十分です。 –

答えて

4

[...]実際タイプstd::string*のメンバーであるpchildrenアレイ、[...]

childrenMAX_NUM_CHILDREN文字列ではなく、ポインタのアレイです。すべての要素はPersonのコピーコンストラクタによってperson_copy.childrenにコピーされます。

0

この例では配列が崩壊してコンテンツがコピーされるとは思われません。

T[]T*は異なっているが、T[]は(あなたは、配列減衰ルールを探すことができます)T*に減衰することができます。

あなたPerson構造体は、そのように宣言する必要があります。

短くだとそれはC++の方法だ
struct Person { 
    std::string name; 
    std::string children[MAX_NUM_CHILDREN]; 
}; 

ところで、これは割り当ての初期化であるため、コピーコンストラクタが呼び出されますが、Person p(p2);(またはPerson p{p2}とC++ 11互換コンパイラ)初期化フォームを使用する方が良いでしょう。

+0

「この例では配列が崩壊するとは思わない」もちろん、そうはならない。オブジェクト内の配列が宣言時にポインタに壊れた場合、C/C++は役に立たなくなります。崩壊は、生の配列を関数に渡すときの典型的な変換の場合を含め、ポインタに代入する場合にのみ発生します。 –

+0

いいえ、 '' Person''を関数に渡すと減衰する可能性があります( '' std :: array''を使う方が良いと思います。 (CとC++には奇妙なコーナーケースがあるので、驚いたことはありません) – nefas

+0

ベア配列は、渡された他のオブジェクトの一部ではなく、直接命名されたときにのみ崩壊できます。再び、後者は言語を不条理にするでしょう。 –