gpt4 book ai didi

c++ - 友元函数声明为成员函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:50 24 4
gpt4 key购买 nike

有代码

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);
}

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

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

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

第二个定义是运算符 ==(全局)的外部定义,它不绑定(bind)到任何结构,因此它不会在其中传递 *this。

但它仍然被定义为“友元”,这基本上表明(根据第一个定义)成员函数是其自身类的友元函数。这怎么可能?为什么会这样编译?

最佳答案

声明为 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 的方法的有效定义。

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

关于c++ - 友元函数声明为成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42463989/

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