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