我在C ++中看到了一些代码并对此有疑问:
class CRectangle {
int width, height;
public:
friend CRectangle duplicate (CRectangle);
};
变量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);
}
答案 0 :(得分:6)
如果您删除friend
,此函数将成为一种方法 - function
,在类中声明并且是public method
(因为public:
)< / p>
如果您将friend
放在duplicate
前面,这意味着您声明一个函数,该函数不是该类的成员,只接受一个参数 - { {1}}并且可以访问该班级的CRectangle
/ private
成员。
第二种情况需要protected
两种情况都不同。
编辑:
对于CRectangle duplicate( CRectangle )
,访问说明符无关紧要。
通过“第二种情况需要friend
的定义”,我的意思是,第一种情况也需要定义,但它是
CRectangle duplicate( CRectangle )
答案 1 :(得分:6)
黄金法则是:
可以在任何Access说明符下声明好友函数,访问说明符规则不适用于好友函数。
在您的示例中,
friend CRectangle duplicate (CRectangle);
在public
访问说明符下被声明为友元函数,但即使在private
访问说明符下声明,它仍然会以完全相同的方式运行。
您错误地将该函数误认为是成员函数,因此也是问题。它是 NOT 。该函数返回CRectangle
类型的对象,并且是同一类CRectangle
的朋友。
函数CRectangle duplicate (CRectangle)
可以访问类private & protected
的所有CRectangle
成员,因为它被声明为friend of the class
,因为它是在公共访问说明符下声明的。
答案 2 :(得分:3)
简单:duplicate
不是CRectangle
的成员。您将duplicate
声明为自由函数,该函数是CRectangle
的朋友。
class C {
public:
friend void F(); // declares non-member F
void F(); // declares member F
};
答案 3 :(得分:2)
这是一个很好的问题,语法有点令人困惑。
语法并不意味着duplicate
是类CRectangle
的成员函数。相反,它意味着函数(常规函数)duplcate
可以访问CRectangle
的私有细节。它表示“允许复制功能”。
函数duplicate
可能仍然需要声明和定义为任何其他常规函数(在CRectangle
类之外)。我更喜欢这样做,以提醒它是一个常规的自由功能