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。那么为什么这个函数不作空,因为x和y可以被该函数访问。返回的内容*这意味着,我知道这是调用该函数的对象的地址,因此*这将是函数本身,但是如果我们返回一个对象,则需要将其分配给某个位置,例如前面的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类型允许链接。
我不仅想知道如何编程,因为面向对象主要是通过模式(必须这样写,如果需要这样的话)来写,而这与必须使用逻辑的结构化编程相反,而且还想知道为什么是这样。和平定义的代码,以及为什么它不是我直觉认为应该的(尽管我只学习编程大约一年)。
谢谢!
那么为什么这个函数不作空,因为x和y可以被该函数访问。返回什么*这意味着
由于operator=()
声明了返回引用,因此return *this;
返回对当前对象的引用。这使我们可以链接赋值运算符。例如,
a = b = c;
将调用b.operator=(c);
并返回对的引用b
。然后a
由一个等效于的呼叫分配a.operator=(b)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句