算子类CVector重载:通过类函数返回引用并返回C++中的整个对象?
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;
再次被调用=和B被引用为const传递(在这种情况下,它的问题。如果它是按值传递的?)这是我感到困惑的地方,属于a的x被赋值为be的param.x。那么为什么这个函数不是void,因为这个函数可以访问x和y。什么是return *这意味着,我知道这是调用函数的对象的地址,所以*这将是函数本身,但是如果我们要返回一个对象,我们需要将它分配到某处,如前面的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 &返回类型允许链接。
我不仅要知道如何编程,因为面向对象是多用书面方式(这是这样写的,这是需要如果)不是结构化编程,你必须使用逻辑,也能知道为什么代码的和平是这样定义的,为什么它不是我直觉上认为它应该是的(虽然我只学习了大约一年的编程)。
谢谢!
这样你可以连锁分配a = b = c; – jcoder
首先b得到c的值,然后a得到那些值。第一个b用参数c调用它的void operator =函数,然后用参数b调用它的void。为什么不? – STEFS
因为'a = b = c'是'a =(b = c)',所以当用户定义'operator ='时,是'a.operator =(b.operator =(c))'。如果'b.operator =(c)'的返回类型是'void',哪一个不会起作用。 (一个更相关的问题是为什么它返回一个非const引用,而不是一个const引用。) –