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

  • 相关阅读:
    类的多重继承
    实例属性和类属性
    协程
    nginx安装与配置
    Linux系统优化及状态监控
    MongoDb安全配置:简单的身份认证
    MongoDB YAML格式的配置文件
    yum使用,使用rpm指令安装rpm,使用dpkg指令安装deb
    MongoDB默认配置
    被锐速加防火墙坑了一下。。。
  • 原文地址:https://www.cnblogs.com/sunfie/p/4394582.html
Copyright © 2011-2022 走看看