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

  • 相关阅读:
    大一秋学期记录
    韦尼克区受损者如何说话
    暑假训练idea汇总
    高三树洞
    OI回忆录
    NOI2018游记
    收藏
    PKUSC2018游记
    CTSC/APIO2018游记
    Caused by: org.xml.sax.SAXParseException: 外部 DTD: 无法读取外部 DTD 'mybatis-generator-config_1_0.dtd'
  • 原文地址:https://www.cnblogs.com/sunfie/p/4394582.html
Copyright © 2020-2023  润新知