- 现实生活中场景: 比如QQ空间的相册,我建立了一个私密相册,基本QQ好友都不可见,但是我的私密好友,比如家中女神“老婆”可以访问。如何做到这种越权访问呢?就需要用到友元了,让外部的函数也可以访问我私密类内部的成员。
- 友元函数的作用: 就是让类外的函数,例如:全局函数,可以访问类内的私有成员变量。
- 下面举个例子来实现友元函数:
#include <iostream>
class Person {
//将全局函数的声明放置到类内,并在其前面加上friend关键字
friend void print(const Person &p);
//友元类
friend class Father;
public:
Person():m_age(0){};
Person& add(int a){
m_age = m_age + a;
return *this;
}
private:
void print() {
std::cout << "age = " << m_age << std::endl;
}
private:
int m_age;
};
//虽然我是Person类外的一个函数,但是我的权限大,我要访问你的私有成员m_age
//friend void print(const Person &p);
void print(const Person &p) {
std::cout << "age = " << p.m_age << std::endl;
}
class Father {
public:
void print(Person &p) {
//friend class Father;
//因为是你爸,所以可以可以调用你的private print()
p.print();
}
private:
Person *p;
};
int main() {
Person p;
p.add(1).add(2).add(3);
print(p);
Father f;
f.print(p);
return 0;
}
4. 注意事项:
- 友元关系不能被继承。
- 友元关系是单向的。 类A是类B的朋友,但类B不一定是类A的朋友。
- 友元关系是不具有传递性的。 类A是类B的朋友,类B是类C的朋友,但是类A不一定是类C的朋友。