
ユーザー定義のコピー コンストラクターはどのような場合に必要ですか?
C コンパイラーは、メンバーごとに実行されるクラスのコピー コンストラクターを自動的に生成します。デフォルトでコピーします。ただし、特定の状況では、独自のユーザー定義のコピー コンストラクターを定義する必要がある場合があります。
ユーザー定義のコピー コンストラクターを定義する理由:
- ディープコピー: クラスのメンバー変数が、個別にコピーする必要がある動的メモリを割り当てる場合、メンバーごとのコピーでは不十分です。このような場合、ディープ コピーを実行するにはユーザー定義のコピー コンストラクターが必要です。これにより、オブジェクトのメンバー変数の動的メモリの新しいコピーが作成されます。
例:
文字列を格納する次のクラスについて考えてみましょう。
1 2 3 4 5 6 7 | <code class = "cpp" > class Class {
public :
Class( const char* str);
~Class();
private :
char* stored;
};</code>
|
ログイン後にコピー
デフォルトのコピー コンストラクターでは、格納されたメンバーは参照によってのみコピーされるため、コピーの 1 つがコピーされたときに未定義の動作が発生します。破壊されました。これを防ぐために、ディープ コピーを実行するユーザー定義のコピー コンストラクターを定義します:
1 2 3 4 | <code class = "cpp" >Class::Class( const Class& another) {
stored = new char[ strlen (another.stored) + 1];
strcpy(stored, another.stored);
}</code>
|
ログイン後にコピー
さらに、代入演算子がディープ コピーを正しく実行するには、ユーザー定義のコピー コンストラクターも必要です:
1 2 3 4 5 6 | <code class = "cpp" >void Class::operator = ( const Class& another) {
char* temp = new char[ strlen (another.stored) + 1];
strcpy(temp, another.stored);
delete [] stored;
stored = temp;
}</code>
|
ログイン後にコピー
以上がユーザー定義のコピー コンストラクターを C で実装する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。