这些重载运算符如何应用于表达式d***b?

Ida*_*878 2 c++ operator-overloading

我试图更深入地理解运算符重载,所以我使用了这段代码.如果我正确理解当我在类外部重载一个操作符时,它被称为全局运算符,因此我可以将每个对象放在前缀或后置修复形式中,在这种情况下我使用Double(我的类)和double.

这段代码工作正常,我正在努力弄清楚为什么.具体在主要功能.d***b为什么d*b与d*******b相同?

 friend std :: ostream& operator<<(std :: ostream& out, const Double& d);
 friend std :: istream& operator>>(std :: istream& in, Double& d);

 Double const& operator*() const { return *this; }
 friend double my_pow(double,Double);
};

double my_pow(double x ,Double i) {
 return pow(x,i._p);
}
double operator*(double a, Double const& b) {
 return my_pow(a,b);
}

std :: ostream& operator<<(std :: ostream& out, const Double& d) { return out<<d._p; }
std :: istream& operator>>(std :: istream& in, Double& d) { return in>>d._p; }

int main()
{
    Double d(10);
    Double b(2);
    double a = d***b;
}
Run Code Online (Sandbox Code Playgroud)

tem*_*def 5

当你写作

d***b
Run Code Online (Sandbox Code Playgroud)

C++将其解释为

d*(*(*b))
Run Code Online (Sandbox Code Playgroud)

鉴于此,让我们看看哪些运营商被调用.当C++看到

*b
Run Code Online (Sandbox Code Playgroud)

它会寻找

  • operator*以无参数命名的成员函数,或
  • 一个operator*用一个参数命名的自由函数.

基于此,调用哪个重载?什么是*b评价什么?

接下来,当C++看到某种形式时

a * b
Run Code Online (Sandbox Code Playgroud)

它会寻找

  • 类中的成员函数aoperator*使用单个参数命名的类型,或
  • 一个名为operator*两个参数的自由函数.

基于此,调用哪个函数?

希望这可以帮助!