Friend Functions下的示例 以下是如何真实的?
“请注意,在duplicate()的声明中以及在main()中的后续使用中,我们都没有考虑复制类CRectangle的成员。它不是!它只是访问其私有和受保护的成员而不是一名成员。“
在CRectangle的公共部分声明了复制。怎么不是成员函数和set_values?
这是一个很好的例子吗?如果没有更好的那些?
答案 0 :(得分:11)
Pavel的回答是你问题的直接答案,但我想你可能不清楚朋友的功能是什么用的,所以我想我会给出一个常见的例子。
友元函数的一个常见用途是重载流操作符,其中特定操作符需要访问对象的私有成员(或通过访问来促进)。即:
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 << "}");
}
在这种情况下,友元函数允许我们访问私有数据进行打印,而无需为数据编写'get'方法。也许这有助于澄清为什么使用友元函数。
答案 1 :(得分:10)
在类中声明或定义为friend
的任何函数都不是该类的成员。这只是一个朋友的功能。
也就是说,如果在类中定义了友元函数,则可以通过涉及该类的ADL查找找到它(通常用于重载运算符)。
答案 2 :(得分:1)
答案在类中的函数声明之前的friend关键字中。
即。 朋友 CRectangle重复(CRectangle);
友元函数只是一个允许访问类私有成员变量的函数。它不是属于该类的成员函数。
set_values是该类的成员,因为它没有friend关键字,并且它的范围在类定义中。方法体在类定义之外定义。即该类就像一个前向定义,其实现如下(见下文)。
通过在CRectangle ::前面添加方法名称,我们告诉编译器这是在CRectangle类范围内声明的set_values函数的实现。
DeusAduro关于朋友可以在哪里使用的答案是朋友类的常见用法。
答案 3 :(得分:1)
好的,我也会对此表示不满。
正如大家所指出的,成员函数声明和友元函数之间的语法差异,合理的是friend
关键字。
这是一种思考这个问题的方法。成员函数有一个隐含参数:指向对象本身的指针。 E. g。在set_values
内,您可以使用成员width
和height
,他们将成为调用set_values
的对象的成员。
另一方面,您不能在width
内单独使用标识height
或duplicate()
,因为它不是成员函数,因此它没有隐含参数,一世。即它与任何特定对象无关。友谊意味着,duplicate()
可以访问传递给它的任何CRectangle
对象的私有成员,或者是其范围内的局部变量。
另一点:朋友声明甚至不是函数的声明。这只是编译器的一个注释,如果定义了这个特定的函数,就可以访问这个类的私有成员。