C++友元
C++友元
关键词:friend
生活中你的家有客厅(public),有你的卧室(private)
客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去
但是,你也可以允许你的好友进去
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者说类 访问另一个类中私有成员
友元关键字为 friend
友元的三种实现:
全局函数做友元:
核心语句:
friend void goodGay(Building *building); //位于一个类的最顶端,无需说明此语句所属的权限
参考代码:
#include <iostream> //友元是一个全局函数 #include <string> using namespace std; //建筑物的一个类 class Building { //此处未声明权限(就是写到最上边就可以了后续相同) //核心语句: //goodGay全局函数是 Building的好朋友,可以访问Building中私有变量 friend void goodGay(Building *building); //语法 friend + 全局函数声明 public: Building()//创建一个默认构造函数进行初值的构造 { m_SittingRoom = "客厅"; m_BeRoom = "卧室"; } public: string m_SittingRoom;//客厅 private: string m_BeRoom;//卧室 }; //全局函数做友元 void goodGay(Building *building) { cout << "好基友的全局函数 正在访问:" << building->m_SittingRoom << endl; cout << "好基友的全局函数 正在访问:" << building->m_BeRoom<< endl; } void test01() { Building building;//创建一个对象 同时调用默认构造函数 goodGay(&building); } int main() { test01(); system("pause"); return 0; }
类做友元:
核心语句:
friend class GoodGay; //同样位于类中的最上方,无需说明其所处的权限
参考代码:
#include <iostream> //友元是一个类,此处成员函数在类外进行实现。 #include <string> using namespace std;//顺带实现了一下类外写成员函数 //类做友元 class Building;//类的声明 class GoodGay { public: GoodGay(); void visit();//参观函数 访问Building中的属性 Building * building; }; class Building { //核心语句: //GoodGay类是本类的好朋友类,可以访问本类中私有的成员 friend class GoodGay; //语法 friend + 类的声明 public: Building(); public: string m_SittingRoom; //客厅 private: string m_BeRoom; //卧室 }; //类外写成员函数 Building::Building()//默认构造函数 { m_SittingRoom = "客厅"; m_BeRoom = "卧室"; } GoodGay::GoodGay()//默认构造函数 { //创建建筑物对象 building = new Building; } void GoodGay::visit() { cout << "好基友类正在访问:" << building->m_SittingRoom << endl; cout << "好基友类正在访问:" << building->m_BeRoom << endl; } void test01() { GoodGay G; //调用两个类的构造函数 (先是GoodGay的,然后由于在GoodGay中有创建一个Building的指针变量) G.visit(); } int main() { test01(); system("pause"); return 0; }
成员函数做友元:
核心语句:
friend void GoodGay::visit(); //相比于上一个类做友元,这里是类中的一个成员函数可以对另一个类的私有成员进行访问 //所以为了区别 使用了类中的另一个成员函数来与之进行比较。
参考代码:
#include <iostream> //使用类中的成员函数来作为友元 #include <string> using namespace std; class Building; //类的声明,防止编译器运行时未看到此类定义而报错 class GoodGay //定义一个好基友的类 { public: GoodGay(); void visit(); //让visit函数可以访问Building中的私有成员 void visit2(); //让visit2函数无法访问Building中的私有成员 Building *building; }; class Building //定义一个建筑物的类,想要通过 { //核心语句: //基友类GoodGay中的成员函数visit是Building的好朋友,可以访问Building中的私有变量 friend void GoodGay::visit(); //语法:friend+"成员函数的声明" //(即要表明这个成员函数是在哪一个类的作用域下) public: Building(); public: string m_SittingRoom; private: string m_BeRoom; }; //在类外实现成员函数 Building::Building() { m_SittingRoom = "客厅"; m_BeRoom = "卧室"; } GoodGay::GoodGay() { building = new Building; } void GoodGay::visit()//此成员函数可以访问私有变量 { cout << "好基友visit正在访问:" << building->m_SittingRoom << endl; cout << "好基友visit正在访问:" << building->m_BeRoom << endl; } void GoodGay::visit2()//此成员函数不可以访问私有变量 { cout << "visit2正在访问:" << building->m_SittingRoom << endl; //cout << "好基友正在访问:" << building->m_BeRoom << endl; //由于没有设置为友元所以不能访问 } int main() { GoodGay G; G.visit(); G.visit2(); system("pause"); return 0; }
本文作者:编程初学者求大佬指点
本文链接:https://www.cnblogs.com/fragmentary/p/16396497.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步