C++学习笔记-友元理论详解
来源:互联网 发布:复杂网络 机器人定位 编辑:程序博客网 时间:2024/05/19 22:01
友元、友元类、友元函数知识点总结
1、什么是友元?
由于有了类这样的机制,实现了数据的隐藏和封装,也就是说累的一般成员被定义为私有成员,成员函数一般被定义为公有的,
类内部的成员函数可以访问类中的私有成员,这样就实现了数据的隐藏。但是这样出现了一个问题,有时候需要定义
一个类外部的函数,但是这个函数又需要经常的访问类中的数据成员,这时候将这些函数定义为该函数的友元函数,就能够实
现非类内部的函数访问类中的私有成员。
友元实现了外部函数可以访问类内部私有成员的目的,但是它破坏了类的封装性和隐藏性。
那么这样更加灵活的方式是程序员在工程中根据需要而选择使用的。
所以没有一个规则是完美的,只有用在和合适的地方规则才是最贴切的。
2、友元函数
//友元函数可以访问类的私有变量,也可以访问私有函数
2.1、直接定义在类的内部
class mywindow
{
MainWindow *p;
void friend showwindow(mywindow *pwin)
{
pwin->p = new MainWindow;
pwin->p->show();
}
};
2.2、 声明在类的内部,需要加上friend,定义在类的外部,不需要加上friend
class mywindow
{
MainWindow *p;
void friend showwindow(mywindow *pwin);
};
void showwindow(mywindow *pwin)
{
pwin->p = new MainWindow;
pwin->p->show();
}
注意:
1)、友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
2)、一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
2)、友元函数的调用与一般函数的调用方式和原理一致。
3、友元类
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
friend class 类名;
其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
例如,以下语句说明类B是类A的友元类:
class A
{
…
public:
friend class B;
…
};
经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
友元的优点:
使得累的封装这个密不透风的墙,有了条件性的通道——在友元情况下,可以访问这面墙内部的私有成员;
友元的缺点:
破坏了封装性;
思想方法:
如果将类的封装比喻成一堵墙的话,那么友元机制就像墙上了开了一个门,那些得到允许的类或函数允许通过这个门
访问一般的类或者函数无法访问的私有属性和方法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。
参考:http://blog.csdn.net/adriano119/article/details/5914443
- C++学习笔记-友元理论详解
- 【C++】【学习笔记】【020】友元
- [c++] 友元详解
- [C++]友元学习
- 【C++】学习笔记五十二——友元
- Thinkcpp 学习笔记 友元
- C++学习笔记--友元
- C++友元学习笔记
- 浅谈元认知理论与学会学习
- 实例详解C++友元
- C++: 友元函数和友元类详解
- lua学习笔记16:table元表详解
- C++Primer学习笔记(使用类,友元,类转换)
- C++ Primer 学习笔记 — 友元
- c++学习笔记之友元
- [C++学习笔记]--友元、this指针
- 一.C++学习笔记-友元
- C++之友元学习笔记
- Spark知识点补充
- Java(Calendar)
- 带 -option的Shell脚本
- flume采集本地数据到hdfs
- 一致代码段和非一致代码段
- C++学习笔记-友元理论详解
- PATA-1007 Maximum Subsequence Sum (25)
- 详解URL的组成
- 今天决定写博客
- day19装饰模式和SystemInfo,ExceptionInfo
- 相机选型之一
- nodejs死亡笔记之实战篇---微信公众号的开发(1)
- TQ2440使用uboot下的命令行进行ftp下载程序到nand flash
- lua正则表达式判断手机号