私はこれを個人的な演習として行っていましたが、これが正しく、正しく理解されていることを確認したかったのです。行と列のメンバーを持つ座標クラスがあります。+および+=演算子をオーバーロードしたかったのです。これが私のコードです:
Coordinate& Coordinate :: operator+= (const Coordinate& rhs){
this->m_Row += rhs.m_Row;
this->m_Column += rhs.m_Column;
return *this;
}
Coordinate& operator+ (const Coordinate& lhs, const Coordinate& rhs) {
return Coordinate(lhs) += rhs;
}
どこ
friend Coordinate& operator + (const Coordinate& lhs, const Coordinate& rhs);
Coordinateクラスで定義されたフレンド関数です。
このコードに落とし穴はありますか?
これらがどのように機能するかについての私の理解は次のとおりです。
operator +=
rhs
m_Rowとm_Columnをthis
メンバーに追加します。を返し、reference to the object pointed by this pointer
それによってコピーコンストラクタによる別のオブジェクトの作成を回避します。
operator +
コピーコンストラクターを使用して(定数であり、その内容を変更したくないため)のローカルオブジェクトを作成しますlhs
(これを呼び出します)。追加を実行するメンバー演算子を呼び出します。コピーコンストラクタが原因で別のオブジェクトが作成されないように、を返します。それ以外の場合は。lhs
localObj
+=
localObj
reference to this localObj
ここで、ローカルオブジェクトへの参照を返すため、最後のステートメントが関係します。関数(演算子+)がスコープ外にlocalObj
なるとすぐに破棄され、返される参照は破棄されたオブジェクトを指します。私はこれを理解するのに正しいですか?
もしそうなら、私はそれをどのように修正する必要がありますか?
編集: すべての答えと私が学んだことの後:これが私のCoordinateクラスが今どのように見えるかです:http://rextester.com/MJJI7394