【问题标题】:Does access specifier matters for a friend function?访问说明符对朋友功能很重要吗?
【发布时间】:2015-03-01 23:11:00
【问题描述】:

在一个类中,如果函数在不同的说明符(如私有、受保护或公共)中声明为友元,那么有什么区别。据我了解,朋友功能不是会员。因此,应该没关系。但是,如果我看到静态 - 它也不是成员,但访问说明符很重要。所以,我有点困惑。所有这些代码如何正常工作?下面的类有什么区别吗?

/** Private friend function **/

class frienddemoFunction
{
  private:
      unsigned int m_fanSpeed;
      unsigned int m_dutyCycle;
      /** This function is not a member of class frienddemo **/
      friend void printValues(frienddemoFunction &d);

  public:
      void setFanSpeed(unsigned int fanSpeed);
      unsigned int getFanSpeed();

};


/** Protected -- Friend Function **/
class frienddemoFunction
{
  private:
      unsigned int m_fanSpeed;
      unsigned int m_dutyCycle;

  public:
      void setFanSpeed(unsigned int fanSpeed);
      unsigned int getFanSpeed();

 protected:

 /** This function is not a member of class frienddemo **/
      friend void printValues(frienddemoFunction &d);


};

class frienddemoFunction
{
  private:
      unsigned int m_fanSpeed;
      unsigned int m_dutyCycle;

  public:
      void setFanSpeed(unsigned int fanSpeed);
      unsigned int getFanSpeed();

 /** This function is not a member of class frienddemo **/
      friend void printValues(frienddemoFunction &d);


};


 /** This function is not a member of class frienddemo **/
  friend void printValues(frienddemoFunction &d);

【问题讨论】:

  • “但是,如果我看到静态 - 它也不是成员” -- 是的。是的。
  • Static 是类成员而不是对象成员。
  • C++ 标准中不存在术语“对象成员”。有静态类成员和非静态类成员。

标签: c++ friend


【解决方案1】:

不,没关系。

C++ 标准,第 11.3 / 9 节 [friend.class]

好友声明的含义与好友是否相同 声明出现在私有、受保护或公共(9.2)部分 类成员规范。

注意:

在类中声明的静态函数仍然是类成员。朋友功能不是。

【讨论】:

  • 那么为什么静态很重要?
  • @dexterous_stranger :友元函数不是成员函数。 static 是类成员的修饰符。友谊声明不声明成员,它只是授予非成员(当前类的)函数的特殊访问权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多