代入演算子関数の戻り値の型の詳細説明

C ++代入演算子関数の研究では、戻り値の型の問題は非常に不可解でしたが、今日、さまざまな戻り値の型それぞれの結果を完全に要約します。

1.戻り値が空の場合:

<span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span>


このとき、 '='(a = b)演算が1つしかない場合は問題ありませんが、 '='(a = b = c)の連鎖演算がある場合、コンパイラーはエラーを報告します

わかります:a = b = c;

プログラムは最初にb = cを実行します。

関数の戻り値はviodなので、b = cこの操作はNULLを返します

そして、これはa =(b = c)、つまりa = NULLです。この種の操作は存在しません。存在しても、この操作の本来の意図を満たしていません。


2.戻り値がクラス自体の場合:

<span style="font-size:14px;">hasptr hasptr::operator=(const hasptr& s)</span>


'='チェーン操作をサポート

戻り値がクラス自体の場合、この関数の実行中のプロセスは次のとおりです。

                      1.関数を入力し、関数内で操作を実行します

                      2.関数内の操作が完了したら、クラスのコピーコンストラクターを呼び出して、オブジェクトを新しいオブジェクトにコピーします。

                      3.新しく作成したオブジェクトに戻ります


ここで重要なのは、代入演算子関数が実行されるたびに、コピーコンストラクターが呼び出されることです。これは時間を浪費するだけではありません。

クラスにコピーコンストラクターがない場合、エラーが発生することがあります。


3.戻り値が参照の場合

<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)</span>


この方法は、チェーン操作をサポートし、操作時間も最小限に抑えるのに最適です。



完全なコード:

<span style="font-size:14px;">hasptr &hasptr::operator=(const hasptr& s)
{
    i = s.i;
    string *x = new string(*s.ps);
    delete ps;
    ps = x;
    return *this;
}</span>


190件の元の記事を公開 19件の賞賛 200,000回以上の閲覧

おすすめ

転載: blog.csdn.net/zengchenacmer/article/details/38351385