C++中的公共朋友功能
public friend function in C++?
我在C++中看到了一些代码,并对此有疑问:
class CRectangle {
int width, height;
public:
friend CRectangle duplicate (CRectangle);
};
变量width
和height
是私有的,方法duplicate()
是公共的。关键字 friend
用于访问 CRectangle
对象外部的私有和受保护函数,但duplicate()
已经是公共的。 如果可以从外部访问,为什么我们需要"朋友"?
这是否意味着,尽管我们直接调用类外的duplicate()
等公共方法,但如果该方法访问某个私有变量,它也是不被允许的,我们必须将其声明为"friend"?
这是duplicate()
函数的实现;我只想把问题说清楚:
CRectangle duplicate (CRectangle rectparam)
{
CRectangle rectres;
rectres.width = rectparam.width*2;
rectres.height = rectparam.height*2;
return (rectres);
}
如果你删除friend
,这个函数将成为一个方法 - 一个function
,它在类内部声明并且是一个public method
(因为有public:
)
如果你把friend
放在duplicate
前面,这意味着你声明了一个函数,它不是类的成员,它接受一个参数 - CRectangle
并且有权访问类的private
/protected
成员。
第二种情况需要定义CRectangle duplicate( CRectangle )
这两种情况都不同。
编辑:对于friend
,访问说明符无关紧要。
通过"第二种情况需要CRectangle duplicate( CRectangle )
的定义",我的意思是,第一种情况也需要定义,但它是
// vvvvvvvvvvvv
CRectangle CRectangle::duplicate( CRectangle )
黄金法则是:
友元函数可以在任何访问说明符下声明,访问说明符规则不适用于友元函数。在您的示例中,
friend CRectangle duplicate (CRectangle);
在访问说明符下声明为友元函数public
但即使在private
访问说明符下声明,它的行为方式仍然完全相同。
您误以为该函数是成员函数,因此提出了问题。是没有。该函数返回 CRectangle
类型的对象,并且是同一类 CRectangle
的友元。
函数CRectangle duplicate (CRectangle)
可以访问类CRectangle
的所有private & protected
成员,因为它被声明friend of the class
而不是因为它是在公共访问说明符下声明的。
简单:duplicate
不是CRectangle
的成员。您将duplicate
声明为自由函数,该函数是CRectangle
的朋友。
class C {
public:
friend void F(); // declares non-member F
void F(); // declares member F
};
这是一个很好的问题,语法有点混乱。
语法并不意味着duplicate
是类CRectangle
的成员函数。 相反,这意味着该功能(常规功能)duplcate
可以访问CRectangle
的私人详细信息。 它指示"授予重复函数的权限"。
函数duplicate
可能
CRectangle
类之外)。 我更喜欢这样做来提醒它是一个常规的免费功能
- 类似虚拟的朋友功能?
- 朋友功能声明中的错误C
- 朋友功能不起作用(语法错误)
- Forward宣布了Singleton班级,并带有Freshial声明的朋友功能
- 我的朋友功能无法访问私人变量
- 我正在尝试使用朋友功能,但我无法访问第二类的私人数据成员
- 朋友功能可访问性问题
- 防止朋友功能访问班级的私人会员
- 朋友功能声明为会员函数
- 朋友功能无法访问私有成员变量
- 朋友功能是否继承?为什么基类朋友功能在派生的类对象上工作
- 使用模板独立enable_if时,链接器错误带有模板的朋友功能
- 朋友功能程序未产生主要功能中所需的值
- 朋友功能和继承在CPP中
- 使用朋友功能和正常公共功能时的行为差异
- 非成员的朋友功能始终是内联的
- 朋友功能模板查找
- 课堂定义的朋友功能的范围
- 模板类的朋友功能:C
- 模板类的朋友功能需要访问会员类型