c++ - C++中的公共(public) friend 功能?

标签 c++ friend

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

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

变量widthheight 是私有(private)的,方法duplicate() 是公共(public)的。关键字 friend 用于访问 CRectangle 对象之外的私有(private)和 protected 函数,但 duplicate() 已经是公开的。如果可以从外部访问,为什么我们需要“ friend ”?

这是否意味着,虽然我们在类外直接调用了一个公共(public)方法,如duplicate(),但是如果该方法访问了一些私有(private)变量,也是不允许的,我们必须声明它作为“ friend ?”

这是duplicate()函数的实现;我只是想把问题说清楚:

CRectangle duplicate (CRectangle rectparam)
{
  CRectangle rectres;
  rectres.width = rectparam.width*2;
  rectres.height = rectparam.height*2;
  return (rectres);
}

最佳答案

如果你删除friend,这个函数将变成一个方法——一个函数,它在类内部声明并且是一个公共(public)方法 (因为有 public: )

如果你把 friend 放在 duplicate 前面,这意味着你声明一个函数,它不是类的成员,它采用一个参数 - CRectangle 并且可以访问类的 private/protected 成员。

第二种情况需要定义CRectangle duplicate( CRectangle )

两种情况不同。


编辑: 对于 friend,访问说明符无关紧要。

“第二种情况需要为 CRectangle duplicate( CRectangle ) 定义”,我的意思是,第一种情况也需要定义,但它是

//         vvvvvvvvvvvv
CRectangle CRectangle::duplicate( CRectangle )

关于c++ - C++中的公共(public) friend 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5903307/

相关文章:

java - 从 Java 按名称加载 C++ 类

c++ - OpenGL:为什么这个白屏

c++ - 将 DLL 调用到 VB.Net 中时出现未处理的 AccessViolationException 错误

c++ - 如何积累模板参数包?

c++ - FSM 中的状态应该与上下文类型成为 friend 吗?

c++ - 好友功能仍然无法访问私有(private)成员

c++ - friend 和成员二元运算符的消歧

c++ - 如何在不使用 'friend' 的情况下允许另一个类创建但允许继承?

c++ - 如何将 wchar 值存储在双引号字符串中

c++ - 无法在友元函数中实例化类?我没有在范围错误中声明