我正在阅读the C++ FAQ。我在指南中找到了操作符重载使用的一点:
如果你提供了建设性的操作符,它们应该允许提升左操作数(至少在类有一个没有用explicit关键字标记的单参数ctor的情况下)。例如,如果您的类Fraction支持从int到Fraction的提升(通过非显式ctor :: Fraction(int)),并且如果允许x-y用于两个Fraction对象,则还应允许42-y。 在实践中,这仅仅意味着您的operator-()不应该是Fraction的成员函数。通常你会把它变成朋友,如果没有其他原因而不是强迫它进入公众:课程的一部分,但即使它不是朋友,它也不应该是会员。
为什么作者写过operator-()不应该是成员函数?
如果我将operator-()作为成员函数以及其他后果会有什么不良后果?
答案 0 :(得分:16)
以下是Fraction
,其中运算符为成员函数:
class Fraction
{
Fraction(int){...}
Fraction operator -( Fraction const& right ) const { ... }
};
有了它,这是有效的代码:
Fraction x;
Fraction y = x - 42;
及其等同于x.operator-( Fraction(42) )
;但事实并非如此:
Fraction z = 42 - x;
因为42
中没有成员函数operator -
(当然,它甚至不是一个类)。
但是,如果将运算符声明为自由函数,则转换运算适用于它的两个参数。所以这个
Fraction z = 42 - x;
变成这个
Fraction z = Fraction(42) - x;
相当于operator-( Fraction(42), x )
。