免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
“模板”學(xué)習(xí)筆記(5)

=================編譯器處理函數(shù)模板的方法:實(shí)例化模板函數(shù)====================

      C++的編譯器在遇到一個(gè)函數(shù)模板的時(shí)候,它首先要做的是確定該函數(shù)的參數(shù),這就叫做把一個(gè)函數(shù)模板修改成一個(gè)具有具體參數(shù)的函數(shù)。這種方法一般而言是隱式轉(zhuǎn)換的,我們一般是看不見的,但是C++也提供了一種顯示轉(zhuǎn)換的方法,如下: 

template void Swap<int>(int &a,int &b);

      這就是實(shí)例化模板函數(shù)的聲明,上面這個(gè)式子把Swap()函數(shù)實(shí)例化為一個(gè)接受整型變量的函數(shù)。它與具體化函數(shù)模板不同之處在于:

  • 具體化函數(shù)模板告訴了編譯器利用此模板生成一個(gè)具體化了參數(shù)類型的重載函數(shù),這樣我們就可以通過該函數(shù)的定義來修改這個(gè)這個(gè)重載的函數(shù),從而達(dá)到功能升級(jí)的目的。比如說在《“模板”學(xué)習(xí)筆記(4)-----如何解決函數(shù)模板的重載問題》中,我們就在程序中重載了這個(gè)Swap()函數(shù),使它能夠在面對(duì)結(jié)構(gòu)體people類型的變量時(shí),只交換他們的年齡(age),而不交換他們的名字。
  • 實(shí)例化模板函數(shù)就不是這樣。編譯器根據(jù)其他已有模板的定義部分創(chuàng)建參數(shù)類型為一個(gè)準(zhǔn)確類型的參數(shù),這里實(shí)例化模板函數(shù)的作用只在于根據(jù)傳遞進(jìn)來的具體參數(shù)創(chuàng)建一個(gè)具體的重載函數(shù),而不會(huì)改變其定義的功能。比如說,Swap()模板函數(shù)接受的參數(shù)為ElementType &a和ElementType &b,而我們要傳遞兩個(gè)整型變量x和y的時(shí)候,編譯器就會(huì)自動(dòng)將Swap()函數(shù)聲明成這樣:
    void Swap(int &x,int &y);

    這就表示編譯器根據(jù)最初的函數(shù)模板Swap()生成了一個(gè)關(guān)于該Swap()函數(shù)的實(shí)例,這個(gè)過程就叫實(shí)例化模板函數(shù)。

      通過上面的比較我們就可以清楚的看出來,具體化函數(shù)模板其實(shí)是一個(gè)有針對(duì)性的構(gòu)思,而實(shí)例化模板函數(shù)卻是一個(gè)行為,一個(gè)真真切切的動(dòng)作。編譯器會(huì)根據(jù)我們定義的模板在最終生成一個(gè)實(shí)例化之后的模板函數(shù),我們就把這個(gè)由函數(shù)模板生成的函數(shù)叫做模板實(shí)例。而模板的定義在編譯前是不會(huì)生成這樣實(shí)例化的函數(shù)的,它只用于生成該函數(shù)的一個(gè)解決方案,^_^,也就是說,它為編譯器生成一個(gè)認(rèn)為可行的思路。所以說:

  • 顯式實(shí)例化模板函數(shù)是在編譯時(shí)根據(jù)某個(gè)非具體參數(shù)類型的函數(shù)模板創(chuàng)建了一個(gè)具體參數(shù)類型的完整函數(shù),由于他只是具體化了函數(shù)的參數(shù)類型,并沒有修改函數(shù)的功能,因此沒有必要,也不能夠重寫函數(shù)的定義部分;
  • 具體化函數(shù)模板則即具體化了函數(shù)的參數(shù)類型,又要修改函數(shù)的功能。

p.s. 如果我們實(shí)例化模板函數(shù)之后還修改了其定義,那么編譯器就會(huì)報(bào)錯(cuò),程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;
struct people
{
    char name[10];
    int age;
};
template<class ElementType>
void Swap(ElementType &a,ElementType &b)
{
    ElementType temp;
    temp=b;
    b=a;
    a=temp;
}
 
//template<>void Swap<people>(people &a,people &b)
void Swap<people>(people &a,people &b)
{
    int temp;
    temp=b.age;
    b.age=a.age;
    a.age=temp;
}
int main()
{
    int x=1,y=2;
    cout<<"交換之前,x="<<x<<"\ty="<<y<<endl;
    Swap(x,y);
    cout<<"交換之后,x="<<x<<"\ty="<<y<<endl;
    people person_1={"unqiue",22};
    people person_2={"jack",30};
    cout<<"交換之前,第一個(gè)人的名字叫:"<<person_1.name<<"\t年齡為:"<<person_1.age<<endl;
    cout<<"交換之前,第二個(gè)人的名字叫:"<<person_2.name<<"\t年齡為:"<<person_2.age<<endl;
    Swap(person_1,person_2);
    cout<<"調(diào)用具體化為people的Swap()函數(shù)的結(jié)果:"<<endl;
    cout<<"交換之后,第一個(gè)人的名字叫:"<<person_1.name<<"\t年齡為:"<<person_1.age<<endl;
    cout<<"交換之后,第二個(gè)人的名字叫:"<<person_2.name<<"\t年齡為:"<<person_2.age<<endl;
    return 0;
}

生成的錯(cuò)誤指向19行,錯(cuò)誤內(nèi)容就是““Swap”: 非法使用顯式模板參數(shù)”。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++語言的15個(gè)晦澀特性
C富有價(jià)值的函數(shù)重載,零基礎(chǔ)上手,一文解析C函數(shù)重載
01、C++函數(shù)的高級(jí)用法
C 模板詳解(一)
C++模板常用使用方法介紹
模板中的名字查找問題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服