为什么在c ++中重载运算符时不需要范围解析(::)?

Paz*_*Paz 3 c++ operator-overloading

通常,当您在类声明中声明方法并在外部定义它时,您需要指定其范围.

由于我已经读过运算符是非常常规的方法,我发现很难理解以下行为:

class A
{
public:
    A(int x)
    { this->x = x;}
    int foo();
    friend const A operator+ (const A& left,const int right);

private:
    int x;
};

const A operator+ (const A& left,const int right) //can't be A::operator+
{
    return A(left.x + right);
}

int A::foo()  // A:: is needed here
{
    return 5;
}

int main(int argc, char **argv) {
    A a(1);
    a = a + 4;
    a.operator =(a+5);
    a.foo();
}
Run Code Online (Sandbox Code Playgroud)

为什么我们不需要指定我们定义\ overloading的"operator +"?是从操作数推断出来的吗?

Sho*_*hoe 10

因为operator+是一个自由的功能,这与A班级完全无关.碰巧其中一个论点属于阶级A.

这意味着它与A::operator+定义为:

class A {
public:
    const A operator+(const int);
};
Run Code Online (Sandbox Code Playgroud)

在您的代码示例中,您正在friend为类定义一个函数.因此,自由函数现在可以访问类的私有和受保护部分.如果你不定义它(operator+)friend只能访问公共成员A.这就是你制作它的原因friend.