简介:友元函数分为友元类以及友元函数,它的重点在于能够调用一个被private(私有化)的类中的所以数据以及函数。你要知道一个类它是具有封装性的,因为它的数据被private,public.所以,friend 打破了这种封装性,也就可以调用其所在类所有数据。
友元
在局部打破程序封装性的一种手段
关键字:friend
友元函数:友元类
友元函数:
- 这个函数不属于类
- 这个函数可以在类外定义,也可以在类内定义,不管定义 在哪,都是一个普通的函数
- 有权访问和调用类的私有以及保护成员
友元类:
- 与目标无关的一个类
- 要在类外定义
- 友元类可以有权访问目标类的所有成员
友元的特点:
- 单方向
- 不传递
- 不继承
代码学习:(有注释)
#include<iostream> using namespace std; class MyStu{ int hp; int mp; public: friend class fStu;//声明友元类,说明fStu是MyStu的朋友,所以fStu 可以调用MyStu的 MyStu(){//所有数据 hp = 10; mp = 20; }//注意友元函数的写法,必须在参数体内写上这个类的应用,这样才能调用这个类的所有数据 friend int getHp(MyStu& s);//友元函数类中声明,类外定义 friend int getMp(MyStu& s){//友元函数类中声明并定义 return s.mp;//友元函数的声明要再类内,但是它只是一个普通的函数,不属于类 } }; int getHp(MyStu& s){//友元函数类外定义不用再写标志符friend; return s.hp; } class MyStu; class fStu{ public: fStu(){ } void setFsu(MyStu& s){//友元类中的相关函数如果要使用类中的数据,就要再函数的参数 s.mp = 100;//列表里加上类的引用。 s.hp = 200; } void getHM(MyStu& s){ cout << "友元类中的函数得到的hp,mp值:" << endl; cout << s.mp << " " << s.hp << endl; } }; int main(){ MyStu s; cout << "类中的友元函数得到的hp,mp值:" << endl; cout << getHp(s) << endl; cout << getMp(s) << endl; cout << "---------------------" << endl; fStu f; f.setFsu(s); f.getHM(s); return 0; }
运行结果:
附加图:不供参考(友元类和类的儿子是不继承的关系,但是友元类的儿子依然和类是友元关系)