引例
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
- 缺点:破坏了类的封装原则