c++ 友元函数

nwwlzxa7  于 2023-07-01  发布在  其他
关注(0)|答案(4)|浏览(141)

对于Friend Functions下的示例
下面的话是怎么回事?
注意,无论是在duplicate()的声明中,还是在它后来在main()中的使用中,我们都没有将duplicate视为类CRectangle的成员。它不是!它只是可以访问其私有和受保护的成员,而不是成员。”
Duplicate在CRectangle的public部分声明。为什么它不是成员函数而set_values是?
这是一个好例子吗?如果没有更好的?

8xiog9wr

8xiog9wr1#

Pavel的回答是对你问题的直接回答,但我想你可能不清楚朋友功能的用途,所以我想我会给予一个常见的例子。
友元函数的一个常见用途是重载流操作符,其中特定的操作符需要访问对象的私有成员(或通过访问来促进)。即:

class Rectangle
{
...
    friend ostream &operator<<(ostream &stream, Rectangle r);
private:
    int width;
    int height;
};

ostream &operator<<(ostream &stream, Rectangle r)
{
    return (stream << "{" << width << ", " << height << "}");
}

在这种情况下,friend函数允许我们访问私有数据以进行打印,而不必为数据编写“get”方法。也许这有助于澄清为什么使用友元函数。

ddrv8njm

ddrv8njm2#

任何在类中声明或定义为friend的函数都不是该类的成员。这只是一个朋友的功能。
也就是说,如果友元函数也在类中定义,则将通过涉及该类的ADL查找来找到它(通常用于重载运算符)。

7uhlpewt

7uhlpewt3#

答案就在类中函数声明之前的friend关键字中。
friendCRectangle duplicate(CRectangle);
友元函数是一个允许访问类私有成员变量的函数。它不是属于该类的成员函数。
set_values是该类的成员,因为它没有friend关键字,并且它的作用域在类定义中。方法体是在类定义之外定义的。也就是说,类就像是一个向前定义,后面有实现(下面是)。
通过在方法名称前面加上CRectangle::我们告诉编译器这是在CRectangle类的作用域中声明的set_values函数的实现。
DeusAduro关于朋友在哪里有用的答案是朋友类的一个非常常见的用法。

blmhpbnm

blmhpbnm4#

好吧,我也会试试这个的。
正如每个人所指出的,成员函数和友元函数的声明之间的语法差异是friend关键字。
这里有一个思考这个问题的方法。成员函数有一个隐式参数:指向对象本身的指针。例如,在set_values中,你可以使用成员widthheight,它们将是调用set_values的对象的成员。
另一方面,您不能在duplicate()中单独使用标识符widthheight,因为它不是成员函数,因此它没有隐式参数i。即它不与任何特定对象相关联。友谊的意思是,duplicate()可以访问任何传递给它的CRectangle对象的私有成员,或者是其范围内的局部变量。
还有一点:友元声明甚至不是函数的真正声明。这只是对编译器的一个说明,如果这个特定的函数被定义,它将被赋予访问该类的私有成员的权限。

相关问题