C++Note 友元
程序中,有些私有属性,也想让类外特殊的一些函数或者类进行访问
友元的目的是让 一个函数或者类 访问另一个类中的私有成员
友元的关键字:friend
友元的三种实现:
类做友元
全局函数做友元
成员函数做友元
1 #include <iostream> 2 using namespace std; 3 4 class Room 5 { 6 friend void GoodFirend(Room* rom);//类中声明 表明全局函数GoodFriend()为友元 7 public: 8 Room() 9 { 10 m_BedRoom = "卧室"; 11 m_SittingRoom = "客厅"; 12 } 13 public: 14 string m_SittingRoom;//客厅 15 private: 16 string m_BedRoom;//卧室 17 }; 18 void GoodFirend(Room *rom) 19 { 20 cout << "私密朋友可以访问" << rom->m_SittingRoom << endl; 21 } 22 void test() 23 { 24 Room r; 25 GoodFirend(&r); 26 }
友元类:
1 #include <iostream> 2 using namespace std; 3 class Room;// 声明 4 class GoodFriend 5 { 6 public: 7 GoodFriend(); 8 void visit(); 9 Room* room; 10 }; 11 class Room 12 { 13 friend class GoodFriend;//表明GoodFriend类为本类的友元 可以访问本类中的私有成员 14 public: 15 Room(); 16 public: 17 string m_SittingRoom;//客厅 18 private: 19 string m_BedRoom;//卧室 20 }; 21 GoodFriend::GoodFriend() 22 { 23 room = new Room;//实例化房屋 24 } 25 Room::Room()//类外写成员函数 前面Room表明是Room类 后面Room表明为构造函数Room 26 { 27 m_BedRoom = "卧室"; 28 m_SittingRoom = "客厅"; 29 } 30 void GoodFriend::visit() 31 { 32 cout << "私密朋友可以访问" << room->m_SittingRoom <<endl; 33 cout << "私密朋友可以访问" << room->m_BedRoom << endl; 34 } 35 void test() 36 { 37 GoodFriend gf; 38 gf.visit(); 39 }
成员函数做友元:
1 #include <iostream> 2 using namespace std; 3 class Room; 4 class GoodFriend 5 { 6 public: 7 GoodFriend(); 8 void visit();//让visit可以访问Room中私有成员 9 void visit2();//visit2不可以访问Room中私有成员 10 Room *room; 11 }; 12 class Room 13 { 14 friend void GoodFriend::visit(); 15 public: 16 Room(); 17 public: 18 string m_SittingRoom;//客厅 19 private: 20 string m_BedRoom;//卧室 21 }; 22 Room::Room()//类外实现成员函数 23 { 24 m_SittingRoom = "客厅"; 25 m_BedRoom = "卧室"; 26 } 27 GoodFriend::GoodFriend() 28 { 29 room = new Room; 30 } 31 void GoodFriend::visit() 32 { 33 cout << "visit可以访问" << room->m_SittingRoom << endl; 34 cout << "visit可以访问" << room->m_BedRoom << endl; 35 } 36 void GoodFriend::visit2() 37 { 38 cout << "visit2可以访问" << room->m_SittingRoom << endl; 39 //cout << "visit2可以访问" << room->m_BedRoom << endl; 40 } 41 void test() 42 { 43 GoodFriend gf; 44 gf.visit(); 45 gf.visit2(); 46 } 47 int main() 48 { 49 test(); 50 system("pause"); 51 return 0; 52 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)