zoukankan      html  css  js  c++  java
  • C++学习之友元类和友元函数

    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函数具体化,以此类推。通过在类的内部声明模板,可以创建非约束友元函数,即就是每个函数具体化都是每个类具体化的友元。对于非约束友元,友元模板类型参数与模板类类型参数是不同的

  • 相关阅读:
    深度学习100问
    BAT机器学习面试1000题系列
    深度学习项目——基于卷积神经网络(CNN)的人脸在线识别系统
    深入理解卷积层
    AI大道理头尾标识
    git-svn Manual Page
    收藏夹
    C语言 #、##、#@在#define中的用法
    ubuntu 编译安装自己的git-svn
    ALSA参考文档
  • 原文地址:https://www.cnblogs.com/sunfie/p/4394582.html
Copyright © 2011-2022 走看看