友元
目的:就是让一个函数或者类访问一个类中的私有成员
友元的三种实现
- 全局函数做友元:声明全局函数是本类的朋友(友元), 全局函数便可以访问类的私有成员
- 类做友元:声明别的类是本类的朋友(友元),可以访问本类的私有成员
- 成员函数做友元:声明别的类的函数为本类的朋友(友元),可以访问本类的私有成员
全局函数做友元
#include <iostream>
#include<string>
using namespace std;
class MyHouse {
//声明全局函数是本类的友元, 全局函数便可以访问类的私有成员
friend void goodFiendVisit(MyHouse& house);
friend void goodFiendVisit2(MyHouse* house);
public:
MyHouse() {
settingRoom = "-客厅";
bedRoom = "-卧室";
}
public:
string settingRoom;
private:
string bedRoom;
};
//全局函数
void goodFiendVisit(MyHouse& house) {
cout << "好朋友正在访问:" << house.settingRoom << endl;
cout << "好朋友正在访问:" << house.bedRoom << endl;
}
void goodFiendVisit2(MyHouse* house) {
cout << "好朋友正在访问:" << house->settingRoom << endl;
cout << "好朋友正在访问:" << house->bedRoom << endl;
}
int main() {
MyHouse house;
goodFiendVisit(house);
//MyHouse& h = house;
//goodFiendVisit(h);
MyHouse* hp = new MyHouse();
goodFiendVisit2(hp);
return 0;
}
类做友元
#include <iostream>
#include<string>
using namespace std;
class MyHouse;
class GoodFriend
{
public:
MyHouse* house;
GoodFriend();
void visit();
~GoodFriend() {
if (house != NULL) {
delete house;
house = NULL;
cout << "GoodFriend的析构函数被调用啦" << endl;
}
}
};
class MyHouse {
//GoodFriend是本类的朋友(友元),可以访问私有成员
friend GoodFriend;
public:
MyHouse();
public:
string settingRoom;
private:
string bedRoom;
};
GoodFriend::GoodFriend() {
house = new MyHouse();
}
void GoodFriend:: visit() {
cout<< "好朋友正在访问:"<<house->settingRoom<<endl;
cout<< "好朋友正在访问:"<<house->bedRoom<<endl;
}
MyHouse::MyHouse() {
settingRoom = "客厅";
bedRoom = "卧室";
}
void test() {
GoodFriend goodF;
goodF.visit();
GoodFriend* goodFP = new GoodFriend();
goodFP->visit();
delete goodFP;
}
int main()
{
test();
return 0;
}
成员函数做友元
#include <iostream>
#include<string>
using namespace std;
class MyHouse;
class GoodFriend
{
public:
MyHouse* house;
GoodFriend();
void visit();
void visit2();
~GoodFriend() {
if (house != NULL) {
delete house;
house = NULL;
cout << "GoodFriend的析构函数被调用啦" << endl;
}
}
};
class MyHouse {
//声明别的类的函数为本类的友元,可以访问本类的私有成员
friend void GoodFriend::visit();
public:
MyHouse() {
settingRoom = "-客厅";
bedRoom = "-卧室";
}
public:
string settingRoom;
private:
string bedRoom;
};
GoodFriend::GoodFriend() {
house = new MyHouse();
}
void GoodFriend::visit() {
cout << "正在访问:" << house->settingRoom << endl;
cout << "正在访问:" << house->bedRoom << endl;
}
void GoodFriend::visit2() {
cout << "正在访问:" << house->settingRoom << endl;
//cout << "正在访问:" << house->bedRoom << endl;
}
int main() {
GoodFriend gf;
gf.visit();
gf.visit2();
return 0;
}