做左操作数意味着什么

What does it mean to be the left operand?

本文关键字:什么 意味着 操作数      更新时间:2023-10-16

我试图弄清楚为什么这个代码能工作(特别是"价格"部分)

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数据结构,也不知道解释是什么意思。有人能启发我吗?谢谢

如果将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...
}

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

CCD_ 8是CCD_。当调用成员运算符>时,它是从/由左边的对象调用的,就像函数一样。如果你在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函数定义相等,它们就无法执行。

我希望这能澄清你的困惑;如果你还想让我解释什么,请告诉我!

三点:

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

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