五、友元
类的主要特点是数据隐藏,即类的私有成员无法在类的外部访问,但是,有时候需要在类的外部访问类的私有成员
解决方法就是使用友元函数,友元函数是一种特权函数, C++允许这个特权函数访问私有成员。可以理解为自己房间是私有空间,一般人都不允许访问,但是允许自己的好朋友访问,就相当于房间给好朋友开了特权
// 就是将全局函数放到类中做申明, 并且前面加上 friend #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std; class Building { // 让全局的好基友函数 变为我的好朋友 -- 友元函数 friend void googGay(Building * building); public: Building() { this->SittingRoom = "客厅"; this->BedRoom = "卧室"; } // 客厅, 卧室 string SittingRoom;// 客厅 private: string BedRoom; }; // 友元函数的目的就是访问类中的私有成员属性 // 全局函数 好基友 void googGay(Building * building) { cout << "好基友正在访问" << building->SittingRoom << endl; cout << "好基友正在访问" << building->BedRoom << endl; // 将好基友函数加入到友元函数就可以访问 } void test01() { Building *building = new Building; googGay(building); } int main() { test01(); return EXIT_SUCCESS; }
// friend class 类名 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std; class Building; class goodGay { public: goodGay(); void visit(); private: Building * building; }; class Building { // 让好基友类做 Building的友元类 friend class goodGay; public: Building(); string SittingRoom; private: string BedRoom; }; goodGay::goodGay() { building = new Building; } void goodGay::visit() { cout << "好基友正在访问 " << this->building->SittingRoom << endl; cout << "好基友正在访问 " << this->building->BedRoom << endl; } Building::Building() { this->SittingRoom = "客厅"; this->BedRoom = "卧室"; } void test01() { goodGay gg; gg.visit(); } int main() { test01(); return EXIT_SUCCESS; }
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> using namespace std; // 只让vist可以作为 Building 的好朋友, visit2不可以访问 Building 私有属性 class Building; class goodGay { public: goodGay(); void visit(); void visit2(); private: Building * building; }; class Building { // 让成员函数 visit 作为友元函数 friend void goodGay::visit(); public: Building(); string SittingRoom; private: string BedRoom; }; goodGay::goodGay() { building = new Building; } void goodGay::visit() { cout << "好基友正在访问 " << this->building->SittingRoom << endl; cout << "好基友正在访问 " << this->building->BedRoom << endl; } void goodGay::visit2() { cout << "好基友正在访问 " << this->building->SittingRoom << endl; // cout << "好基友正在访问 " << this->building->BedRoom << endl; 访问不到 } Building::Building() { this->SittingRoom = "客厅"; this->BedRoom = "卧室"; } void test01() { goodGay gg; gg.visit(); } int main() { test01(); return EXIT_SUCCESS; }
浙公网安备 33010602011771号