C++中的公共朋友功能?

8 c++ friend

我在C++中看到了一些代码,并对此有疑问:

  class CRectangle {
        int width, height;
      public:
        friend CRectangle duplicate (CRectangle);
    };
Run Code Online (Sandbox Code Playgroud)

变量widthheight是私有的,方法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)

Kir*_*rov 6

如果你删除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)


Alo*_*ave 6

黄金法则是:

可以在任何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不是因为它是在公共访问说明符下声明的.