朋友的功能

时间:2009-09-03 00:14:38

标签: c++ friend

Friend Functions下的示例 以下是如何真实的?

“请注意,在duplicate()的声明中以及在main()中的后续使用中,我们都没有考虑复制类CRectangle的成员。它不是!它只是访问其私有和受保护的成员而不是一名成员。“

在CRectangle的公共部分声明了复制。怎么不是成员函数和set_values?

这是一个很好的例子吗?如果没有更好的那些?

4 个答案:

答案 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内,您可以使用成员widthheight,他们将成为调用set_values的对象的成员。

另一方面,您不能在width内单独使用标识heightduplicate(),因为它不是成员函数,因此它没有隐含参数,一世。即它与任何特定对象无关。友谊意味着,duplicate()可以访问传递给它的任何CRectangle对象的私有成员,或者是其范围内的局部变量。

另一点:朋友声明甚至不是函数的声明。这只是编译器的一个注释,如果定义了这个特定的函数,就可以访问这个类的私有成员。