ビット単位のコピーセマンティクス



Bitwise Copy Semantics



ビット単位のコピーセマンティクス(ビット連続コピー)

#include 'Word.h' Word noun('book') void foo() { Word verb = noun; ... }

Wordで明示的なコピーコンストラクターが定義されていない場合、インスタンスの合成があるかどうかコンパイラーが呼び出されますか?この単語は、展示物の「ビット単位のコピーセマンティクス」がそうであるかどうかを確認します。



// The following statement demonstrates the bitwise copy semantics class Word { public: Word(const char*) ~Word(){ delete [] str} //... private: int cnt char* str }

この場合、上記のステートメントは「デフォルトのコピーセマンティクス」を示しているため、デフォルトのコピーコンストラクターを合成する必要はなく、動詞の初期化操作で関数呼び出しを終了する必要はありません。ただし、ローカルオブジェクトの動詞とグローバルオブジェクトの名詞は同じ文字列を指します。 foo()を終了する前に、ローカルオブジェクト動詞はデストラクタを実行するため、文字列が削除され、この時点からグローバルオブジェクト名詞が無意味なものの束になります。メンバーstrの問題は、「クラスデザイナから明示的なコピーコンストラクタを取得してデフォルトのメンバーごとの初期化をオーバーライドする」か、「完全なコピーを許可しない」にのみ依存できます。

// The following statement did not show bitwise copy semantics class Word { public: Word(const String&) ~Word() //... private: int cnt String str // string declares an explicit copy constructor: String (const String &) }

この場合、コンパイラは、次のコピーコンストラクタメンバークラスStringオブジェクトを呼び出すために、コピーコンストラクタを合成する必要があります。

// out of a synthesized copy constructor C ++ pseudocode inline Word::Word(const Word& wd) { str.String::String(wd.str) cnt = wd.cnt }

注目に値するのは、これはコピーコンストラクターで整数、ポインター、配列などとして合成されることです。同じことを期待しているので、noonclassメンバーもコピーされます。