友元的目的就是让一个函数或者类访问另一个类中私有成员
友元的关键字:friend
友元的三种实现:
1.全局函数做友元
2.类做友元
3.成员函数做友元
一.全局函数做友元
#include <iostream>
using namespace std;
#include <cstring>class Building {//告诉编译器goodGay全局函数是Building类的好朋友,可以访问类中的私有内容friend void goodGay(Building *building);public:Building() {m_SittingRoom = "客厅";m_BedRoom = "卧室";}public:string m_SittingRoom;private:string m_BedRoom;
};//全局函数
void goodGay(Building *building) {cout << "好基友的全局函数 正在访问:" << building->m_SittingRoom << endl;cout << "好基友的全局函数 正在访问:" << building->m_BedRoom << endl;
}void test01() {Building building;goodGay(&building);
}int main() {test01();return 0;
}
二.类做友元
#include <iostream>
using namespace std;
#include <cstring>class Building ;
class GoodGay {public:GoodGay();public:void visit();Building *building;
};class Building {//GoodGay类是本类的好朋友,可以访问本类的私有成员friend class GoodGay;public:Building();public:string m_SittingRoom;private:string m_BedRoom;
};//类外写成员函数
Building::Building() {m_SittingRoom = "客厅";m_BedRoom = "卧室";
}GoodGay::GoodGay() {//创建建筑物对象building = new Building;
}void GoodGay::visit() {cout << "好基友正在访问:" << building->m_SittingRoom << endl;cout << "好基友正在访问:" << building->m_BedRoom << endl;}void test01() {GoodGay gg;gg.visit();
}int main() {test01();return 0;
}
三.成员函数做友元
#include <iostream>
using namespace std;
#include <cstring>class Building ;
class GoodGay {public:GoodGay();void visit();//让visit函数可以访问Building中私有成员void visit2();//让visit2函数不可以访问Building中私有成员Building *building;
};class Building {//告诉编译器 GoodGay类下的visit成员函数作为本类的好朋友,可以访问本类中的私有成员friend void GoodGay::visit();public:Building();public:string m_SittingRoom;private:string m_BedRoom;
};//类外写成员函数
Building::Building() {m_SittingRoom = "客厅";m_BedRoom = "卧室";
}GoodGay::GoodGay() {//创建建筑物对象building = new Building;
}void GoodGay::visit() {cout << "visit函数正在访问:" << building->m_SittingRoom << endl;cout << "visit函数正在访问:" << building->m_BedRoom << endl;}void GoodGay::visit2() {cout << "visit2函数正在访问:" << building->m_SittingRoom << endl;// cout << "visit2函数正在访问:" << building->m_BedRoom << endl;访问不到,因为visit2不是Building的友元
}void test01() {GoodGay gg;gg.visit();gg.visit2();
}int main() {test01();return 0;
}