
- C++友元函数friend使用的学习总结
- 1. 友元函数简介
- 1.1 使用友元函数的目的
- 1.2 友元函数的三种实现方法
- 2.全局函数做友元
- 3.类做友元
- 4.成员函数做友元
- 注意!
允许一个函数或者类访问另一个类中的私有成员,使得两个类可以共享同一数据。
举个例子,有亲戚去你家拜访,那么客厅是所有人可见的(public类),但自己的房间就不太方便了(private类),不过自己的基友或者闺蜜可以进入你的房间,这就需要友元函数,这就是friend。
1.2 友元函数的三种实现方法- 全局函数做友元
- 类做友元
- 成员函数做友元
全局函数做友元,就是在类外定义一个全局函数,该全局函数传入一个类的指针或者引用。该类的公共成员可以直接调用,若将该全局函数作为友元写入类中,该函数就可调用私有成员。
代码如下:
#includeusing namespace std; class House { //设置全局函数bestFriend是类的好朋友,可以访问类中的私有成员m_BedRoom friend void bestFriend(House& house); public: House() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } string m_SittingRoom; //公共成员,客厅 private: string m_BedRoom; //私有成员,卧室 }; //通过全局函数实现 void bestFriend(House &house) //这里使用指针或者引用都可以 { cout << "好朋友全局函数 正在访问: " << house.m_SittingRoom << endl; cout << "好朋友全局函数 正在访问: " << house.m_BedRoom << endl; } void test01() { House house; //创建一个House类对象 bestFriend(house); //调用全局函数访问类中公有和私有成员 } int main() { test01(); return 0; }
其中,主要代码就一行:
friend void bestFriend(House& house);
在这里,设置全局函数bestFriend()是House类的友元,然后就可以访问类中的私有成员。
如果没有声明该函数为House类友元,则程序会出现如下报错:
设置友元后的代码运行结果:
类做友元,就是用类B中的函数去调用另一个类A中的私有成员,这需要在类A中将类B做为友元写入。
#includeusing namespace std; class House { //设置BestFriend为House类的友元,可以调用House的私有成员 friend class BestFriend; public: House() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } string m_SittingRoom; //公共成员,客厅 private: string m_BedRoom; //私有成员,卧室 }; class BestFriend { public: BestFriend() { house = new House; //创建House对象 } void visit() //参观函数,访问House中的属性 { cout << "好朋友正在访问: " << house->m_SittingRoom << endl; cout << "好朋友正在访问: " << house->m_BedRoom << endl; } House* house; }; void test01() { BestFriend bf; //创建好友对象 bf.visit(); //调用好友对象中的函数来访问House中的成员 } int main() { test01(); return 0; }
其中,主要代码为:
friend class BestFriend;
在这里,设置BestFriend为House类的友元,可以调用House的私有成员。
4.成员函数做友元成员函数做友元,就是如果要在类B中使用函数去调用类A中的私有内容,需要提前在类A中将该成员函数声明为友元。
#includeusing namespace std; class House; //先声明存在House这样一个类,因为BestFriend类中会调用到该类,而House类中也需要声明将BestFriend设置为友元 class BestFriend { public: BestFriend(); //此处只能先写出声明,需要在House类后再实现,原因与visit函数类似 void visit(); //让visit函数可以访问House中的私有内容 void visit2(); //让visit2函数不可以访问House中的私有内容 House* house; }; class House { //告诉编译器,BestFriend类中的visit成员函数是House类的友元,可以访问私有内容 friend void BestFriend::visit(); public: House() { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } string m_SittingRoom; //公共成员,客厅 private: string m_BedRoom; //私有成员,卧室 }; BestFriend::BestFriend() //对外实现BestFriend构造方法 { house = new House; //生成一个House类的指针对象house } void BestFriend::visit() //对外实现BestFriend类中visit函数 { cout << "visit函数正在访问:" << house->m_SittingRoom << endl; cout << "visit函数正在访问:" << house->m_BedRoom << endl; } void BestFriend::visit2() //对外实现BestFriend类中visit2函数 { cout << "visit2函数正在访问:" << house->m_SittingRoom << endl; //cout << "visit2函数正在访问:" << house->m_BedRoom << endl; //该行不可实现,因为该visit2函数不是House类的友元 } int main() { BestFriend bf; bf.visit(); bf.visit2(); return 0; }
其中,主要代码为:
friend void BestFriend::visit();
在这里,设置BestFriend类中的visit成员函数是House类的友元,可以访问House类中的私有内容。
注意! 与全局函数做友元所不同的是,类成员函数做友元不能把函数内容直接写在本类中,由于函数中使用到了House类中的私有内容,虽然之前提前声明了House类,但其私有内容还是不能获取,依然会报错提示House类中的私有成员不可访问:
但是,如果将该函数内容移动到House类后面就不会报错了,就当作顺便学习函数对外实现了吧哈哈~
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)