有代码
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;这基本上表明(通过第一个定义)成员函数是它自己的类的友元函数。这怎么可能?为什么这会编译?
答案 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指定两个参数。
希望有所帮助