函数模板和类模板的实例化

分类: c及c_plus_plus |
函数模板:c++编译器在编译时刻将函数模板实例化,自动完成
只有当代码中使用了类模板的一个实例名字,并且上下文环境要求必须存在类定义时,这个类模板才被实例化。并不是每次使用一个类都要求知道该类的定义。例如,如果我们只是声明一个类的指针和引用,就没有必要知道类的定义。例如:
// ...
Stack <
double > &rsd ; // (b)
Stack <
int > si ;
// (c)
Stack <
char >
*sc ; // (d)
f1(*sc) ;
// (e)
int iObj = sizeof(Stack <
string > )
; // (f)
类模板:其实例化必须在程序中显示指定
class Matrix
;
Matrix *pm ;
//声明一个类的指针,不需要Matrix的定义
void inverse(Matrix&) ;
//声明一个类的引用,不需要Matrix的定义
Matrix m ;
//声明类的一个对象,需要Matrix的定义
请指出下列哪些模板实例的使用会引起模板被实例化?
template <
class Type >
class Stack { };
void f1(Stack
< char
> ) ; //
(a)
class Exercise
{
};
int main()
{
}
一一解答:
(a)、因为(a)处只是一个函数声明,类模板没有被实例化
(b)、因为这里声明的是一个引用,所以类模板没有被实例化
(c)、因为这里是定义一个类对象si,所以将类模板实例化了
(d)、因为这里声明的是一个指针,所以类模板没被实例化
(e)、sc是一个指针,这里是一个解引用操作,所以类模板被实例化了
(f)、因为sizeof会计算一个Stack类对象的大小,所以为了计算,类模板的被实例化了
类模板也在编译器被实例化(不确定正确性),不过根据模板创建类型定义或者函数定义的过程便是模板的实例化。被激活的实例化,都只是实例化了模板的定义部分,不将其定义部分一起实例化,直到后面首次遇到实例化函数调用时才进行完整的实例化。
前一篇:c++new运算符的几种用法
后一篇:利用链表进行多项式相加和相乘计算