加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2018-03-30 11:00:50)
分类: c及c_plus_plus
函数模板:c++编译器在编译时刻将函数模板实例化,自动完成
类模板:其实例化必须在程序中显示指定

        只有当代码中使用了类模板的一个实例名字,并且上下文环境要求必须存在类定义时,这个类模板才被实例化。并不是每次使用一个类都要求知道该类的定义。例如,如果我们只是声明一个类的指针和引用,就没有必要知道类的定义。例如:

class Matrix ;  
Matrix *pm ;  //声明一个类的指针,不需要Matrix的定义  
void inverse(Matrix&) ; //声明一个类的引用,不需要Matrix的定义  
Matrix m ;  //声明类的一个对象,需要Matrix的定义  

请指出下列哪些模板实例的使用会引起模板被实例化?

template  <   class Type   >  
class Stack { };  
  
void f1(Stack  <   char  >  ) ;   // (a)  
  
class Exercise  
{  
    // ...  
    Stack   <   double   >  &rsd ; // (b)  
    Stack  <   int  >   si ;      // (c)  
};  
  
int main()  
{  
    Stack  <  char  >   *sc ;   // (d)  
    f1(*sc) ;           // (e)  
    int iObj = sizeof(Stack  <  string  >  ) ;   // (f)  
}  

一一解答:

(a)、因为(a)处只是一个函数声明,类模板没有被实例化
(b)、因为这里声明的是一个引用,所以类模板没有被实例化
(c)、因为这里是定义一个类对象si,所以将类模板实例化了
(d)、因为这里声明的是一个指针,所以类模板没被实例化
(e)、sc是一个指针,这里是一个解引用操作,所以类模板被实例化了
(f)、因为sizeof会计算一个Stack类对象的大小,所以为了计算,类模板的被实例化了

类模板也在编译器被实例化不确定正确性,不过根据模板创建类型定义或者函数定义的过程便是模板的实例化。被激活的实例化,都只是实例化了模板的定义部分,不将其定义部分一起实例化,直到后面首次遇到实例化函数调用时才进行完整的实例化。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有