朋友函数声明为成员函数

时间:2017-02-26 02:20:22

标签: c++ operator-overloading

有代码

x = '0x32'
print(chr(int(x,16)))
#=> 2

如果我声明operator == as

struct node
{
    node(int X , int Y):X(X),Y(Y){};
    int X;
    int Y;
    friend bool operator ==(const node &X, const node &Y);
};


int main()
{
    node one(5,5);
    node two(5,5);
    if ( one == two )
    {
       cout << " true " << endl;
    }
    return 0;
}

它需要一个参数,但是当我将其声明为

bool node::operator ==(const node &X, constnode &Y)
{
    return (X.X == X.Y && Y.X == Y.Y);
}

需要两个。我知道用语言定义,第一个定义需要一个参数,因为第二个是* this。

第二个定义它的operator ==(global)的外部定义,它没有绑定到任何结构,因为它没有传递* this。

但它仍被定义为&#34;朋友&#34;这基本上表明(通过第一个定义)成员函数是它自己的类的友元函数。这怎么可能?为什么这会编译?

2 个答案:

答案 0 :(得分:3)

声明为friend的方法实际上不是类的方法,而是类外的全局函数,与类的命名空间相同。

以下内联定义......

struct node
{
    node(int X , int Y):X(X),Y(Y){};
    int X;
    int Y;
    friend bool operator ==(const node &lhs, const node &rhs) {
        return (lhs.X == rhs.X && lhs.Y == rhs.Y);
    }
};

...与...相同

bool operator ==(const node &lhs, const node &rhs)
{
    return (lhs.X == rhs.X && lhs.Y == rhs.Y);
}

这就是为什么你的第一个operator ==定义不是声明为friend的方法的有效定义。

如果在类之外定义全局运算符==,如果全局函数需要访问类的私有成员,则实际上只需要友元声明。在您的情况下,这不是必需的,因为X和Y是公开的。

答案 1 :(得分:0)

这是因为第一个定义使得operator ==成员函数的节点。因此,它可以访问此指针,因此第一个指针隐式为this,您可以继续使用一个参数。

第二个定义使得operator ==友元函数的节点。现在,友元函数通过获取它们的引用来访问类的成员,因为它无法访问此指针。因此,我们需要expolicitly指定两个参数。

希望有所帮助

相关问题