在我们的演讲中,我对以下句子感到困惑
通过名称为
operator@
的函数命名操作员@ (不包括 =()[]? :。 ->。*::)可以重载尚未内置的数据类型。
我意识到运算符@指的是“ +-* / ^ ... etc”之类的东西,而且我理解这些过载的方式和原因。但是我对“( =()[]? :。 ->。*::)”部分。这是什么意思,为什么那些所说的运算符被排除在外?
我是说
something operator+(something a, something b)
我声明的方式并没有太大差异
something operator[] (something c)
据说[],(),->和=之类只能用成员函数重载,但是我上面提到的运算符+
也只能通过成员函数重载,不是吗?
答案 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());
}