ホームページ > バックエンド開発 > C++ > C のコピー代入演算子から値ではなく参照を返すのはなぜですか?

C のコピー代入演算子から値ではなく参照を返すのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-15 16:47:08
オリジナル
884 人が閲覧しました

Why Return a Reference, Not a Value, from a C   Copy Assignment Operator?

コピー代入演算子で参照によって返す: 複雑な概念が明らかに

C のコピー代入演算子から参照を返す概念は次のようになります。困惑するでしょう。新しいオブジェクトのコピーを単純に返さないのはなぜでしょうか?この謎を解明するために、クラス A とその代入演算子を含む例を詳しく調べてみましょう。

class A {
public:
    A(int param);
    A& operator=(const A& a);

private:
    int param;
};

int main() {
    A a1(10);
    A a2 = a1;
    A a3;

    a3 = a2; // The problematic line
}

A::A(int param) : param(param) {}

A& A::operator=(const A& a) {
    if (this == &a) {
        return *this;
    }
    param = a.param;
    return *this;
}
ログイン後にコピー

最初は、代入演算子から値を返すことが実行可能なオプションのように思えます。ただし、このコンテキストで値によって返すと、いくつかの欠点が生じます。代入演算子を呼び出すたびに、コンストラクターとデストラクターの両方が呼び出されます。次の代入チェーンを考えてみましょう:

a = b = c;
ログイン後にコピー

値を返すと、このチェーンは代入演算子への 2 つの呼び出し、コピー コンストラクターへの 2 つの呼び出し、およびデストラクターへの 2 つの呼び出しをトリガーします。この無駄なプロセスは不要なリソースを消費し、目に見えるメリットはありません。

対照的に、参照による戻りはオーバーヘッドを大幅に最小限に抑えます。値は、追加のコンストラクターまたはデストラクターの呼び出しを必要とせずに、あるオブジェクトから別のオブジェクトにコピーされます。この最適化は、複数の代入が発生する複雑なシナリオでは特に重要です。

要約すると、コピー代入演算子での値による戻りに​​は何の利点もありませんが、重大なパフォーマンスの低下が生じます。対照的に、参照によって返すと、オペレーターの機能を維持しながらリソースを効率的に使用できます。

以上がC のコピー代入演算子から値ではなく参照を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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