0

ここで理論上の疑問。本を読んで、次のステートメントが与えられたStringBad metoo = knot;場合:

  • StringBad はクラスです
  • 結び目はそのクラスのオブジェクトです

著者は、コピー コンストラクターに関して次のように述べています。

実装には、このステートメントを 2 つの手順で処理するオプションがあります。コピー コンストラクターを使用して一時オブジェクトを作成し、代入を使用して値を新しいオブジェクトにコピーします。つまり、初期化では常にコピー コンストラクターが呼び出され、= 演算子を使用してフォームが作成されます。代入演算子を呼び出すこともできます。

私の実装では、これを 1 ステップで行います。

  • これと同じように、コピー コンストラクターを使用して metoo オブジェクトを作成します。StringBad metoo(knot);

他の実装では、次のような 2 つのステップでそれを実行できることがわかりました。

  • 次のように、デフォルトのコンストラクターでmetoo オブジェクトを作成します。StringBad metoo;
  • オーバーロードされた割り当て演算子を使用して、ノット オブジェクトを meto オブジェクトに割り当てます。

しかし著者は、初期化は常にコピー コンストラクターを呼び出すと述べています。あれは正しいですか?もしそうなら、コンパイラーがいくつかの実装で2つのステップでそれを行うためにたどるステップは何ですか? ワンステップでテストできると言ったので、私の原因ではテストできませんでした。

4

1 に答える 1

2

著者は間違っています。コピー初期化を伴う宣言ステートメントがあります。これを実現する唯一の方法は、StringBad(StringBad const &)コピーコンストラクターを介して新しいオブジェクトをインスタンス化することです。*この状況では代入演算子が呼び出されることはなく、存在する必要もありません。またはアクセス可能である。

2つのバリアントStringBad metoo = knot;との間にほとんど違いはありませんStringBad metoo(knot);

*)または、それが存在し、一致する場合は、非定数バージョン。

于 2012-08-18T11:59:13.320 に答える