C++の自明でないコンストラクタとは何ですか?
質問
私はこれを読んでいました http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_data
つまらないデフォルトコンストラクタ、つまらないコピーコンストラクタ、コピー代入演算子、つまらないデストラクタについて言及されています。何がトリビアルで何がトリビアルでないのでしょうか?
どのように解決するのですか?
簡単に言うと、quot;trivial" 特殊メンバ関数は、文字通り、非常に簡単な方法でその仕事をするメンバ関数を意味します。この単純な方法とは、特殊メンバ関数の種類によって異なることを意味します。
デフォルトのコンストラクタとデストラクタの場合、"trivial" は文字通り "do nothing at all" を意味します。コピーコンストラクタとコピー代入演算子については、"trivial" とは、文字通り "be equivalent to simple raw memory copying" (like copy with memcpy
).
コンストラクタを自分で定義すると、何もしなくても非自明とみなされるため、自明なコンストラクタはコンパイラが暗黙的に定義する必要があります。
特殊なメンバ関数が上記の要件を満たすためには、クラスが非常に単純な構造でなければならず、オブジェクトが生成または破壊されるときに隠れた初期化を必要としたり、コピーされるときに隠れた追加の内部操作を必要としたりしてはならないのです。
例えば、クラスが仮想関数を持つ場合、このクラスのオブジェクトが作成されるときに、いくつかの隠された初期化(仮想メソッドテーブルの初期化など)を必要とするので、このクラスのコンストラクタは単純なものとは認められません。
別の例として、クラスが仮想ベースクラスを持つ場合、このクラスの各オブジェクトは、まさに同じオブジェクトの他の部分を指す隠しポインタを含むかもしれません。このような自己参照オブジェクトは、単純な生のメモリコピールーチン (
memcpy
). コピーの隠れポインタを適切に再初期化するために、余分な操作が必要になります。この理由から、このクラスのコピーコンストラクタとコピー代入演算子は、些細なこととして認定されません。
明らかな理由により、この要件は再帰的です。クラスのすべてのサブオブジェクト (ベースと非静的メンバー) はまた、トリビアルなコンストラクタを持たなければなりません。
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない