c++的友元
来源:互联网 发布:下三白眼怎么矫正 知乎 编辑:程序博客网 时间:2024/04/30 00:57
来说点简单的东西吧,c++的友元。
c++是一门面向对象的语言,说到面向对象,就肯定要想起其3大特性:封装、继承和多态。类中的私有成员是不可被外界访问的,这是数据的封装性。然而,在有些场合,为了程序的高效性,外部想要直接访问类的私有成员,这现实吗?在c++语言里,可以实现。这就是友元。
直接上代码:
class cls{private: int x;public: cls(int a) : x(a) {} int getVar() { return x; }};int main(void){ cls c(6); std::cout << "c.x = " << c.x << std::endl; //不用说,直接访问私有成员肯定编译报错 std::cout << "c.x = " << c.getVar() << std::endl; return 0;}
main函数作为cls类的一个外部函数,想要访问cls私有成员,有一个办法就是让main()函数声明为cls类的友元函数:
class cls{private: int x;public: cls(int a) : x(a) {} int getVar() { return x; } friend int main(void);};
如此,编译通过且能正确运行了。
在类中用friend关键字对函数或者类进行声明,就可将该函数或者类声明为友元。需要注意的是,千万不用以为main()函数此时变成cls类的成员函数!~它依旧是个外部函数,只是是一个具有访问本类任何成员,包括私有成员的外部函数。当然啦,要访问非静态的成员函数/变量,还是要先实例化类。
友元是c++中发生在函数与类之间,或者类与类之间的一种关系,这种关系是单向的。例如,类a是类b的友元类:
class a{ //...};class b{ //... friend class a;};
因为友元关系是单向的,所以类a的所有成员函数可以访问类b的所有成员变量/函数,但反过来则不可以,类b的所有成员函数不可以访问类a的私有成员。
除了单向,友元关系还是不能传递的。例如类b是类a的友元类,类c是类b的友元类:
class a{ //... friend class b;};class b{ //... friend class c;};class c{ //...};
由于友元关系不可传递,所以类c并非类a的友元类。
友元的诞生是为了兼顾c语言的高效,但是它会破坏了面向对象语言的封装性,在软件工程中似乎被逐渐遗弃,在c++之后诞生的语言,如java、c#等,也都已经不存在友元这种关系了。c++友元的使用,开发者需要考虑其必要性了。
阅读全文
0 0
- c++-类的友元
- c++【友元】的一些用法
- [C++]友元关系的继承性
- C++:友元3(复数的加法)
- C ++友元的浅析(一)
- C++(一)友元
- [C++]友元学习
- [c++]友元函数
- [c++] 友元详解
- 【C++】友元函数
- c++:友元函数
- C++:友元函数
- C++:友元
- C/C++ 友元
- 【C++】友元函数
- C++:友元
- C++----友元
- 【C++】C++友元
- ME01创建货源清单函数、BAPI
- 什么是彩虹表?
- 12
- js对字符串提取操作的方法
- jfinal 基础教程视频
- c++的友元
- FileReader实现上传图片时的图片预览
- 聊一聊计算机的原码,反码,补码
- Java实现画图面板
- 深入分析java线程池的实现原理
- docker 构建 jdk1.8 tomcat images
- 深入理解HashMap
- 系统时间获取
- spring boot入门