ホームページ > バックエンド開発 > C++ > C で既存のオブジェクトに代入するときにコピー コンストラクターが呼び出されないのはなぜですか?

C で既存のオブジェクトに代入するときにコピー コンストラクターが呼び出されないのはなぜですか?

DDD
リリース: 2024-12-08 09:22:11
オリジナル
572 人が閲覧しました

Why Isn't the Copy Constructor Called When Assigning to an Existing Object in C  ?

既存のオブジェクトに新しい値を割り当てるときにコピー コンストラクターがバイパスされる理由

提供されたコード スニペットでは、オブジェクト 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート