青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

c++模板基礎(chǔ)

只有使用C++語(yǔ)言的少數(shù)用戶(hù)才努力嘗試去理解模板的基本原理。然而那些希望去探索更多高級(jí)用法的人往往發(fā)現(xiàn)自己需要努力去理解模板是如何被語(yǔ)言所支持的,因?yàn)槿狈γ鞔_的說(shuō)明。一個(gè)很大的問(wèn)題在于一些工具只實(shí)現(xiàn)了C++標(biāo)準(zhǔn)的一個(gè)子集。本文將指出它們共同的缺陷并深入剖析如何使用C++模板快速產(chǎn)生可重用和高效的代碼。

模板功能應(yīng)用的典型是通過(guò)一系列模板類(lèi)形成的完整類(lèi)庫(kù),特別是STL和ATL。標(biāo)準(zhǔn)C++庫(kù)(STL)提供了很多可重用和靈活的類(lèi)及算法,而ATL則是使用C++進(jìn)行COM編程的事實(shí)標(biāo)準(zhǔn)。要掌握這些及其它的模板庫(kù),理解模板是如何工作的這一基礎(chǔ)是非常重要的。

函數(shù)模板

int main()
{
    0 cout<<add(2,3)<<endl;
    1 cout<<add(2.1,3)<<endl;
    2 cout<<add(2,3.2)<<endl;
    3 cout<<add(2.2,3.3)<<endl;
    4 cout<<add("hello eone ","world")<<endl;
    return 0;
}

     也可以通過(guò)宏定義#define add(a,b) ((a)+(b))來(lái)實(shí)現(xiàn),但是指針(字符串)不能直接相加.對(duì)于2,3,4需要進(jìn)行模板特化.

通過(guò)重載函數(shù),我們能夠完成多種不同數(shù)據(jù)類(lèi)型的相同操作。要實(shí)現(xiàn)兩個(gè)double數(shù)值的加法和兩個(gè)整數(shù)類(lèi)型的加法,我們可以使用一個(gè)重載函數(shù):

int add(const int x, const int y)

{

return x + y;

}

double add(const double x, const double y)

{

return x + y;

}

這時(shí),編譯器將根據(jù)它們的參數(shù)正確地解決這一問(wèn)題。

// 調(diào)用int add(const int, const int);

const int z1 = add(3, 2);

// 調(diào)用double add(const double, const double);

const double z2 = add(3.0, 2.0);

如果我們需要處理其它類(lèi)型,我們就不得不提供其他函數(shù)重載。對(duì)每個(gè)不同的數(shù)據(jù)類(lèi)型實(shí)現(xiàn)一個(gè)函數(shù)重載,它們都遵循相同的模式,每當(dāng)我們需要調(diào)用針對(duì)某一數(shù)據(jù)類(lèi)型的函數(shù)時(shí),原則上編譯器為我們生成相應(yīng)的代碼。而一個(gè)模板函數(shù)則以如下方式實(shí)現(xiàn):

template<class T>

const T add(const T &t1, const T &t2)

{

return t1 + t2;

}

從概念上來(lái)說(shuō),編譯器通過(guò)模板關(guān)鍵字(后面跟隨著模板由一或多個(gè)模板參數(shù)構(gòu)成的參數(shù)列表)來(lái)識(shí)別模板。當(dāng)為某一具體類(lèi)型調(diào)用add時(shí),編譯器將根據(jù)模板定義并用給定的類(lèi)型替換出現(xiàn)在模板中的參數(shù)。在這個(gè)例子中,模板參數(shù)列表由一個(gè)獨(dú)立的類(lèi)型模板參數(shù)T構(gòu)成。使用一個(gè)模板函數(shù)替代函數(shù)重載,編譯器可以自動(dòng)為所需的新類(lèi)型生成代碼

我們可以對(duì)任何擁有+操作符定義的類(lèi)型使用add模板。假設(shè)一個(gè)自定義的String類(lèi)提供了字符串連接并知道如何將自身寫(xiě)入到std::ostream。因?yàn)镾tring與該模板函數(shù)兼容,因此我們可以調(diào)用它來(lái)實(shí)現(xiàn)字符串相加:

// 示例字符串

const string strBook("book");

const string strWorm("worm");

// 顯示 "bookworm".

cout << add(strBook, strWorm) << endl;

Seeing that we intended to add two String values, the compiler will generate the appropriate add function on our behalf, which would look something like:

const String add(const String &t1, const String &t2)

{

return t1 + t2;

}

顯式實(shí)例化

調(diào)用模板函數(shù)時(shí),編譯器將先把正確的類(lèi)型實(shí)例化模板。雖然標(biāo)準(zhǔn)允許顯式模板實(shí)例化,然而并非所有廠商都能夠正確地實(shí)例它。例如,Visual C++ 6.0 會(huì)潛在地調(diào)用錯(cuò)誤的函數(shù)::

template<class T>

int getSize(void) {

return sizeof(T);

}

// 輸出4,應(yīng)該為8

cout << "double: " << getSize<double>() << endl;

// 輸出4,正確

cout << "int: " << getSize<int>() << endl;

跨平臺(tái)代碼設(shè)計(jì)者不希望依賴(lài)于顯式模板函數(shù)實(shí)例化,除非有更好的編譯器能夠?qū)λ峁┯行У闹С?

 

 

類(lèi)似于函數(shù)模板,模板也可以應(yīng)用于類(lèi)。模板可以用于根據(jù)普通模式提供一系列類(lèi)。如果我們需要一套完整的算術(shù)運(yùn)算來(lái)補(bǔ)充add函數(shù),我們可以考慮使用一個(gè)類(lèi)。通過(guò)模板,它就可以根據(jù)類(lèi)型參數(shù)化為一個(gè)普通類(lèi):

template<class T>

class CCalculator

{

public:

CCalculator(const T &x, const T &y) : m_x(x), m_y(y){ }

~CCalculator(void){ }

const T add(void){ return m_x + m_y; }

const T sub(void){ return m_x - m_y; }

const T mult(void){ return m_x * m_y; }

const T div(void){ return m_x / m_y; }

private:

const T m_x;

const T m_y;

};

要實(shí)例化模板類(lèi),我們需要提供一個(gè)指定類(lèi)型:

// 創(chuàng)建一個(gè)整數(shù)計(jì)算對(duì)象

CCalculator<int> calc(5, 2);

// 結(jié)果應(yīng)該為 10

const int z = calc.mult();

如函數(shù)模板一樣,編譯器為模板不同類(lèi)型的引用創(chuàng)建不同的類(lèi)。這為代碼重用提供了一個(gè)強(qiáng)大的機(jī)制,允許單個(gè)模板用于任何兼容的數(shù)據(jù)類(lèi)型

模板編輯模型

在編寫(xiě)模板類(lèi)時(shí),函數(shù)定義通常與它們的聲明一起保存在頭文件中,而不使用另外的.cpp文件。否則可能會(huì)導(dǎo)致鏈接錯(cuò)誤。這是因?yàn)榇蠖鄶?shù)編譯器要求模板定義在以頭文件為單位的轉(zhuǎn)譯單元中有效

這個(gè)行為的原因是模板只是一個(gè)模式,同樣它們不直接產(chǎn)生代碼(直到編譯器遇到一個(gè)應(yīng)用實(shí)例)。如果我們創(chuàng)建一個(gè)CCalculator<int> 實(shí)例并調(diào)用其中的某個(gè)類(lèi)方法,編譯器將需要找到函數(shù)定義。如果頭文件中包含了該定義則一切都會(huì)是正確的。但是如果定義存在于.cpp文件中,編譯器不能期望在此時(shí)找到匹配的模式并利用其產(chǎn)生所需的代碼。然而,C++標(biāo)準(zhǔn)提供了一個(gè)機(jī)制對(duì)編譯器進(jìn)行輔助。Export關(guān)鍵字可以使通知編譯器我們提供了一個(gè)分離的編輯模板:

// MyTemplateFunction.h

template<class T>

void myTemplateFunction(const T &t1);

// MyTemplateFunction.cpp

export template <class T>

void myTemplateFunction(const T &t1)

{

...

}

現(xiàn)在,大多數(shù)編譯器要求模板定義通過(guò)頭文件包含被顯式添加到轉(zhuǎn)譯單元,雖然標(biāo)準(zhǔn)期望能夠獨(dú)立定義于.cpp文件中。這兩個(gè)不同的模板編輯模型即為包含模型和分離模型。在編寫(xiě)時(shí),我所知的支持分離模型的唯一的編譯器是Comeau C++。Comeau 的使用了不少方法來(lái)實(shí)現(xiàn)對(duì)標(biāo)準(zhǔn)中所定義的export關(guān)鍵字用法,但目前也還只是beta版本而已

typename關(guān)鍵字

另一個(gè)與模板相關(guān)的關(guān)鍵字是typename關(guān)鍵字,它有兩種用法。參數(shù)下面的模板類(lèi):

template<class T>

void myFunction(void)

{

// 這里可能會(huì)有問(wèn)題

T::x1 * x2;

}

初次講到的時(shí)候可能會(huì)以為myFunction聲明了一個(gè)T::x1類(lèi)型的指針變量x2。然而,這個(gè)函數(shù)也能夠表示類(lèi)T的成員變量x1與全局變量x2的二進(jìn)制乘法操作。使用typename關(guān)鍵字可以告訴編譯器某個(gè)未知標(biāo)識(shí)符是一個(gè)類(lèi)型:

// T:x1 是一個(gè)類(lèi)型,而x2是一個(gè)指針

typename T:x1* x2;

第二種用法是在指定模板參數(shù)時(shí)替換class關(guān)鍵字:

// 下面的兩種方法是等效的...

template<class T1, class T2>;

template<typename T1, typename T2>;

標(biāo)準(zhǔn)允許以上任意一種方法,它們都是合法的。

成員函數(shù)模板

除了全局模板函數(shù)外,語(yǔ)言也支持成員模板函數(shù):一個(gè)類(lèi)可以擁有帶有模板參數(shù)列表的成員函數(shù)。參考下面的非模板類(lèi),它的構(gòu)造函數(shù)被模板化:

class CTypeSize

{

public:

template<class T>

CTypeSize(const T &t1) :

m_nSize(sizeof(t1))

{

}

~CTypeSize(void){ };

int getSize(void) const{ return m_nSize; }

private:

const int m_nSize;

};

當(dāng)模板成員函數(shù)被調(diào)用時(shí),編譯器使用模板模式為給定類(lèi)型生成代碼。這種情況下,我們能夠使用任意類(lèi)型變量創(chuàng)建一個(gè)CtypeSize實(shí)例:

// 顯示12

CTypeSize t1("Hello World");

cout << t1.getSize() << endl;

// 在VC++6/Win32中顯示8

CTypeSize t2(7.0);

cout << t2.getSize() << endl;

某些時(shí)候,成員模板是實(shí)現(xiàn)拷貝構(gòu)造函數(shù)最有效的方法,參考一個(gè)只有一個(gè)交易會(huì)的簡(jiǎn)單容器類(lèi):

template<class T>

class CSingle

{

public:

CSingle(const T &t1) : m_Value(t1) { }

~CSingle(void){ }

T m_Value;

};

它導(dǎo)致下面的問(wèn)題:

// 創(chuàng)建一個(gè)整數(shù)容器

CSingle<int> x(7);

// 這里需要一個(gè)拷貝構(gòu)造...

CSingle<double> y(x);

通過(guò)使用成員模板,拷貝構(gòu)造就能夠輕松完成:

template<class S>

CSingle(const CSingle<S> &s1) : m_Value(s1.m_Value) { }

當(dāng)編輯器能夠?qū)㈩?lèi)型T的實(shí)例轉(zhuǎn)換為類(lèi)型S時(shí),這是可行的;這是因?yàn)閐ouble可以從一個(gè)整數(shù)構(gòu)造。

總結(jié)

模板是C++的一個(gè)強(qiáng)大特征,它允許從數(shù)據(jù)類(lèi)型中抽象出算法。本文介紹了模板定義和實(shí)例化的基礎(chǔ),包括函數(shù)、類(lèi)及成員模板的區(qū)別。

