C++中的公共朋友功能

public friend function in C++?

本文关键字:朋友 功能 C++      更新时间:2023-10-16

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

  class CRectangle {
        int width, height;
      public:
        friend CRectangle duplicate (CRectangle);
    };

变量widthheight是私有的,方法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类之外)。 我更喜欢这样做来提醒它是一个常规的免费功能