Giskard

(二十六)朋友成员

2018-11-01

引例

class Object
{
public:
    Object(int v) : value(v)
    {

    }
private:
    int value;
};

//定义全局函数Test
void Test(Object* p)
{
    printf("%d",p->value);//错误!!value是private的,不能被外部访问
}

怎么才能访问到呢?

朋友成员

在类中,用friend关键词可以将一个全局函数或另一个类修饰为该类的朋友

class Object
{
      friend void print(Object* p);

    friend class Base;  //将类Base声明为朋友
};
class Object
{
    friend void Print(Object* p);
public:
    Object(int v) : value(v)
    {

    }
private:
    int value;
};

void Print(Object* p)
{
    printf("%d",p->value);
};

friend的语法

  • 放在类体大括号内
  • 朋友B的权力:可以无限制地访问类A的所有成员,不受private/protected限制
  • B被声明为A的朋友,则B可以访问A的所有成员,反之不成立,A不是B的朋友,A无法访问B的所有成员

缺点大于优点

  • 优点:给设计人员带来灵活度,无视private/protected
  • 缺点:破坏了类的封装原则
Tags: C/C++