我试图理解超载运营商,而且我一直盯着这看的时间超过了我想承认的时间。我相信我理解了类中的所有内容,除了运算符+成员。我试图用可用的大量信息来教自己,但是我无法找到任何可以向我解释我在这里看到的信息 - 如果我能相信我是坚定的信徒了解一些有效的方法然后我可以更好地使用它。
因此,大多数情况下,我的困惑在于编译器如何知道要选择哪个temp变量。 (temp.x或temp.y)我意识到main()要求c.x和c.y,但是operator +似乎正在返回尚未定义的东西。没有三元运算符或任何会让它选择返回的运算符。
#include <iostream>
using namespace std;
class CVector {
public:
int x,y;
CVector () {};
CVector (int,int);
CVector operator + (CVector);
};
CVector::CVector (int a, int b) {
x = a;
y = b;
}
CVector CVector::operator+ (CVector param) {
CVector temp;
temp.x = x + param.x;
temp.y = y + param.y;
return (temp);
}
int main () {
CVector a (3,1);
CVector b (1,2);
CVector c;
c = a + b;
cout << c.x << "," << c.y;
return 0;
}
答案 0 :(得分:3)
所以,大多数情况下,我的困惑在于编译器如何知道哪些 要选择的临时变量。
我真的不明白你的意思。编译器没有选择要返回的temp变量。 temp
是CVector
类型的对象。它包含两个数据成员x
和y
。当使用以下行创建temp
时,这些成员作为CVector temp;
的一部分存在:
return temp;
然后,当你这样做时:
x
编译器无需选择。它返回整个对象,包括一个复合对象中的y
和c = a + b;
。
在你的主要功能中,这一行:
operator+
在a
和b
上致电temp
。然后将返回值(operator=
)分配(c
)到temp
。由于您尚未定义自定义赋值运算符,因此默认运算符会启动,这只是从c
到temp.x
的成员分配。因此,c.x
已分配给temp.y
,c.y
已分配给CVector & CVector::operator=(const CVector & rhs)
{
this->x = rhs.x;
this->y = rhs.y;
return *this;
}
。
对于您的类,默认赋值运算符看起来像(或具有相同的操作语义),如果它被写出来:
{{1}}
答案 1 :(得分:1)
实现运算符(+)本质上只是一个实例方法。
temp.x = x + param.x;
temp.y = y + param.y;
return (temp);
这里是指定'x'和param.x的实例值之和。 想象一下它被称为:
CVector a (3,1);
CVector b (1,2);
CVector c;
c = a.+(b);