C++学习之友元类和友元函数
      模板类声明也可以有友元,模板的友元可以分为以下几类:
       1.非模板友元;
       2.约束模板友元,即就是友元的类型取决于类被实例化的时候的类型;
       3.非约束模板友元,即就是友元的所有具体化都是类的每一个具体化的友元。
一、非模板友元
       在我们编程的时候可以在模板类中声明一个友元函数,如下面所示:
       template<class T>
       class lei
       {
            friend void show();
       }
       上述声明使得show()函数成为模板中所有实例化的友元,每产生一个实例化,它都拥有show()这个友元函数,但他是友元函数,不是成员函数,我们该如何调用他们呢?他是如何访问类的对象的呢?这将有很多种方法,他可以访问全局对象,可以使用全局指针来访问非全局对象,可以创建自己的对象,可以访问独立于对象的末班类的静态数据成员。假设我们要为友元函数提供模板类参数,我们必须指明具体化。假如要为上面的show()函数提供模板类参数,可以这样做:
        template<class T>

       class lei
       {
            friend void show(lei <T> & );
       }
show()函数本身不是模板参数,而只是使用一个模板做参数,这意味着必须为要使用的友元定义显示具体化,例如:void show(lei <int> &);
二、模板类的约束模板友元函数
      我们可以修改上面的lei的定义,是的show()函数本身成为模板。具体的说,为约束模板友元做准备,要使类的每一个具体化都获得与友元匹配的具体化。这个相对前面复杂一点,他主要由三步组成:

首先,在类定义的前面声明每个函数模板;
templeate <typename T> void show();
然后在函数中再次将模板声明为友元;
    template<class TT>

       class lei
       {
            friend void show<TT>();
       }
最后就是要为友元提供模板定义。
三、模板类的非约束模板友元函数
       约束模板友元函数是在类外面声明的模板的具体化。int类具体化获得int函数具体化,以此类推。通过在类的内部声明模板,可以创建非约束友元函数,即就是每个函数具体化都是每个类具体化的友元。对于非约束友元,友元模板类型参数与模板类类型参数是不同的

最新文章

  1. JVM监控工具介绍
  2. Android自动化学习笔记之Robotium:学习官网实例
  3. webform JS打印方法
  4. cordova常用资料源
  5. cloudera cdh native lib
  6. javascript的异步编程方法
  7. PAT乙级 1029. 旧键盘(20)
  8. 模板引擎doT.js介绍及如何判断对象为空、如何嵌套循环&#183;&#183;&#183;
  9. memcached全面剖析--3
  10. [TYVJ] P1015 公路乘车
  11. Unity 预处理命令
  12. DBCP连接池的使用
  13. java并发编程框架 Executor ExecutorService invokeall
  14. 自己动手实践 spring retry 重试框架
  15. 【安富莱专题教程第2期】uC/Probe简易使用说明,含MDK和IAR,支持F103,F407和F429开发板
  16. Python学习——python的常用模块
  17. Hello_Git!!!(Git的安装)
  18. 如何解决iOS界面操作导致导致NSTimer暂停计时的问题?
  19. 【js】横/纵向无缝滚动
  20. linux下WEB服务器安装、配置VSFTP

热门文章

  1. CSS实现倒影-------Day80
  2. MySQL 中文显示乱码以及中文查询条件返回0条结果的问题解决
  3. 关于FIND_IN_SET 和distinct 的坑爹的一天
  4. Extjs Store 的用法详解
  5. 内存(MRC)
  6. s3c6410学习笔记-烧写uboot+构建文件系统
  7. 得到IP包的数据意义(简单实现例子)
  8. 宏定义&amp;CodeBlocks&amp;Glib
  9. 数据库中字段类型对应C#中的数据类型
  10. linux note