operator +和operator []之间有什么区别

时间:2019-03-17 21:06:26

标签: c++ operator-overloading operators

在我们的演讲中,我对以下句子感到困惑

  

通过名称为operator@的函数命名操作员@   (不包括   =()[]? :。 ->。*::)可以重载尚未内置的数据类型。

我意识到运算符@指的是“ +-* / ^ ... etc”之类的东西,而且我理解这些过载的方式和原因。但是我对“( =()[]? :。 ->。*::)”部分。这是什么意思,为什么那些所说的运算符被排除在外?

我是说

something operator+(something a, something b)

我声明的方式并没有太大差异

something operator[] (something c)

据说[],(),->和=之类只能用成员函数重载,但是我上面提到的运算符+也只能通过成员函数重载,不是吗?

1 个答案:

答案 0 :(得分:2)

overload operators有两种方法:

  • 作为“免费”功能(即非成员),在您要为其重载的类之外,
  • 作为成员函数。

上面的链接在一个漂亮的表中阐明了=()[]->的成员函数形式可能会发生重载,但禁止使用免费功能。

此外,范围解析运算符::以及成员访问权.,指向成员.*的成员访问通过指针以及三元条件运算符x ? y : z {{ 3}}。


编辑:在这里,一个cannot be overloaded,其中operator*被定义为成员函数,而operator+被定义为非成员函数:

class Rational {
    int p; 
    int q; 
public:  
    Rational (int d=0, int n=1) : p{d}, q{n} { } 
    Rational operator*(const Rational& r) const {    // for curent object * r
        return Rational(p*r.p,q*r.q); 
    }
    int numerator() const {return p; }
    int denominator() const { return q; } 
}; 

Rational operator+(const Rational &a, const Rational &b) {   // for object a + object b
    return Rational(a.numerator()*b.denominator()+b.numerator()*a.denominator(),
                                                      a.denominator()*b.denominator());
}