コピー代入演算子で参照によって返す: 複雑な概念が明らかに
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 サイトの他の関連記事を参照してください。