2012-09-02 64 views
2

我试图找出为什么这个代码工作(尤其是“价格”部分)是什么意思是左操作数?

struct CarType 
{ 
    string maker; 
    int year; 
    float price; 
    bool operator > (carType car) 
    { 
     if (price > car.price) 
      return true; 
     else return false; 
    } 
}; 

它说:“我们不穿心莲一个myCar.price,因为myCar是左操作数”。那是什么意思?我写在另一个.h文件中:

bool operator > (Fraction a, Fraction b) 
{ 
    if (a.numerator*b.denominator > b.numerator*a.denominator) return true; 
    else return false; 
} 

看看我如何通过2个分数结构?我不知道为什么“myCar”只需传递一个CarType数据结构或解释的含义。有人可以请赐我吗?谢谢!

回答

1

CarType是一个结构体。它包含有关汽车的信息。假设它已被正确初始化,它已经设置了maker,yearprice的值。

bool operator > (carType car)CarType的会员运营商。当成员操作符>被调用时,它将从/左侧的对象调用,就像函数一样。如果你在里面CarType一个函数调用myFunction,你会这样称呼它:

myCar.myFunction(); 

而且,它还将在已经设置里面myCar的数据进行操作,对不对?这与运营商一样。当您为CarType创建>经营者,你怎么称呼它是这样的:

myCar > otherCar 
用if或东西周围

可能,但问题的立场。由于myCar位于>运算符的左侧,因此它是左操作数。在myCar上调用>,并将otherCar作为右手变量传入。操作员只是让事情看起来更漂亮;在这种情况下,您的>的功能是一样的,如果你写这个函数内部CarType

bool isGreaterThan (carType car) 
{ 
    if (price > car.price) 
     return true; 
    else return false; 
} 

然后这个函数会被称为是这样的:

myCar.isGreaterThan(otherCar); 

在这种情况下,很明显发生了什么事,对吧? myCar是函数被调用的对象; otherCar是它正在比较的车。当您使用操作员时,它是相似的;这意味着左边的操作数正在调用该函数,并且右边的操作数被传入。重载操作符使得代码简单易读,并且提供了灵活性(即,有一些数据结构现在将根据您的操作符执行排序,他们不能这样做,如果你决定用isGreaterThan功能定义平等

我希望这清除了你的困惑。请让我知道是否有其他任何你想我解释

0

第一个operator>CarType的成员,因此调用它的实例是左操作数。第二个operator>不是任何东西的成员,所以必须指定左操作数。

2

!如果你写operator>作为一个自由函数(不是类的成员),那么你需要两个操作数。

如果您将其编写为成员函数,那么您仍然有两个操作数,但其中一个是隐藏的this操作数。 (请记住,当你调用一个非静态成员函数,你调用它的类的具体实例。)

它可以帮助您了解,如果我把隐this->

bool operator > (carType car) 
{ 
    if (this->price > car.price) 
     return true; 
    else return false; 
} 

这也意味着你可以比较汽车这样的,如果你想:

CarType one, two; 
if (one.operator>(two)) // same as if (one > two) 
{ 
    // some code... 
} 
+0

我认为使用显式'经营者>'使之更清楚,好主意:) – lccarrasco

1

三点:

  1. 按值传递参数很昂贵,因为必须复制所有数据成员。
  2. 由于比较不会改变对象,所以应该在代码上撒上const
  3. if (expr) return true; else return false;总是可以被简化为return expr;

修改后的代码:

bool operator>(const carType& car) const 
{ 
    return price > car.price; 
} 

bool operator>(const Fraction& a, const Fraction& b) 
{ 
    return a.numerator*b.denominator > b.numerator*a.denominator; 
}