我试图弄清楚为什么这段代码有效(特别是“价格”部分)
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数据结构或解释意味着什么。有人可以赐教吗?谢谢!
答案 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
是一个结构。它包含有关汽车的信息。假设它已正确初始化,它已设置maker
,year
和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
是与之比较的汽车。使用运算符时类似;这意味着左操作数正在调用函数,右操作数被传入。重载操作符使代码简单易读,并提供了灵活性(即有一些数据结构现在可以根据你的{{{{ 1}}运算符,如果您决定使用>
函数定义相等性,则无法执行此操作。
我希望这可以解决你的困惑;如果您还有其他任何想要我解释的内容,请告诉我。
答案 2 :(得分:1)
三点:
const
。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;
}
答案 3 :(得分:0)
第一个operator>
是CarType
的成员,因此调用它的CarType
实例是左操作数。第二个operator>
不是任何内容的成员,因此必须指定左操作数。