我在C++中看到了一些代码,并对此有疑问:
class CRectangle {
int width, height;
public:
friend CRectangle duplicate (CRectangle);
};
Run Code Online (Sandbox Code Playgroud)
变量width和height是私有的,方法duplicate()是公开的.关键字friend用于访问CRectangle对象外部的私有和受保护函数,但duplicate()已经公开.如果可以从外面访问,为什么我们需要"朋友"?
这是否意味着,虽然我们直接调用类duplicate()外部的公共方法,但是如果方法访问某个私有变量,那么它也是不允许的,我们必须将它声明为"朋友"?
这是duplicate()函数的实现; 我只想澄清问题:
CRectangle duplicate (CRectangle rectparam)
{
CRectangle rectres;
rectres.width = rectparam.width*2;
rectres.height = rectparam.height*2;
return (rectres);
}
Run Code Online (Sandbox Code Playgroud)
如果你删除friend,这个函数将成为一个方法 - 一个function,在类中声明并且是一个public method(就像那里public:)
如果你放在friend前面duplicate,这意味着你声明一个函数,它不是一个类的成员,它接受一个参数 - CRectangle并且可以访问该类的private/ protected成员.
第二种情况需要定义 CRectangle duplicate( CRectangle )
两种情况都不同.
编辑:对于friend,访问说明符无关紧要.
通过"第二种情况需要定义CRectangle duplicate( CRectangle )",我的意思是,第一种情况也需要定义,但确实如此
// vvvvvvvvvvvv
CRectangle CRectangle::duplicate( CRectangle )
Run Code Online (Sandbox Code Playgroud)
黄金法则是:
可以在任何Access Specifier下声明Friend函数,访问说明符规则不适用于友元函数.
在你的例子中,
friend CRectangle duplicate (CRectangle);
Run Code Online (Sandbox Code Playgroud)
在public访问说明符下声明为友元函数,但即使在访问说明符下声明,它仍然会以完全相同的方式运行private.
您将该函数误认为是成员函数,因此也是问题.它不是.该函数返回该类型的对象,CRectangle并且是同一类的朋友CRectangle.
该函数CRectangle duplicate (CRectangle)可以访问private & protected该类的所有成员,CRectangle因为它的声明friend of the class不是因为它是在公共访问说明符下声明的.
| 归档时间: |
|
| 查看次数: |
3684 次 |
| 最近记录: |