一 友元
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
- 类似 java 中享元模式:实例的共享(ImageLoader Lru 算法 存储图片)
- 友元:类或函数的共享
- 优点:提高效率、表达清晰
- 缺点:破坏封装性
- 特征:
友元函数不能被派生类继承
友元函数不能使用this
二 友元函数
#include <string>
#include <iostream>
using namespace std;
class Girl
{
public :
friend void modify(Girl *girl ,int age);
void tell();
private:
int age = 16;
};
//Girl class的函数实现
void Girl::tell(){
cout << "age == " << age << endl;
}
//没有限定符,外部实现
void modify(Girl *girl, int age) {
girl->age = age;
}
void main() {
Girl *girl = new Girl();
girl->tell();
modify(girl, 31);
girl->tell();
delete girl;
system("pause");
}
运行结果:
age == 16
age == 31
2 友元类
- 让其他类中的成员函数访问这个类中的私有函数
Class A 有属性 a,Class B可以访问 Class C不可以访问
#include <string>
#include <iostream>
using namespace std;
class Girl
{
public :
friend class Boy;
void tell();
private:
int age = 16;
string name= "tt";
};
//Girl class的函数实现
void Girl::tell(){
cout << "age == " << age << endl;
}
class Boy
{
public:
Boy(Girl girl) {
this->girl = girl;
}
~Boy() {
}
void changeGril() {
girl.age = 20;
girl.name = "xx";
}
//已经声明为友元类,可以访问和修改私有属性
void introuduce() {
cout << "My Gril friend name:" <<girl.name<<" age:"<< girl.age << endl;
}
private:
Girl girl;
};
void main() {
Girl girl;
Boy boy = Boy(girl);
boy.introuduce();
boy.changeGril();
boy.introuduce();
system("pause");
}
运行结果:
My Gril friend name:tt age:16
My Gril friend name:xx age:20
拓展: 实现类中的友元函数,friend void Boy::introduce();