gpt4 book ai didi

c++ - 运算符重载,成员函数和非成员函数,哪个优先?

转载 作者:可可西里 更新时间:2023-11-01 18:36:55 25 4
gpt4 key购买 nike

假设我有一个 Complex 数字类并且 operator+ 被重载了两次,既作为成员函数又作为全局函数,例如:

class Complex {
public:
Complex operator+(const Complex& c);
};
Complex operator+(const Complex& a, const Complex& b);

在主函数中,我将调用 operator+,如下所示:

Complex a, b;
Complex c = a + b;

将调用哪个operator+ 函数?谢谢!

最佳答案

一般而言,成员(member)并不比非成员(member)更受欢迎,反之亦然。 C++ 的重载决议规则适用于选择一个或另一个。

出于重载决策的目的,成员函数被视为具有隐含对象参数(§13.3.1/2)。所以

Complex Complex::operator+(const Complex& c);

被视为有两个参数:原始的const Complex& c,和另一个Complex&,它指的是用于调用的对象成员函数(实际上是 *this)。

假设我们有两个 Complex 变量:

Complex c1, c2;

c1c2都是非const,所以为了调用

c1.operator+(c2)

参数 c 是一个 const 引用,必须绑定(bind)到非 const 参数 c2.

另一方面,调用

operator+(c1, c2)

两个参数ab,它们是const引用,必须绑定(bind)到非const 对象,c1c2

成员 operator+ 更好,因为 const Complex&, Complex&const Complex&, const 更适合 c1, c2 Complex& 因为它执行较少的资格转换。 (§13.3.3.2/3)

如果将成员operator+的声明改为

Complex Complex::operator+(const Complex& c) const;

那么重载将变得不明确,编译将失败。

关于c++ - 运算符重载,成员函数和非成员函数,哪个优先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com