友元
在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术。
友元的目的就是让一个函数或者类访问另一个类中私有成员
关键字:friend
友元的三种实现:
- 全局函数做友元
friend void friendVisit(Home *home); //说明该全局函数可以访问Home中的私有成员
public:
string sittingRoom; //客厅
private:
string bedRoom; //卧室
public:
Home(){ //初始化构造函数
sittingRoom="客厅";
bedRoom="卧室";
}
};
void friendVisit(Home *home){ //全局函数
cout<<"朋友正在访问 "<<home->sittingRoom<<endl;
cout<<"朋友正在访问 "<<home->bedRoom<<endl; //在类中说明友元关系后,全局函数就能访问类中私有成员了
}
- 类做友元
class Home{
friend class Building; //声明Building是Home的友元成员,可以访问该类的私有成员
public:
string sittingRoom; //客厅
private:
string bedRoom; //卧室
public:
Home();
};
Home::Home(){ //Home的类外初始化构造函数
sittingRoom="客厅";
bedRoom="卧室";
}
class Building{
public :
Home *home;
Building();
void visit();
};
Building::Building() //Building的类外初始化构造函数
{
home=new Home;
}
void Building::visit(){ //Building的类外普通函数
cout<<"朋友正在访问 "<<home->sittingRoom<<endl;
cout<<"朋友正在访问 "<<home->bedRoom<<endl; //私有成员的访问
}
void test_1(){
Building building;
building.visit();
}
- 成员函数做友元
class Home; //先对Home类进行声明
class Building{
public :
Home *home;
Building();
void friendVisit(); //只让friendVisit一个成员函数能访问Home类的私有成员
void privateVisit();
};
class Home{
friend void Building::friendVisit(); // Building类下的friendVisit作为Home的友元可以访问该类的私有成员
public:
string sittingRoom; //客厅
private:
string bedRoom; //卧室
public:
Home();
};
Home::Home(){ //Home的类外初始化构造函数
sittingRoom="客厅";
bedRoom="卧室";
}
Building::Building() //Building的类外初始化构造函数
{
home=new Home;
}
void Building::friendVisit(){ //友元成员函数
cout<<"朋友正在访问 "<<home->sittingRoom<<endl;
cout<<"朋友正在访问 "<<home->bedRoom<<endl; //私有成员的访问
}
void Building::privateVisit(){
cout<<"陌生人正在访问 "<<home->sittingRoom<<endl;
// cout<<"陌生人正在访问 "<<home->bedRoom<<endl; 不能访问Home的私有成员
}
void test_1(){
Building building;
building.friendVisit();
building.privateVisit();
}