c++中的友元

📅 发布时间:2026/8/31 7:37:34
c++中的友元
一、友元的目的与作用友元是让一个函数或者类访问另一个类中的私有成员关键字为friend。、二、友元的三种实现1. 全局函数作为友元格式friend 返回值类型 函数名();全局函数作为友元的时候全局函数能够访问该类中的所有成员。下面的例子中全局函数Function1()是该class Building所钦定的友元所以该全局函数能够访问Building类的私有成员。#includeiostream using namespace std; class Building { friend void Function1(); private: int a 1; public: int b; }; //全局函数做友元 void Function1() { Building bu; bu.a 12; //这样得以修改私有成员变量的值 cout bu.a endl; } int main() { Function1(); }2.类作为友元格式friend class 类名;下面的例子中类Enterprise{}是class Building的友元所以该类能够访问友元的私有成员。#includeiostream using namespace std; class Building { friend class Enterprise; private: int a 100; }; class Enterprise { public: Enterprise() { building new Building; } void visit() { cout building-a endl; } Building* building; }; int main() { Enterprise ep; ep.visit(); return 0; }上面的代码中通过建立友元关系是Enterprise{}能够访问类Building中的私有成员。3.成员函数作为友元格式friend 返回值类型 类名::成员函数();下面的例子中类Enterprise()的成员函数B()是类Building的友元能够访问Building的私有成员。#includeiostream using namespace std; class Building; class Enterprise { public: Enterprise(); ~Enterprise(); void B(); private: Building* b; }; class Building { friend void Enterprise::B(); private: int a 100; public: Building() { cout Building created endl; } }; Enterprise::Enterprise() { b new Building(); } Enterprise::~Enterprise() { delete b; } void Enterprise::B() { cout 访问Building私有成员a: b-a endl; } int main() { Enterprise e; e.B(); return 0; }在该程序中要搞清楚几个问题为什么先声明Building类是因为在Enterprise类中创建了Building的指针便于“Enterprise类通过该指针访问Building类的成员”。而如果不事先声明Building类的话就会导致编译器在执行Enterprise时找不到Building或者是不知道Building是个什么东西进而报错。为什么先声明Enterprise类中的成员函数Building类需要知道Enterprise::B()这个函数的存在用于友元声明但Enterprise::B()的实现需要使用Building的完整定义要访问私有成员。这就形成了循环依赖需要通过合理的声明顺序来解决。完整的编译过程如下三、友元使用的注意事项友元破坏了封装性相当于构建了特权类/函数应谨慎使用友元关系不能被继承友元关系是单向的不具有交换性。若类B是类A的友元那类A就不一定是类B的友元具体要看类中是否有相应的声明。友元关系不能传递。若类B是类A的友元类C是类B的友元则类C不一定是类A的友元同样要看类中是否有相应的声明。