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

时间:2011-05-05 19:48:58

标签: c++ friend

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

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

变量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);
}

4 个答案:

答案 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类之外)。我更喜欢这样做,以提醒它是一个常规的自由功能