左操作数是什么意思?

时间:2012-09-02 01:48:01

标签: c++ operator-overloading

我试图弄清楚为什么这段代码有效(特别是“价格”部分)

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 个答案:

答案 0 :(得分: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...
}

答案 1 :(得分:1)

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

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是与之比较的汽车。使用运算符时类似;这意味着左操作数正在调用函数,右操作数被传入。重载操作符使代码简单易读,并提供了灵活性(即有一些数据结构现在可以根据你的{{{{ 1}}运算符,如果您决定使用>函数定义相等性,则无法执行此操作。

我希望这可以解决你的困惑;如果您还有其他任何想要我解释的内容,请告诉我。

答案 2 :(得分:1)

三点:

  1. 按值传递参数非常昂贵,因为必须复制所有数据成员。
  2. 由于比较不会改变对象,因此您应该在代码上添加const
  3. if (expr) return true; else return false;始终可以简化为return expr;
  4. 修改后的代码:

    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;
    }
    

答案 3 :(得分:0)

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