c++函數(shù)模板與類模板

第一次做心得總結(jié)纤壁,寫的肯定不如其他編程大佬一樣厲害叁丧,作為菜鳥本菜我會寫的非常通俗易懂,個人覺得是自己的編程能力的提升吧冈止,順便復(fù)習(xí)學(xué)過的知識狂票,和大家分享也會很快樂。


  • 我們?yōu)槭裁匆媚0澹?/h1>
    • 解決排序問題

不同類型的對象熙暴,排序時的不同是:比較兩個對象的大小

  • 兩種解決方式

  • 函數(shù)重載
    例如:
    sort (...classA...){......}
    sort(...classB...){......}
    分別寫倆個同名函數(shù) 由編譯系統(tǒng)函數(shù)調(diào)用時實參的類型闺属,來確定實際執(zhí)行的函數(shù)慌盯。

  • 函數(shù)模板
    template <class T>


模板分類

1.函數(shù)模板

格式:
template<class 數(shù)據(jù)類型參數(shù)標識符1,…掂器,class 數(shù)據(jù)類型參數(shù)標識符n>
<返回類型><函數(shù)名>(參數(shù)表)
{
函數(shù)體
}

2.類模板

格式:
template<class 形參名1, class 形參名2, ...class 形參名n>
class 類名{
...
};
接下來我們一一贅述吧~

  • 函數(shù)模板:

像是一個帶有類型參數(shù)的函數(shù)亚皂,編譯程序會根據(jù)實際參數(shù)的類型確定參數(shù)的類型。(看不懂可以忽略這句話)
模板只是把多個重復(fù)的代碼化簡成單個!
舉一個非常簡單滴例子:

    #include <iostream>  
    using namespace std;  
      
    template<typename T, typename T2>  
    void sortArray(T *a, T2 num)  
    {  
        T tmp ;  
        int i, j ;  
        for (i=0; i<num; i++)  
        {  
            for (j=i+1; j<num; j++)  
            {  
                if (a[i] < a[j])  
                {  
                    tmp = a[i];  
                    a[i] = a[j];  
                    a[j] = tmp;  
                }  
            }  
        }  
    }  
      
    template<class T>  
    void pirntArray(T *a, int num)  
    {  
        int i = 0;  
        for (i=0; i<num; i++)  
        {  
            cout<<a[i]<<" ";  
        }  
        cout << endl;  
    }  
      
    int main()  
    {  
        int num = 0;  
        char a[] = "daddyyyyyyyy";  
        num = strlen(a);  
      
        cout << "排序之前" << endl;  
        pirntArray<char>(a, num);  
      
        sortArray<char, int>(a, num); //顯示類型調(diào)用 模板函數(shù) <>  
        cout << "排序之后" << endl;  
        pirntArray<char>(a, num);  
        cout<<"hello..."<< endl;  
        return 0;  
    }  
  • 模板特化

當函數(shù)模板需要對某些類型進行特別處理国瓮,稱為函數(shù)模板的特化
舉個簡單滴例子:
我們編寫了一個泛化的比較程序

template <class T>
int compare(const T &left, const T&right)
{
    std::cout <<"in template<class T>..." <<std::endl;
    return (left - right);
}

這可咋整哇C鸨亍!它不支持char*(string)類型唉
不要怕乃摹!
我們可以對其進行特化禁漓,以讓它支持兩個字符串的比較,因此我們實現(xiàn)了如下的特化函數(shù)。

template < >
int compare<const char*>(const char* left, const char* right)
{
    std::cout <<"in special template< >..." <<std::endl;

    return strcmp(left, right);
}

那整體該怎么寫呢孵睬,給大家一個完整的代碼參考吧~

template <typename T>//模板實例
int compare(T a,  T b)//比較了地址
{
    if (a < b)
        return -1;
    if (a>b)
        return 1;
    return 0;
}
template <>//模板特化    在模板實例之后
//特化的聲明必須與特定的模板相匹配
//int compare<const char*>(char* p1, char*  p2)//error :不是函數(shù)模板的專用化
int compare<const char*>(const char* p1, const char*  p2)
{
    return strcmp(p1,p1);
}
int main()
{
    char* p1 = "abcd";
    char* p2 = "abce";
    const char* p3 = "abcd";
    const char* p4 = "abce";
    cout << compare(p1, p2) << endl;
    cout << compare(p3, p4) << endl;
    return 0;
}
  • 模板重載(直接看代碼吧)
template <typename T>
T Max(const T& a, const T& b)
{
    return a > b ? a : b;
}
template <typename T>
T Max(const T& a, const T& b, const T& c)//重載
{
    return Max(Max(a, b), c);
}
int main()
{
    Max(1, 2);
    Max(1, 2, 4);
    return 0;
}
  • 類模板:

