• 童话故事 --- 类模板与函数模板的实例化


    摘要:函数模板的实例化,类模板的实例化,类模板和函数模板的实例化的比较

    高飞狗:

    Hi,黛丝!好久不见,最近可好?

    黛丝:

    你就别提了,烦得要死!

    高飞狗:

    有什么烦心事,跟我说说,看我能不帮你排忧解难?

    黛丝:

    历经千辛万苦,1个月内学习强国已经突破1000点大关。

    高飞狗:

    进步神速呀!

    黛丝:

    跟自己比,进步神速;可是跟别人比,落后得更神速!你说奇怪不奇怪?

    高飞狗:

    真够奇真够怪的!

    黛丝:

    高飞,你不会没事闲得无聊专程来听我诉苦的吧?

    我知道你无事不登八宝殿,有什么事你就直说。

    高飞狗:

    还是黛姐姐您最善解人意哪!

    我最近学习也变得非常刻苦,正在研究函数模板和类模板,什么显示explicit实例化,什么隐式implicit实例化,越学越晕,您能给讲解讲解吗?

    黛丝:

    你什么时候也变得勤奋好学起来了?

    看你态度这么真诚,我就把我知道的都抖落给你吧。

    黛丝:

    先说函数模板的实例化。

    函数模板实例化的方法有两种:隐式实例化和显式(明确)实例化。

    隐式实例化:应用程序调用了一个既未声明又未定义的函数。编译器就到函数模板库中查找同名函数模板,根据被调用函数的入口参数和返回值,确定相匹配的函数模板,并生成一个函数实例。隐式的意思就是应用程序未明确声明或定义函数实例。

    显式(明确)实例化:应用程序明确声明并定义了一个函数模板的实例,如下表所示。

                                 

    // 定义一个函数模板,返回两个数的小者   

    template     <typename T>   

    T min(const T     & a, const T & b)

    {

      return (a < b) ? a : b;   

    }   

    显式(明确)实例化

    template int     min <int> (const int & a, const int & b);   

    编译器遇到显式(明确)实例化语句,立即产生一个相应的函数实例   

                                         
    函数模板显式(明确)实例化的写法   
       

    正确写法

       
    尖括号部分是关键,C++ Primer V6书中的如下写法是正确的:   

    template int     min <int> (const int & a,     const int & b); 

       

    错误写法

       

    C++ Primer V5书中的如下写法是错误的:

    template int     min (const int & a, const int & b);   

                                         

    函数模板显式(明确)实例化后的调用方法  

       

    正确写法

       

    尖括号部分是关键:

    int c = min <int> (a, b);  

       

    错误写法

       
    没有尖括号部分是错误的   

    int c = min (a,     b);  

                                         

    取得显式(明确)实例化函数的地址或指针  

       

    正确写法

       

    尖括号部分是关键,函数名称就是函数地址。函数实例的名称必须包括类型信息

    auto fp = min     <int>; 或者auto fp = &min <int>;   

       

    错误写法

       

    没有尖括号部分是错误的

    auto fp =     min; 或者auto fp = &min;   

    函数实例的定义和声明

                                         

    函数实例的定义和声明方法 

       

    定义写法

       

    template int     min <int> (const int & a,     const int & b);

       

    声明写法

       
     关键字extern 表示声明而非定义   

    extern     template int min <int> (const int & a, const int     & b);

    编译器见到函数实例的定义,就产生一个函数实例。

    编译器见到函数实例的声明,就知道了调用这个函数实例的方式,也知道这个函数已在其它地方被定义,不必产生再一个函数实例。

    再来说类模板的实例化。

    类模板只有显式(明确)实例化,无法隐式实例化。比较简单,不再累述。

    把类模板和函数模板的实例化做个对比,如下图所示:

                                                                         

                                                                                                                                       
       

    情形

       
       

    编译器行为

       
       

    隐式实例化函数模板

       

    一定将实例代码链接进入可执行程序中,因为函数实例肯定被调用了。

       

    显式实例化函数模板,但未被应用程序调用

       

    实例代码不会被链接进入可执行程序中。因为未被调用,将其链接进入可执行程序中没有用。

    就如同我们定义了一个普通函数,但未被任何其它函数调用,其代码不会被链接进入可执行程序中。

       
       

    显式实例化函数模板,且被应用程序调用

       

    一定将实例代码链接进入可执行程序中

       

    实例化类模板,但应用程序未定义相应的对象

       

    实例代码不会被链接进入可执行程序中。因为未定义相应的对象,将其链接进入可执行程序中没有用。

       

    就如同我们定义了一个普通类,但未定义相应的对象,其代码不会被链接进可执行程序中。

       
       

    实例化类模板,且应用程序定义了相应的对象

       
       

    一定将实例代码链接进入可执行程序中

       

    另外,要重点提醒的是,尤其是在MCU上开发C++应用的朋友要注意:若类的对象是局部对象或全局对象,其生命周期贯穿整个应用程序,且其构造函数在main()函数之前被调用执行,所以这些对象的构造函数不可做太多工作。

    高飞:

    亲爱的,你讲得太清楚了,读书效率太低下,读你以分钟胜读十年书!

    黛丝:

    好你个油嘴滑舌!你说要给我排忧解难的,折腾半天,谁给谁排除万难了?

  • 相关阅读:
    關於GoogleUpdate.exe
    [ZT]网站优化之页面优化重新整理
    [ZT]企业建站常用中英文对照表
    "因為整合式windows驗證沒有啟用"解決方式
    模态与非模态的弹出窗口
    [ZT]ASP.Net常用正则表达式
    【ZT】基于.Net的SAP Portal开发
    .Net Quick start for the OpenFlashChart control
    微软将发布10款假补丁 测试Windows 7升级机制
    【ZT】Oracle初学者必知的100个问题
  • 原文地址:https://www.cnblogs.com/micemik/p/10692103.html
Copyright © 2020-2023  润新知