提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
C++ 友元
前言
提示:这里可以添加本文要记录的大概内容:
本人是一个大一萌新,之间有什么不足或bug欢迎各路大佬批评指正!!!也欢迎大家共同学习,共同进步!!!
提示:以下是本篇文章正文内容,下面案例可供参考
一、友元简介:友元函数在类的作用域之外被定义,不是类的成员函数,但具有访问类的public private protected成员的成员权限.
二、友元函数声明的一般形式:// friend <返回类型> <函数名> (<参数列表>); // 在类定义中函数原型前加friend 就将函数声明为该类的友元. // 声明这个友元函数可以在类的任何地方,可以访问友元函数的所有成员,所有成员函数; `` // 例如: #include友元函数的使用:using namespace std; class MyClass { public : MyClass(string name) { m_name = name; } friend void Display(MyClass &mycalss); // 友元函数 protected: string m_name; }; void Display(MyClass &mycalss) { cout << "Access Protected data : " << mycalss.m_name << endl; } // 此时访问了Myclass的protected变量 int main() { MyClass test("Class A"); Display(test); return 0; }
1.一个普通函数可以是多个函数的友元:
#includeusing namespace std; class MyClass_B; class MyClass_A { public : MyClass_A(string name) { m_name = name; } friend void Display(MyClass_A &myA,MyClass_B &myB); private : string m_name; }; class MyClass_B { public : MyClass_B(string name) { m_name = name; } friend void Display(MyClass_A &myA,MyClass_B &myB); private : string m_name; }; void Display(MyClass_A &myA,MyClass_B &myB) { cout << "MyClass A : " << myA.m_name << endl; cout << "MyClass B : " << myB.m_name << endl; } int main() { MyClass_A testA("Class A"); MyClass_B testB("Class B"); Display(testA,testB); return 0; }
2一个类的成员函数也可以是另一个类的友元:
#includeusing namespace std; class MyClass_B; class MyClass_A { public : MyClass_A(string name) { m_name = name; } void Function(MyClass_B &myB); private : string m_name; }; class MyClass_B { public : MyClass_B(string name) { m_name = name; } friend void MyClass_A::Function(MyClass_B &myB); private : string m_name; }; void MyClass_A::Function(MyClass_B &myB) { cout << myB.m_name << endl; } int main() { MyClass_A testA("Class A"); MyClass_B testB("Class B"); testA.Function(testB); return 0; }
3.整个类也可以是另一个类的友元:
#include总结:using namespace std; class MyClass_B; class MyClass_A { public : MyClass_A(string name) { m_name = name; } friend class MyClass_B; private : string m_name; }; class MyClass_B { public : MyClass_B(string name) { m_name = name; } void Display(MyClass_A &myA); private : string m_name; }; void MyClass_B::Display(MyClass_A &myA) { cout << myA.m_name << endl; MyClass_A test("test"); cout << test.m_name << endl; } int main() { MyClass_A testA("Class A"); MyClass_B testB("Class B"); testB.Display(testA); return 0; }
- 即使frinend函数的原型出现在类定义内,友元仍不是成员函数.
- private、protected、public这些成员访问说明符标志与友元的声明无关,也就是说友元可以定义在类的任何地方.
- 友元关系是授予关系,而不是索取.也就是说,要使类B成为类A的友元,类A必须在类中显式的声明类B是它的友元.
- 友元既不对称也不传递: 类A是类B的友元,类B是类C的友元,不能说明类B是类A的友元,类C是类B的友元,类A是类C的友元.怎么理解呢? 咱们把ABC当成三个人,A说B是我的朋友,B说C是我的朋友,但是B不一定承认A是它的朋友,所以B可以访问A的成员,但A不能访问的成员,同理BC也是. A说B是我的朋友,B说C是我的朋友也不能说明A是C的朋友.
以上就是今天要讲的内容,如有什么不足欢迎大家批评改正!!!



