C++ 好友功能
对于C++ 好友功能,c++,friend,C++,Friend,对于 下面这句话是怎么回事 “请注意,无论是在duplicate()的声明中,还是在其以后在main()中的使用中,我们都没有将duplicate视为类CRectangle的成员。事实并非如此!它只是可以访问其私有和受保护的成员,而不是成员。” 副本在CRectangle的公共部分声明。它怎么不是一个成员函数和set_值呢 这是一个好例子吗?如果不是,还有更好的吗?在类中声明或定义为friend的任何函数都不是该类的成员。这只是一个朋友的功能 也就是说,如果类中也定义了一个friend函数,它将
下面这句话是怎么回事 “请注意,无论是在duplicate()的声明中,还是在其以后在main()中的使用中,我们都没有将duplicate视为类CRectangle的成员。事实并非如此!它只是可以访问其私有和受保护的成员,而不是成员。” 副本在CRectangle的公共部分声明。它怎么不是一个成员函数和set_值呢
这是一个好例子吗?如果不是,还有更好的吗?在类中声明或定义为
friend
的任何函数都不是该类的成员。这只是一个朋友的功能
也就是说,如果类中也定义了一个friend函数,它将通过涉及该类的ADL查找找到(通常用于重载运算符)。Pavel的答案是对您问题的直接回答,但我认为您可能不清楚friend函数的用途,所以我想我会给出一个常见的示例 友元函数的一个常见用法是重载流操作符,其中特定操作符需要访问(或通过访问)对象的私有成员。即:
class Rectangle
{
...
friend ostream &operator<<(ostream &stream, Rectangle r);
private:
int width;
int height;
};
friend ostream &operator<<(ostream &stream, Rectangle r)
{
return (stream << "{" << width << ", " << height << "}");
}
类矩形
{
...
friend ostream&operator答案在类中函数声明之前的friend关键字中
i、 e.朋友CRectangle副本(CRectangle)
友元函数只是一个允许访问类私有成员变量的函数。它不是属于该类的成员函数
set_values是该类的成员,因为它没有friend关键字,并且它的作用域在类定义内。方法体在类定义外定义。例如,该类就像一个具有后续实现的正向定义(如下所示)
通过在方法名前面加上CRectangle::我们告诉编译器这是CRectangle类范围内声明的set_values函数的实现
DeusAduro关于friend在何处有用的回答是friend类的一个非常常见的用法。好的,我也来尝试一下
正如大家所指出的,成员函数和友元函数的声明之间的语法差异是,friend
关键字
这里有一种方法可以考虑这一点。成员函数有一个隐式参数:指向对象本身的指针。例如,在set\u values
内部,您可以使用成员width
和height
,它们将是调用其set\u values
的对象的成员
另一方面,您不能在duplicate()
中单独使用标识符width
或height
,因为它不是成员函数,因此没有隐式参数,即它与任何特定对象都没有关联。友谊的意思是duplicate()
可以访问传递给它的任何CRectangle
对象的私有成员,或者该对象是其范围内的局部变量
另一点:朋友声明甚至不是一个函数的声明。它只是编译器的一个注释,如果这个特定的函数被定义,它将被访问这个类的私有成员。一个很好的答案,并且值得指出的是<代码>朋友操作符并考虑使用<代码> ReCt。angle&r
如果它是一个大类,哪一个会更有效。或者const Rectangle&r
会更好,这样您就可以打印一个“const Rectangle”(可能是类中的某个用户定义的常量)。但是,静态成员函数仍然是成员函数,即使它们没有任何隐式参数。此外,虽然友元声明不声明函数,但友元内联定义同时声明和定义函数(并使其成为友元
).啊,现在真的很有趣了。:)成员函数:有一个隐式参数,可以访问私有静态和非静态成员。静态成员函数:没有隐式参数,只能访问静态数据成员。朋友函数:没有隐式参数,可以访问私有静态和非静态成员。很棒的poi顺便说一句,关于内联友元函数。