C++学习笔记之——友元
来源:互联网 发布:java 适配器设计模式 编辑:程序博客网 时间:2024/06/05 18:39
为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。不过,类的访问权限确实在某些应用场合显得有些呆板,从而容忍了友元这一特别语法现象。
友元的作用:友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。c++中的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。
友元的特点:友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,导致程序可维护性变差。
友元的分类:类可以把一个普通函数定义成友元,也可以把其他类定义成友元,还可以把类的成员函数定义成友元。
下面,我们会具体了解友元的使用场景。我们以手机中常见的功能——便签做为例子来说明,在这里只是为了说明使用友元的情况,可能和实际有出路(我们并没有给出具体的实现,只是借这个例子说明情况)。
假设,我们的便签的管理上有一个专门的类CNoteMng,它负责管理所有的记录。
#ifndef __NOTE_MNG_H__#define __NOTE_MNG_H__#include <vector>#include <iostream>#include "Note.h"class CNoteMng{friend void DisplayNoteSum(void);public:explicit CNoteMng();~CNoteMng();//TODO:这里面有其他的一些实现private://TODO:这里面有其他的一些实现void ClearAllNote();std::vector<CNote> m_vecNote;};void DisplayNoteSum(void){std::cout << "DisplayNoteSum : " << m_vecNote.size() << std::endl;}#endif//#ifndef __NOTE_MNG_H__
我们能从类似资源管理器的软件中看的便签的统计。为此,我们的例子CNoteMng将统计便签数量的普通函数定义为友元。这就是类可以把一个普通函数定义成友元。
具体的一条记录的实现可能类似下面的实现:
#ifndef __NOTE_H__#define __NOTE_H__#include <string>class CNode{friend void CNoteMng::ClearAllNote();public:explicit CNode();~CNode();//TODO:这里还有其他的实现。private:void clear();//TODO:这里还有其他的实现std::string strTitle;//标题std::string strCreatTime;//创建日期std::string strContent;//内容};#endif//#ifndef __NOTE_H__我们希望CNoteMng能实现一个功能,该功能能清除掉所有的便签记录,为此我们在CNote中增加一个接口,可能实现为清除磁盘上的记录。并且我们希望这个接口被保护起来,为此我们声明为私有的。但我们为了在CNoteMng中的ClearAllNote()能使用这个私有接口,为此我们类成员函数定义为友元。这就是类可以把其他类的成员函数定义成友元。
如果我们还需要增加一项功能,该功能是,根据标题,创建日期,内容进行检索,并显示检索到的记录(我们可能需要遍历所有的记录,并进行比较,这样就需要操作到具体类CNode的私有成员)。为此,我们就需要在类CNode中定义CNoteMng为友元类。这就是类可以把其他类定义为友元类。
#ifndef __NOTE_MNG_H__#define __NOTE_MNG_H__#include <vector>#include <iostream>#include <string>#include "Note.h"class CNoteMng{friend void DisplayNoteSum(void);public:explicit CNoteMng();~CNoteMng();//TODO:这里面有其他的一些实现void SearchTitleAndPlay(std::string &strTitle);private://TODO:这里面有其他的一些实现void ClearAllNote();std::vector<CNote> m_vecNote;};void DisplayNoteSum(void){std::cout << "DisplayNoteSum : " << m_vecNote.size() << std::endl;}#endif//#ifndef __NOTE_MNG_H__
#ifndef __NOTE_H__#define __NOTE_H__#include <string>class CNode{friend CNoteMng;public:explicit CNode();~CNode();//TODO:这里还有其他的实现。private:void clear();//TODO:这里还有其他的实现std::string strTitle;//标题std::string strCreatTime;//创建日期std::string strContent;//内容};#endif//#ifndef __NOTE_H__
- 【C++】学习笔记五十二——友元
- C++学习笔记之——友元
- 【C++】【学习笔记】【020】友元
- C++ Primer 学习笔记 — 友元
- c++学习笔记之友元
- C++之友元学习笔记
- [C++]友元学习
- C++学习笔记33——友元
- C++学习笔记46——友元与继承
- Python学习笔记 —— 元组
- Python学习笔记——元组
- Objective-C学习笔记(六)——运算符之一元运算符
- 一步一步学习C++(类)之友元函数
- 【 Visual C++】游戏开发笔记之三——绘制图元
- 【 Visual C++】游戏开发笔记之三——绘制图元
- Visual C++】游戏开发笔记之三——绘制图元
- 【 Visual C++】游戏开发笔记之三——绘制图元
- 【 Visual C++】游戏开发笔记之三——绘制图元
- mybatis SQL性能调优
- 前端Sass回顾以及Compass入门小记
- 算法导论学习之分治法
- HDU
- 数据结构与算法入门
- C++学习笔记之——友元
- 打造网络营销利器-第3篇--站内链接-网站优化进阶
- 用C++实现的完全二叉树,实现前序遍历,中序遍历,后序遍历。
- Java程序规范
- 每天一个Linux命令(1):ls命令
- 在mybatis执行SQL语句之前进行拦击处理
- 精读前后端渲染之争
- Java的内部类和匿名内部类
- 重修大学JAVA课--应用类型比较器的实现方法:完善版