posted on 2008-09-01 12:10 肥仔 閱讀(679) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++ 模板

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久人人爽人人| 麻豆九一精品爱看视频在线观看免费| 免费观看在线综合色| 老司机精品视频网站| 国产亚洲午夜高清国产拍精品| 亚洲小视频在线观看| 午夜精品在线| 国产精品高潮呻吟久久av黑人| 亚洲精品欧美日韩| 一区二区三区视频在线| 欧美日韩二区三区| 制服丝袜亚洲播放| 欧美一区二区三区免费大片| 国产农村妇女精品一二区| 亚洲免费中文字幕| 久久精品最新地址| 韩国女主播一区二区三区| 久久国产黑丝| 欧美电影资源| 一区二区国产在线观看| 欧美视频日韩视频在线观看| 亚洲素人一区二区| 欧美中文字幕在线观看| 激情综合激情| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲国产精品一区制服丝袜| 亚洲精品一区二区三区四区高清| 欧美日本视频在线| 亚洲午夜伦理| 看片网站欧美日韩| 亚洲最新色图| 国产精品一区毛片| 久久精品国产免费观看| 欧美成人精品1314www| 99国产精品99久久久久久粉嫩| 欧美区在线观看| 亚洲综合日本| 欧美va亚洲va日韩∨a综合色| 亚洲美女精品一区| 国产精品视频大全| 免费在线看成人av| 亚洲一二三区精品| 欧美不卡视频一区| 亚洲一级免费视频| 在线免费观看视频一区| 欧美日韩一区二区精品| 久久精品女人| 夜夜夜久久久| 免费日韩av电影| 亚洲女女女同性video| 在线观看视频日韩| 国产精品久久久久久久久久妞妞| 久久久久久黄| 一区二区久久| 欧美成人情趣视频| 午夜精品成人在线视频| 亚洲日本成人网| 国产亚洲欧美日韩在线一区| 欧美日韩免费精品| 久久综合网络一区二区| 亚洲欧美日韩国产一区二区| 最近看过的日韩成人| 久久夜色精品国产亚洲aⅴ | 亚洲国产成人久久综合| 欧美视频精品在线| 裸体丰满少妇做受久久99精品 | 日韩天天综合| 国产亚洲一区二区三区| 欧美日韩一区二区三| 久久影院午夜论| 午夜精品久久久| 亚洲六月丁香色婷婷综合久久| 久久综合九色99| 欧美一区二区大片| 一区二区三区四区精品| 亚洲高清精品中出| 激情久久久久久久| 国产精品一区二区你懂得 | 噜噜噜在线观看免费视频日韩| 亚洲一区二区三区久久| 亚洲激情成人在线| 1024欧美极品| 一区二区三区我不卡| 国产精品网站一区| 国产精品久久一级| 国产精品qvod| 欧美午夜电影网| 欧美日韩成人综合天天影院| 免费在线观看精品| 久久一区中文字幕| 久久视频国产精品免费视频在线| 午夜在线电影亚洲一区| 亚洲一区二区动漫| 亚洲一级黄色av| 中文日韩在线视频| 在线中文字幕日韩| 在线视频日韩精品| 亚洲一区二区三区免费视频 | 91久久久在线| 亚洲国产精品久久久久| 国产一区二区三区视频在线观看| 国产日韩欧美视频在线| 国产日韩精品在线播放| 国产一区二区成人| 激情综合色综合久久| 伊人一区二区三区久久精品| 黄色精品网站| 在线看日韩av| 亚洲人成网站在线观看播放| 亚洲欧洲在线视频| 一本色道久久综合| 在线一区二区三区四区| 国产精品99久久久久久人| 日韩一级黄色av| 亚洲免费视频观看| 欧美综合激情网| 久久免费视频网站| 欧美风情在线观看| 亚洲美女淫视频| 亚洲午夜一区| 久久99在线观看| 久久久免费观看视频| 免费观看30秒视频久久| 欧美国产大片| 欧美性事在线| 国产一区二区三区免费在线观看 | 午夜宅男欧美| 久久蜜桃精品| 欧美日本国产视频| 国产美女搞久久| 亚洲国产精品久久久久秋霞蜜臀| 一本久道久久久| 午夜精品影院在线观看| 午夜精品在线看| 久久综合给合| 日韩视频一区二区在线观看| 亚洲淫片在线视频| 久久深夜福利| 久久精品色图| 欧美日韩中文字幕| 国产亚洲人成a一在线v站| 亚洲欧洲偷拍精品| 香蕉精品999视频一区二区| 老司机精品视频网站| 99精品视频免费观看| 久久精品一区四区| 欧美日韩免费看| 伊人精品在线| 亚洲综合三区| 欧美成人精品不卡视频在线观看 | 欧美电影免费观看高清| 亚洲小说春色综合另类电影| 久久人人97超碰精品888| 欧美日韩亚洲系列| 亚洲国产成人av在线| 欧美一级久久久| 亚洲人成小说网站色在线| 欧美一区二区| 国产精品高清网站| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲一区久久| 欧美精品三级日韩久久| 国内久久视频| 欧美夜福利tv在线| 一本久久综合亚洲鲁鲁| 欧美成人首页| 亚洲大片在线观看| 久久久不卡网国产精品一区| 亚洲最黄网站| 欧美精品一区二区久久婷婷| 伊大人香蕉综合8在线视| 亚洲欧美日韩精品综合在线观看| 亚洲国产女人aaa毛片在线| 久久国产精品电影| 国产酒店精品激情| 亚洲一区中文| 99综合精品| 欧美日韩精品福利| 亚洲精品1区2区| 美女主播一区| 久久精品夜色噜噜亚洲aⅴ| 国产麻豆视频精品| 午夜精品国产更新| 99热在线精品观看| 欧美日韩福利在线观看| 亚洲精品日韩在线观看| 免费日韩av| 久久精品视频导航| 合欧美一区二区三区| 久久久国产91| 欧美中文字幕在线视频| 国产视频在线观看一区| 性久久久久久久久久久久| 一区二区91| 国产精品国内视频| 新片速递亚洲合集欧美合集 | 久久综合久久综合这里只有精品| 影音先锋成人资源站| 老牛嫩草一区二区三区日本| 久久久久成人精品免费播放动漫|