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