為什么要用類模板播歼?
因為多快好省啊掰读!
我們要是不用類模板滴話荚恶,遇到很多類比較相似,比如:數(shù)據(jù)成員相同磷支,成員函數(shù)相同的情況下,只是數(shù)據(jù)成員的類型不同食寡,用類模板就很方便好使雾狈。
那我繼續(xù)來個栗子:
這是一個無類模板的代碼:

    class Compare  
    {  
        public:  
            Compare(int a,int b)//構(gòu)造函數(shù),用于初始化  
            {  
                x = a;  
                y = b;  
            }  
            int max()//求較大值  
            {  
                return (x>y)?x:y;  
            }  
            int min()//求較小值  
            {  
                return (x<y)?x:y;  
            }  
        private:  
            int x;  
            int y;    
    };  

這是有類模板的代碼:

    template <class Type>  
    class compare  
    {  
        public:  
            compare(Type a,Type b)  
            {  
                x = a;  
                y = b;  
            }  
            Type max()  
            {  
                return (x>y)?x:y;  
            }  
            Type min()  
            {  
                return (x<y)?x:y;  
            }  
        private:  
            Type x;  
            Type y;  
    };  

main函數(shù)代碼:

    int main(void)  
    {     
        compare<int> C1(3,5);  
        cout<<"最大值:"<<C1.max()<<endl;  
        cout<<"最小值:"<<C1.min()<<endl;  
          
        compare<float> C2(3.5,3.6);  
        cout<<"最大值:"<<C2.max()<<endl;  
        cout<<"最小值:"<<C2.min()<<endl;  
          
        compare<char> C3('a','d');  
        cout<<"最大值:"<<C3.max()<<endl;  
        cout<<"最小值:"<<C3.min()<<endl;  
        return 0;  
    }  

如何將類轉(zhuǎn)化為類模板

(1)寫出一個類

(2)將類型需要改變的地方進行替換(如上面的Type)

(3)在類的前面加入關(guān)鍵字template以及函數(shù)參數(shù)表

(4)定義對象的格式 類名+<Type>+ xx(參數(shù))

比如上面的compare<int> C1(3,5);

(5)切記抵皱,模板函數(shù)如果定義在類體外善榛,需要在前面加上一行template <函數(shù)參數(shù)表>。并在類模板名后面用尖括號加上<虛擬函數(shù)參數(shù)>

比如

template<class Type>

Type compare <Type>::max()

{

       //.....

}

目前就總結(jié)到這啦呻畸,要是有什么新想法我還會繼續(xù)補充的移盆,我先去做幾道題,要是有好的題目我就分享給大家嘻嘻嘻伤为,再見~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咒循,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绞愚,更是在濱河造成了極大的恐慌叙甸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件位衩,死亡現(xiàn)場離奇詭異裆蒸,居然都是意外死亡,警方通過查閱死者的電腦和手機糖驴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門僚祷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佛致,“玉大人,你說我怎么就攤上這事辙谜“秤埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵筷弦,是天一觀的道長肋演。 經(jīng)常有香客問我,道長烂琴,這世上最難降的妖魔是什么爹殊? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奸绷,結(jié)果婚禮上梗夸,老公的妹妹穿的比我還像新娘。我一直安慰自己号醉,他們只是感情好反症,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畔派,像睡著了一般铅碍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上线椰,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天胞谈,我揣著相機與錄音,去河邊找鬼憨愉。 笑死烦绳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的配紫。 我是一名探鬼主播径密,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躺孝!你這毒婦竟也來了享扔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤植袍,失蹤者是張志新(化名)和其女友劉穎伪很,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奋单,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡锉试,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呆盖。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拖云,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出应又,到底是詐尸還是另有隱情宙项,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布株扛,位于F島的核電站尤筐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洞就。R本人自食惡果不足惜盆繁,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旬蟋。 院中可真熱鬧油昂,春花似錦、人聲如沸倾贰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匆浙。三九已至安寺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間首尼,已是汗流浹背挑庶。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饰恕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓井仰,卻偏偏與公主長得像埋嵌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俱恶,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 注意:本文中代碼均使用 Qt 開發(fā)編譯環(huán)境雹嗦,如有疑問和建議歡迎隨時留言。 模板是 C++ 支持參數(shù)化程序設(shè)計的工具...
    趙者也閱讀 5,626評論 1 5
  • C++ 模板簡介 一合是、模板 使用模板的目的就是能夠讓程序員編寫與類型無關(guān)的代碼了罪。 模板是一種對類型進行參數(shù)化的工具...
    MinoyJet閱讀 2,374評論 0 12
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,518評論 1 51
  • 有一天,小公雞和小鴨子在一起玩聪全。小公雞總是說:”小鴨子泊藕,你的腳真難看∧牙瘢“又過了一天娃圆,小鴨子在池塘里游泳玫锋,小公雞來了...
    xiaoxin0628閱讀 207評論 0 0
  • 說起爸爸,不知從哪下筆讼呢。忽然就想起了他老人家一直孜孜不倦追求的瓷器收藏撩鹿。可能他的這個愛好悦屏,準確地講不能稱之為...
    云紫煙閱讀 351評論 0 0