欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++入門之模板基礎(chǔ)講解

 更新時(shí)間:2021年11月18日 15:33:15   作者:捕獲一只小肚皮  
這篇文章主要為大家介紹了C++入門之模板基礎(chǔ),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

前言

今天博主將要介紹的內(nèi)容是–模板,他在C++中具有非常重要的位置.至于什么是模板呢?我們請(qǐng)看下面的章節(jié).

引入

我們對(duì)交換函數(shù)Swap已經(jīng)非常熟悉了,但是我們經(jīng)常會(huì)遇到這樣的一些事,比如,很多不同的數(shù)據(jù)類型進(jìn)行交換,那么我們就需要寫(xiě)不同的重載Swap,如下:

#include <iostream>
using namespace std;
void Swap(int& a,int& b){
    int t  = a;
    a = b;
    b = t;
}
void Swap(double& a,double& b){
    double t = a;
    a = b;
    b = t;
}
int main()
{
    int a = 10,b = 20;
    double c = 1.2,d = 3.4;
    Swap(a,b);
    Swap(c,d);
    return 0;
}

可以看到,如果有必要,我們需要交換幾種類型的數(shù)據(jù),就必須寫(xiě)上幾種重載Swap,這就導(dǎo)致非常的繁瑣,因?yàn)槲覀儗?duì)其交換邏輯太熟悉了,只是換了變量類型,那有什么辦法可以解決呢?沒(méi)錯(cuò),這就是我們今天要講的模板.

模板

概念:在生活中,博主舉一個(gè)例子,假設(shè)你是一個(gè)手辦廠家,現(xiàn)在你需要售出各種材料和顏色做的悟空手辦,首先你需要的就是悟空的模型,然后按照這個(gè)模型使用不同的材料.這個(gè)模型就是我們?cè)诔绦蛑械哪0?

模板種類:

  • 函數(shù)模板
  • 類模板

函數(shù)模板

函數(shù)模板的格式:

template<class T1,class T2,...> 
    return_val function_name (para1,para1,...)
{
}

打省略號(hào)的都是形參列表,表示參數(shù)量自由,我們現(xiàn)在知道了怎樣使用函數(shù)模板,那試試寫(xiě)一個(gè)Swap模板:

template<class T> 
void Swap (T& a,T& b)
{
    T t = a;
    a = b;
    b = a;
}

按照模板規(guī)范,我們寫(xiě)出來(lái)了Swap的模板,現(xiàn)在測(cè)試一下結(jié)果是否正確呢?

image-20211027124124726

發(fā)現(xiàn)測(cè)試結(jié)果完全正確.

然后這里博主有個(gè)疑問(wèn),就是我們調(diào)用Swap時(shí),編譯器是執(zhí)行的上面模板呢?還是執(zhí)行的通過(guò)模板推演出來(lái)的函數(shù)呢?

答:通過(guò)模板推演出來(lái)的函數(shù),因?yàn)镃++提出模板是為了節(jié)省程序員的時(shí)間,我們所省略的工作,只是編譯器替我們完成了.

也就是說(shuō),比如我們這樣調(diào)用:

int main()
{
    int a = 10,b = 20;
    Swap(a,b);
    return 0;
}

那么編譯器在底部會(huì)推演出一個(gè)如下函數(shù),并執(zhí)行:

void Swap(int& a,int& b){
    int t  = a;
    a = b;
    b = t;
}

模板的匹配原則

什么叫做模板的匹配原則呢?

就是說(shuō)當(dāng)既有定義出來(lái)的明確函數(shù),同時(shí)又有模板,那么調(diào)用函數(shù)時(shí)候,執(zhí)行的是哪一個(gè)?以下面為例:

void Swap(int& a,int& b){
    int t  = a;
    a = b;
    b = t;
}
template<class T> 
void Swap (T& a,T& b)
{
    T t = a;
    a = b;
    b = a;
}
int main()
{
    int a = 10,b = 20;
    Swap(a,b);
    return 0;
}

匹配順序?yàn)?

  • 如果有定義出來(lái)的函數(shù),且類型完全匹配調(diào)用時(shí)實(shí)參類型,則執(zhí)行定義出來(lái)的函數(shù).
  • 如果定義出來(lái)的函數(shù),不符合,則執(zhí)行模板推演.

也就是說(shuō),上面的例子中,Swap調(diào)用的是我們定義出來(lái)的Swap,而不是模板.

模板的顯示調(diào)用

上面講解的模板使用,其實(shí)被稱做隱式調(diào)用,現(xiàn)在,博主介紹一下顯示調(diào)用.

顯示調(diào)用格式:

function<Type1,Type2,..>(para1,para1,...);

也就是說(shuō),我們明確知道需要使用的什么類型,并且就想告訴編譯器,我傳給你的是什么類型,然后讓編譯器推演出該類型的函數(shù).比如下面使用:

int a = 10,b = 20;
char c = 'a',d = 'b';
Swap<int>(a,b);  //告訴編譯器我傳的是int類型
Swap<char>(c,d);  //告訴編譯器我傳的是char類型

大家可能會(huì)問(wèn)了,這有什么用呢?既然編譯器會(huì)根據(jù)我們的調(diào)用情況進(jìn)行推演,還進(jìn)行顯示調(diào)用不是多此一舉嗎?大家請(qǐng)看下面的代碼:

template<class T> 
void Swap (T& a,T& b)
{
    T t = a;
    a = b;
    b = a;
}
int main()
{
    int a = 10;
    double b = 23.22;
    Swap(a,b);         //這樣調(diào)用編譯器就會(huì)報(bào)錯(cuò)
    return 0;
}

