一、全局函数做友元 (1)示例代码在程序中有些私有属性想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术 。友元的目的就是让一个函数或者类访问另一个类中的私有成员
#includeusing namespace std; class Building { //将全局函数void GoodFriend(Building *building)设为Building的友元,让他可以访问Building内的私有属性 friend void GoodFriend(Building* building); public: Building() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } public: string m_SittingRoom; //客厅 private: string m_BedRoom; //卧室 }; //全局函数 void GoodFriend(Building *building) { cout << "好朋友全局函数 正在访问:" << building->m_SittingRoom << endl; cout << "好朋友全局函数 正在访问:" << building->m_BedRoom << endl; } void test01() { Building building; GoodFriend(&building); } int main() { test01(); system("pause"); return 0; }
二、类做友元 (1)示例代码
#include三、成员函数做友元 (1)示例代码using namespace std; //类做友元 class Building; class GoodFriend { public: GoodFriend(); //构造函数 public: void visit(); //visit函数访问buliding类中的属性 Building * building; //创建一个buliding类的指针 }; class Building { friend class GoodFriend; //将GoodFriend设置为友类(不对其设防) public: Building(); //构造函数 public: string m_SittingRoom; //客厅,公共 private: string m_BedRoom; //卧室,私有 }; //类外写成员函数,构造函数 Building::Building() { //构造函数复制 m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } GoodFriend::GoodFriend() { //创建一个建筑物对象,用这个building对象去访问Building类中的是属性 building=new Building; } void GoodFriend::visit() { cout << "好友正在访问Buliding中的属性:" < m_SittingRoom<< endl; //客厅在公共属性中,可以直接访问 cout << "好友正在访问Building中的属性:" << building->m_BedRoom << endl; //卧室在私有属性中,将goodfriend设为友类后可以访问 } void test01() { GoodFriend a; a.visit(); } int main() { test01(); system("pause"); return 0; }
#include#include using namespace std; //好友类 class Building; class GoodFriend { public: GoodFriend(); public: void visit01(); //让visit01函数可以访问Building中的私有成员 void visit02(); //让visit02函数不可以访问Building中的私有成员 Building * building; }; //建筑类 class Building { friend void GoodFriend::visit01(); //告诉编译器GoodFriend类下的visit01函数作为本类的友类 public: Building(); public: string m_SittingRoom; private: string m_BedRoom; }; //类外初始化(构造函数和成员函数) Building::Building() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } GoodFriend::GoodFriend() { building = new Building; } void GoodFriend::visit01() { cout << "visit01函数正在访问:" << building->m_SittingRoom << endl; cout << "visit01函数正在访问:" << building->m_BedRoom << endl; } void GoodFriend::visit02() { cout << "visit02函数正在访问:" << building->m_SittingRoom << endl; //cout << "visit02函数正在访问:" << building->m_BedRoom << endl //visit02函数不是Building的友元,所以不能像visit01一样访问其私有属性 } int main() { GoodFriend a; a.visit01(); a.visit02(); system("pause"); return 0; }



