天天看点

※C++随笔※=>☆C++基础☆=>※№→友元●友元函数●友元类●友元模板友元友元函数友元类友元模板

友元

        友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。

        注意:

                 不管是友元函数还是友元类,定义友元关系前必须先声明

友元函数

        友元函数是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。

        友元关系不具对称性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元关系不具传递性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。

        作用及特点

                友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。c++中的有眼为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。

                友元的正确使用能提高程序的运行效率,但同时也破坏了累的封装性和数据的隐藏性,导致程序可维护性变差。

友元类

        友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。

※C++随笔※=>☆C++基础☆=>※№→友元●友元函数●友元类●友元模板友元友元函数友元类友元模板

        C中声明A是其友元类,那么最基本的就是A可以使用C中的private方法或者对象。

        图中可见,A是B的基类,C是D的基类。ABCD中就有如下关系:

                1.B新增的方法不能访问C的私有成员

                2.B从A继承而来的方法可以访问C的私有成员

                3.A只能访问D中从C中继承而来的私有成员,D中新增的私有成员不能访问!

        总结起来:

  • (1)友元关系不可以继承,但对已有的方法来说访问权限不改变。
  • (2)如果改写基类的方法则访问权限改变
  • (3)友元关系不具有传递性

        若类B是类A的友元,类C是B的友元,类C不一定是类A的友元

友元模板

        友元除了前面讲过的函数和类以外,友元还可以是一个模板,即一个模板可以作另一个模板的友元。(即将函数或者类换成模板) 

类模板的模板友元函数定义

        1. 将友元模板函数(类)直接定义在类模板中。这种方式比较简单直接。  

        2. 将友元模板函数(类)声明在类模板中,定义在类模板之外。这种方式的写法,如果不小心,通常会出现编译没问题,链接时无法解析的错误,或者编译也可能会有错误

template<typename T, typename Compare> class AL_QueuePriorityList;
friend class AL_QueuePriorityList<T, Compare>;
           
template <typename T1, typename T2> void MyFucntion(T1 tTemplate1, T2 tTemplate2);
friend void MyFucntion<T1, T2>(T1 tTemplate1, T2 tTemplate2);
           

        二种方法都可取,不过个人感觉第一种方法比较好,也方便。第二种方法比较合适当程序比较大时,在头文件里使用指针时的声明情况。各有各的好,大家自己在实际应用中取舍好了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

以后的笔记潇汀会尽量详细讲解一些相关知识的,希望大家继续关注我的博客。

本节笔记到这里就结束了。

潇汀一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。

游戏开发的路很长很长,非常希望能和大家一起交流,共同学习,共同进步。

如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。

最后,谢谢你们一直的支持~~~