对于Friend Functions下的示例
下面的话是怎么回事?
注意,无论是在duplicate()的声明中,还是在它后来在main()中的使用中,我们都没有将duplicate视为类CRectangle的成员。它不是!它只是可以访问其私有和受保护的成员,而不是成员。”
Duplicate在CRectangle的public部分声明。为什么它不是成员函数而set_values是?
这是一个好例子吗?如果没有更好的?
对于Friend Functions下的示例
下面的话是怎么回事?
注意,无论是在duplicate()的声明中,还是在它后来在main()中的使用中,我们都没有将duplicate视为类CRectangle的成员。它不是!它只是可以访问其私有和受保护的成员,而不是成员。”
Duplicate在CRectangle的public部分声明。为什么它不是成员函数而set_values是?
这是一个好例子吗?如果没有更好的?
4条答案
按热度按时间8xiog9wr1#
Pavel的回答是对你问题的直接回答,但我想你可能不清楚朋友功能的用途,所以我想我会给予一个常见的例子。
友元函数的一个常见用途是重载流操作符,其中特定的操作符需要访问对象的私有成员(或通过访问来促进)。即:
在这种情况下,friend函数允许我们访问私有数据以进行打印,而不必为数据编写“get”方法。也许这有助于澄清为什么使用友元函数。
ddrv8njm2#
任何在类中声明或定义为
friend
的函数都不是该类的成员。这只是一个朋友的功能。也就是说,如果友元函数也在类中定义,则将通过涉及该类的ADL查找来找到它(通常用于重载运算符)。
7uhlpewt3#
答案就在类中函数声明之前的friend关键字中。
即friendCRectangle duplicate(CRectangle);
友元函数是一个允许访问类私有成员变量的函数。它不是属于该类的成员函数。
set_values是该类的成员,因为它没有friend关键字,并且它的作用域在类定义中。方法体是在类定义之外定义的。也就是说,类就像是一个向前定义,后面有实现(下面是)。
通过在方法名称前面加上CRectangle::我们告诉编译器这是在CRectangle类的作用域中声明的set_values函数的实现。
DeusAduro关于朋友在哪里有用的答案是朋友类的一个非常常见的用法。
blmhpbnm4#
好吧,我也会试试这个的。
正如每个人所指出的,成员函数和友元函数的声明之间的语法差异是
friend
关键字。这里有一个思考这个问题的方法。成员函数有一个隐式参数:指向对象本身的指针。例如,在
set_values
中,你可以使用成员width
和height
,它们将是调用set_values
的对象的成员。另一方面,您不能在
duplicate()
中单独使用标识符width
或height
,因为它不是成员函数,因此它没有隐式参数i。即它不与任何特定对象相关联。友谊的意思是,duplicate()
可以访问任何传递给它的CRectangle
对象的私有成员,或者是其范围内的局部变量。还有一点:友元声明甚至不是函数的真正声明。这只是对编译器的一个说明,如果这个特定的函数被定义,它将被赋予访问该类的私有成员的权限。