クラス CVector での演算子のオーバーロード:
CVector CVector::operator+ (CVector param) {
CVector temp;
temp.x = x + param.x;
temp.y = y + param.y;
return (temp);
}
そして主に:
CVector a (3,1);
CVector b (1,2);
CVector c;
c = a + b;
したがって、オブジェクトが値渡しされ、別の一時オブジェクトが作成されます。b は値渡しされていると思います。a は + を呼び出しているため、x と y は a に属し、pram.x と param.y は b に属しています。temp が返され、コピー代入演算子が temp の値を c? に渡します。
しかし、これはどうですか:
CVector& CVector::operator= (const CVector& param)
{
x=param.x;
y=param.y;
return *this;
}
そして主に:
a=b;
再び a は = を呼び出し、b は const として参照によって渡されます (この場合、値によって渡されたかどうかは問題になりますか?) ここで混乱します。この関数は x と y にアクセスできるので、なぜこの関数は void ではないのでしょうか。*これが返すものは、これが関数を呼び出すオブジェクトのアドレスであることを知っているので、*これは関数自体になりますが、オブジェクトを返す場合は、前の c=temp のような場所に割り当てる必要がありますtemp=a+b の後? そして、CVector& は何を意味するのでしょうか? CVector 型のオブジェクトのアドレスを期待しているようには見えませんか?
言い換えれば、なぜ関数だけではないのですか:
void CVector::operator= (const CVector& param)
{
x=param.x;
y=param.y;
}
??
次に、このコードがあります
#include <iostream>
using namespace std;
class Calc {
private:
int value;
public:
Calc(int value = 0) { this->value = value; }
Calc& Add(int x) { value += x; return *this; }
Calc& Sub(int x) { value -= x; return *this; }
Calc& Mult(int x) { value *= x; return *this; }
int GetValue() { return value; } };
int main() {
Calc cCalc(2);
cCalc.Add(5).Sub(3).Mult(4);
cout << cCalc.GetValue();
return 0;
}
関数から & を削除すると、次のようになります。
Calc Add(int x) { value += x; return *this; }
Calc Sub(int x) { value -= x; return *this; }
Calc Mult(int x) { value *= x; return *this; }
と使用
Calc cCalc(2)
cCalc.Add(5);
cCalc.Sub(3);
cCalc.Mult(4);
前者の代わりに、同じ結果が生成されます。では、なぜ Calc& returne 型で連鎖が許可されるのでしょうか。
オブジェクト指向は、ロジックを使用しなければならない構造化プログラミングとは対照的に、多くの場合パターン (これはこのように記述され、これが必要な場合はこれが必要です) によって記述されるため、プログラミング方法を知りたいだけでなく、なぜコードの平和をそのまま定義し、直感的にそうあるべきだと思っていない理由 (ただし、プログラミングを学ぶのは約 1 年だけですが)。
ありがとう!