C++ 重载运算符-()作为自由函数的意义&;不是成员函数?

C++ 重载运算符-()作为自由函数的意义&;不是成员函数?,c++,operator-overloading,C++,Operator Overloading,我在看书。在这里,我发现操作员重载使用指南中有一点: 如果提供构造运算符,则应允许提升左侧操作数(至少在类具有未标记为explicit关键字的单参数ctor的情况下)。例如,如果您的类分数支持从int升级到分数(通过非显式的ctor分数::分数(int)),并且如果您允许两个分数对象使用x-y,那么还应该允许42-y在实践中,这仅仅意味着您的运算符-()不应该是分数的成员函数。通常情况下,你会让它成为朋友,如果没有其他原因,只是为了强迫它公开:成为班级的一部分,但即使它不是朋友,也不应该成为会员

我在看书。在这里,我发现操作员重载使用指南中有一点:

如果提供构造运算符,则应允许提升左侧操作数(至少在类具有未标记为explicit关键字的单参数ctor的情况下)。例如,如果您的类分数支持从int升级到分数(通过非显式的ctor分数::分数(int)),并且如果您允许两个分数对象使用x-y,那么还应该允许42-y在实践中,这仅仅意味着您的运算符-()不应该是分数的成员函数。通常情况下,你会让它成为朋友,如果没有其他原因,只是为了强迫它公开:成为班级的一部分,但即使它不是朋友,也不应该成为会员。

为什么作者写了操作符-()不应该是成员函数


如果我将运算符-()作为成员函数,会产生什么不良后果?其他后果是什么?

下面是将运算符作为成员函数的
分数:

class Fraction
{
    Fraction(int){...}

    Fraction operator -( Fraction const& right ) const { ... }
};
使用它,这是有效的代码:

Fraction x;
Fraction y = x - 42;
其等价于
x算子-(分数(42))
;但这不是:

Fraction z = 42 - x;
因为
42
中没有成员函数
operator-
(当然,它甚至不是一个类)

但是,如果将运算符声明为自由函数,则转换操作将应用于它的两个参数。那么这个

Fraction z = 42 - x;
变成这样

Fraction z = Fraction(42) - x;

这相当于
运算符-(分数(42),x)

…您能在这里详细说明自由函数的含义吗?你是说朋友功能吗?@Abhishek Gupta:不,我是说自由功能。自由函数是命名空间范围内的函数,与成员函数相反。另外,请告诉我构造运算符的含义是什么?所有导致构造新对象的运算符。在本例中,以“-”运算符为例。请注意,标题是错误的:
operator()
不能作为自由函数实现。大多数运营商可以,但不是所有运营商都可以。引号涉及的是
运算符-
,而不是
运算符()
可能重复的运算符