Vector 类中的运算符重载:
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 通过引用传递。(在这种情况下,如果它是按值传递,那么重要吗?)这就是我感到困惑的地方,属于 a 的 x 被分配了 be 的 param.x 。那么为什么这个函数不是 void,因为 x 和 y 可以通过这个函数访问。 return *this 意味着什么,我知道这是调用函数的对象的地址,所以 *this 将是函数本身,但是如果我们返回一个对象,我们需要将它分配给之前的 c=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 返回类型允许链接。
我不仅想知道如何编程,因为面向对象很大程度上是通过模式编写的(这是这样写的,如果需要的话),而不是必须使用逻辑的结构化编程,而且还想知道为什么是一个代码的和平定义,以及为什么它不像我直觉认为的那样(尽管我只学习了大约一年的编程)。
Thanks!