2013-10-08 35 views
1

我想了解重载操作符,我一直盯着这个比我想承认的时间更长。我相信,除了运营商+成员之外,我理解课上的所有内容。我试图用大量的可用信息来教自己,但我找不到任何信息向我解释我在这里看到的情况 - 而且我坚信如果我明白事情如何,那么我可以使用它更好。如何在未定义的情况下返回值?

所以,大多数情况下,我的困惑在于编译器如何知道要选择哪个温度变量。 (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; 
} 
+1

它没有返回'temp.x'或'temp.y',它返回'temp'。 –

+0

对,我明白这一点。我会换个话。它如何返回温度?在我看来,温度还没有值得回报。我预计我会看到类似于: return(temp = x?temp.x:temp。Y); – Scott

+0

您认为它没有价值吗? – drescherjm

回答

3

所以,大多数情况下,我的困惑在于编译器是如何知道临时的 变量选择哪个。

我真的不明白你的意思。编译器没有选择要返回的临时变量。 tempCVector类型的对象。它包含两个数据成员,xy。当它与该行建立这些成员的temp一部分而存在:

CVector temp; 

然后,当你这样做:

return temp; 

没有什么编译器来选择。它将返回整个对象,其中包括xy在一个复合对象中。

在你的主要功能,这一行:

c = a + b; 

呼吁operator+ab。然后将返回值(temp)分配给(operator=)至c。由于您尚未定义自定义赋值运算符,因此默认赋值运算符会进行运算,该赋值运算符只是执行从tempc的成员赋值。因此,temp.x被分配给c.x,而temp.y被分配给c.y

为您的类,默认的赋值运算符会是什么样子(或具有相同的操作语义来)这一点,如果它被写出来:

CVector & CVector::operator=(const CVector & rhs) 
{ 
    this->x = rhs.x; 
    this->y = rhs.y; 
    return *this; 
} 
+0

这非常有帮助,是否有默认的外观语法? – Scott

+0

@Scott:你走了。 –

+0

你是男人!非常感谢,我今天花了无数个小时试图理解这一点。一旦我得到15代表将投票。 – Scott

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); 
相关问题