重载相同操作的友元函数和类方法的优先级



这是我的代码:

#include <iostream>
using namespace std;
class RationalNumber
{
private:
int num;
int den;
public:
RationalNumber(int a):num(a),den(1){}
RationalNumber(int a, int b):num(a),den(b){}
void parse()
{
cout << num << "\" << den << endl;
}

RationalNumber operator/(RationalNumber);
};
RationalNumber  RationalNumber:: operator/(RationalNumber b)
{
return RationalNumber(num * b.den, den * b.num);
}
int main()
{
RationalNumber a(1,2);
int c = 5;
(a/c).parse();
return 0;
}

我有一个重载"/"操作,并返回"的对应对象;理性数字";。

我还有一个构造函数,它允许我用integer变量初始化我的对象。也就是说,我可以使用我超负荷的"/"操作,所以我的程序的结果是1/10。

但后来我在代码中添加了几行:

#include <iostream>
using namespace std;
class RationalNumber
{
private:
int num;
int den;
public:
RationalNumber(int a):num(a),den(1){}
RationalNumber(int a, int b):num(a),den(b){}
void parse()
{
cout << num << "\" << den << endl;
}

RationalNumber operator/(RationalNumber);
friend RationalNumber operator/(RationalNumber, int);
};
RationalNumber  RationalNumber:: operator/(RationalNumber b)
{
return RationalNumber(num * b.den, den * b.num);
}
RationalNumber operator/(RationalNumber v, int n )
{
return RationalNumber(0,0);
}
int main()
{
RationalNumber a(1,2);
int c = 5;
(a/c).parse();
return 0;
}

我添加了一个好友功能,该功能也会重载"/"操作;RatinalNumber";对象和整数,并返回0/0-"0";RatinalNumber";对象

所以现在表达式a/c中的c可以被视为我的朋友函数中的第二个参数;RatinalNumber";对象由我的一个构造函数用整数值初始化。现在程序的结果是0/0——也就是说,编译器引用了友元函数,而不是方法,我想知道为什么。这类案件有明确的优先顺序吗?

我将展示一个简化的视图。为此,您将扮演编译器的角色。

假设您正忙于编译某些代码,遇到一个运算符,该运算符被指定为操作数RationalNumberint。该怎么办?好吧,编译器的工作描述包括将运算符与实现相匹配,所以您会抱怨并查看声明列表。你可以找到两个可行的选择。

  1. RationalNumber的一个成员,期望RationalNumber作为其第二个操作数。这不是一个完美的匹配,但您可能会发现从intRationalNumber的令人讨厌的转换,您记得在某个地方看到过
  2. 一种自由运算符,期望RationalNumber作为其第一个操作数,int作为其第二个操作数。完美匹配

您正忙于编译代码。你真的不想找到这种转换,所以你选择#2作为更容易的选项。

现实并不像上面那样轻率,但基本原理是合理的。编译一个可行函数列表后,编译器将在声明的参数和提供的参数之间寻找最佳匹配。粗略地说;最好的";匹配是编译器所需工作量最少的一种。(有一个转换的排名使其精确。(精确匹配——提供的参数已经是所需的类型——比其他任何类型都更可取。

在决策过程的这一点上;朋友"以及";成员";未查看。

最新更新