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 个 Fraction 结构的?我不确定为什么“myCar”只需要传递一个 CarType 数据结构或解释的含义。有人可以启发我吗?谢谢!

4

4 回答 4

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...
}
于 2012-09-02T01:58:20.647 回答
1

Three points:

  1. Passing the parameter(s) by value is expensive, because all the data members have to be copied.
  2. Since the comparison does not alter the objects, you should sprinkle const on your code.
  3. if (expr) return true; else return false; can always be simplified to return expr;

Modified code:

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;
}
于 2012-09-03T08:39:04.847 回答
1

CarType是一个结构。它包含有关汽车的信息。假设它已正确初始化,它已为makeryear和设置了值price

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函数定义相等性,他们就无法做到这一点。

我希望这能消除您的困惑;如果您还有什么需要我解释的,请告诉我!

于 2012-09-02T01:56:25.717 回答
0

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

于 2012-09-02T01:54:01.053 回答