像上面的調(diào)用方式,是不允許的,因?yàn)槟0逯兄挥幸粋€(gè)T,但是我們傳了兩個(gè)類型,編譯器根據(jù)模板將不知道T應(yīng)該是啥類型,而解決上面的問(wèn)題只有兩種

  • 一是強(qiáng)制性轉(zhuǎn)換類型,比如Swap(a,(int)b);
  • 二是顯示使用模板,比如Swap<int>(a,b);

其次,博主講解模板的顯示調(diào)用還有一個(gè)目的就是為了引出下面的類模板.

類模板

類模板和函數(shù)模板相似,定義框架如下:

template <class T1,class T2,...>
    class class_name
    {
    };

我們對(duì)數(shù)據(jù)結(jié)構(gòu)—棧,應(yīng)該算比較了解,而對(duì)于經(jīng)常刷力扣的伙伴來(lái)說(shuō),可能會(huì)發(fā)現(xiàn)棧不只是用來(lái)存儲(chǔ)int類型,比如還有ListNode*等,那我們大概寫(xiě)一下其stack模板吧.

template <class T>
class Stack
{
public:
    Stack():data(new T*[10]),top(0),capacity(10) {}
    ~Stack() 
    {
        delete[] data; 
        top = capacity = 0;
    }
    void Push(T& a)
    {}
private:
    T* data;
    int top;
    int capacity;
};

然后我們定義Stack對(duì)象,但是對(duì)象應(yīng)該存儲(chǔ)的類型是什么呢?如果我們繼續(xù)用最開(kāi)始的隱式模板方法,發(fā)現(xiàn)完全實(shí)現(xiàn)不了,這也就是博主上面為何要講解模板的顯示調(diào)用,因?yàn)轭惸0逯荒芡ㄟ^(guò)顯示調(diào)用實(shí)現(xiàn),例子使用如下:

Stack <char> st1;      //定義一個(gè)存儲(chǔ)char類型的棧
Stack <int> st2;       //定義一個(gè)存儲(chǔ)int類型的棧
Stack <double> st3;    //定義一個(gè)存儲(chǔ)double類型的棧

Stack并不是類,其只是一個(gè)模板,Stack <int>等才是類

注意1

類模板只是一個(gè)模板,他并不屬于類.

注意2

當(dāng)我們的模板類中的成員函數(shù),在模板中聲明,而在模板外定義時(shí),需要加上模板參數(shù)列表,如下:

template <class T>
class Stack
{
public:
    void Push(T& a);
    bool empty();
private:
    T* data;
    int top;
    int capacity;
};
template <class T> 
void Stack<T>:: Push(T& a)     //需要加上template <class T> ,且在Stack后面加上<T>
{}
template <class T>   
void Stack<T>:: empty()        //需要加上template <class T> ,且在Stack后面加上<T>
{}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語(yǔ)言關(guān)鍵字auto與register及static專項(xiàng)詳解

    C語(yǔ)言關(guān)鍵字auto與register及static專項(xiàng)詳解

    這篇文章主要解釋了c語(yǔ)言中什么是數(shù)據(jù)類型,什么是變量,他們的真正含義是什么。分析了屬性關(guān)鍵字auto,register和static的用法
    2022-07-07
  • 使用C++的string實(shí)現(xiàn)高精度加法運(yùn)算的實(shí)例代碼

    使用C++的string實(shí)現(xiàn)高精度加法運(yùn)算的實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇使用C++的string實(shí)現(xiàn)高精度加法運(yùn)算的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • C++利用容器查找重復(fù)列功能實(shí)現(xiàn)

    C++利用容器查找重復(fù)列功能實(shí)現(xiàn)

    本文將詳細(xì)介紹c++容器簡(jiǎn)介,c++容器的比較 與操作實(shí)例,需要了解更多的朋友可以參考下
    2012-11-11
  • C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[九]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[九]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[九]...
    2007-02-02
  • C++11中異常處理機(jī)制詳解

    C++11中異常處理機(jī)制詳解

    傳統(tǒng)的C語(yǔ)言處理異常的方式有兩種:終止程序和返回錯(cuò)誤碼。在實(shí)際中的C語(yǔ)言程序基本都是通過(guò)返回錯(cuò)誤碼的方式來(lái)處理錯(cuò)誤的,部分情況下使用終止程序來(lái)處理比較嚴(yán)重的錯(cuò)誤。本文將通過(guò)示例和大家聊聊C++11中異常處理機(jī)制,需要的可以參考一下
    2022-09-09
  • C/C++中的atan和atan2函數(shù)實(shí)例用法

    C/C++中的atan和atan2函數(shù)實(shí)例用法

    在本篇文章里小編給大家分享的是一篇關(guān)于C/C++中的atan和atan2函數(shù)實(shí)例用法相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • QT判斷兩個(gè)日期時(shí)間的大小

    QT判斷兩個(gè)日期時(shí)間的大小

    本文主要介紹了QT判斷兩個(gè)日期時(shí)間的大小,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 帶你了解C++的動(dòng)態(tài)內(nèi)存分配

    帶你了解C++的動(dòng)態(tài)內(nèi)存分配

    今天小編就為大家分享一篇關(guān)于關(guān)于C++動(dòng)態(tài)分配內(nèi)存的介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2021-08-08
  • C++ Boost Lockfree超詳細(xì)講解使用方法

    C++ Boost Lockfree超詳細(xì)講解使用方法

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • 老生常談C/C++內(nèi)存管理

    老生常談C/C++內(nèi)存管理

    下面小編就為大家?guī)?lái)一篇老生常談C/C++內(nèi)存管理。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05

最新評(píng)論