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>