既存のオブジェクトに新しい値を割り当てるときにコピー コンストラクターがバイパスされる理由
提供されたコード スニペットでは、オブジェクト a は次のように初期化されます。値は 5 です。標準の A コンストラクターが期待どおりに呼び出されます。ただし、想定に反して、新しく構築されたオブジェクトを割り当てるときに、コピー コンストラクターは呼び出されません。
この動作は、コンパイラの最適化の結果でも、言語仕様の省略でもありません。これは C 標準 (§12.8.15、211 ページ) に明示的に文書化されています。標準では、次の代入が意味的に同等であることは「完全に許容される」と述べています:
T = x; T(x);
論理的には、T(T(x)) のような冗長な代入はコード最適化から削除できることになります。 。したがって、コンパイラーは、デフォルトのコンストラクターを自動的に呼び出して a を初期化し、新しく構築されたオブジェクトを直接割り当てます。
コピー コンストラクターを強制的に呼び出すには、代入する前に a を明示的にデフォルトで構築する必要があります。
A a; // Default-construct 'a' // Copy constructor will be called to // copy data from the newly constructed object. a = A(5);
以上がC で既存のオブジェクトに代入するときにコピー コンストラクターが呼び出されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。