最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++模版函數(shù)詳解

 更新時(shí)間:2017年02月19日 11:25:05   投稿:mrr  
C++中的模版總體可以分為兩大類:模版函數(shù)、模版類。本篇文章先寫模版函數(shù),需要的朋友可以參考下

C++中的模版總體可以分為兩大類:模版函數(shù)、模版類。本篇文章先寫模版函數(shù),接下來會介紹模版類。

定義:模版函數(shù)是通用的函數(shù)描述,也就是說它們使用通用類型來定義,其中的通用類型可用具體類型替換。

代碼實(shí)例:

#include <iostream>
//模版類的聲明
template<typename T>
void Swap(T& a,T& b);
int main()
{
  int i = 10;
  int j = 20;
  std::cout<<"i=" << i << "," << "j=" <<j;
  Swap(i,j);//生成 void Swap(int &,int&);
  std::cout<<"i=" << i << "," << "j=" <<j;
  double x = 11.5;
  double y = 19.5;
  std::cout<<"x=" << x << "," << "y=" <<y;
  Swap(x,y);//編譯器生成 void Swap(double &,double&);
  std::cout<<"x=" << x << "," << "y=" <<y;
  return 0;
}
//模版類的定義
template<typename T>
void Swap(T& a,T& b)
{
  T temp;
  temp = a;
  a = b;
  b = temp;
}

以上實(shí)例為最簡單的函數(shù)模版實(shí)例,編譯器會根據(jù)具體使用的類型生成相對應(yīng)的函數(shù)。

重載的模版:

需要多個(gè)對不同的類型使用同一算法時(shí)可使用模版,如上代碼所示。但是并非所有的類型都使用相同的算法。為滿足這種需求,可以像重載常規(guī)函數(shù)定義那樣重載模版定義。和重載常規(guī)函數(shù)一樣,重載函數(shù)的特征表必須不同。代碼實(shí)例如下:

#include <iostream>
//模版類的聲明
template<typename T>
void Swap(T& a,T& b);
const int iCount = 5;
template<typename T>
void Swap(T* a,T*b,int n);
int main()
{
  int i = 10;
  int j = 20;
  std::cout<<"i=" << i << "," << "j=" <<j;
  Swap(i,j);//生成 void Swap(int &,int&)
  std::cout<<"i=" << i << "," << "j=" <<j;
  double x = 11.5;
  double y = 19.5;
  std::cout<<"x=" << x << "," << "y=" <<y;
  Swap(x,y);//編譯器生成 void Swap(double &,double&);
  std::cout<<"x=" << x << "," << "y=" <<y;
  int d[iCount] = {0,1,2,3,4};
  int e[iCount] = {5,6,7,8,9};
  Swap(d,e,iCount);//匹配新的模版,進(jìn)行數(shù)組的交換
  return 0;
}
//模版類的定義
template<typename T>
void Swap(T& a,T& b)
{
  T temp;
  temp = a;
  a = b;
  b = temp;
}
template<typename T>
void Swap(T* a,T*b,int n)
{
  for (int i=0;i<iCount;++i)
  {
    T temp;
    temp = a[i];
    a[i] = b[i];
    b[i] = temp;
  }
}

如上代碼新增了一個(gè)模版,用于交換兩個(gè)數(shù)組中的元素,原來的模版特征標(biāo)為(T&,T&),新模版的特征標(biāo)為(T[],T[]),int)。注意,在后一個(gè)模版中,最后一個(gè)參數(shù)的類型為具體類型(int),而不是通用類型,并非所有的模版參數(shù)都必須是模版參數(shù)類型。

顯示具體化:

對于給定的函數(shù)名,可以有非模版函數(shù),模版函數(shù)和顯示具體化模版函數(shù)以及它們的重載版本。

顯示具體化的原型和定義應(yīng)該以template<>打頭,并通過名稱來指出類型。

具體化將覆蓋常規(guī)模版,而非模版函數(shù)將覆蓋具體化和常規(guī)模版。

下面是用于交換Job結(jié)構(gòu)的非模版函數(shù),模版函數(shù)和具體化的原型。

void Swap(job &,job&);//非模版函數(shù)
template <typename T>
void Swap(T&,T&);//模版函數(shù)
template <> void Swap<job>(job&,job&);//顯示具體化函數(shù),其中Swap后的job參數(shù)可去掉,則函數(shù)簽名為template <> void Swap(job&,job&);

前面指出,如果有多個(gè)原型,編譯器在選擇原型時(shí),非模版將優(yōu)先于顯示具體化和模版版本,而顯示具體化將優(yōu)先于使用模版生成的版本。

如下面的調(diào)用:

double u,v;
Swap(u,v);//使用通用的模版
job a,b;
swap (a,b)//使用顯示具體化版本。

實(shí)例化和具體化:

    為了進(jìn)一步了解模版,必須理解術(shù)語實(shí)例化和具體化。記住,在代碼中包含函數(shù)模版本身并不會生成函數(shù)的定義,它只是一個(gè)用于生成函數(shù)定義的方案。編譯器使用模版為特定類型生成定義時(shí),得到的是模版實(shí)例(instantiation)。例如:函數(shù)調(diào)用Swap(i,j),使編譯器生成一個(gè)Swap()的一個(gè)實(shí)例,該實(shí)例使用int類型。模版并非函數(shù)定義,但使用int的模版實(shí)例是函數(shù)定義。這種實(shí)例化方式被稱為隱式實(shí)例化,因?yàn)榫幾g器之所以知道需要定義,是由于程序調(diào)用Swap()時(shí)提供了int參數(shù)。

    現(xiàn)在編譯器還可以允許顯示實(shí)例化,這意味著可以直接命令編譯器生成特定的實(shí)例,如Swap<int>。其句法是,聲明所選的種類-用<>符號指示類型,并在聲明前加上關(guān)鍵字template:

template void Swap<int>(int,int);//顯示實(shí)例化

實(shí)現(xiàn)了這種特性的編譯器在看到上述聲明后,將使用Swap()模版生成一個(gè)int類型的實(shí)例。

與顯示實(shí)例化不同的是,顯示具體化使用下面兩個(gè)等價(jià)聲明的之一:

template <> void Swap<int>(int,int);
template <> void Swap(int,int);

區(qū)別在于,這些聲明的意思是”不要使用Swap()模版來生成函數(shù)定義,而應(yīng)該使用獨(dú)立的、專門的函數(shù)定義顯示為int類型生成函數(shù)定義。

注意:試圖在一個(gè)編程單元中使用同一種類型的顯示具體化與顯示實(shí)例化將出錯(cuò)。

以上所述是小編給大家介紹的C++模版函數(shù)詳解,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言。

相關(guān)文章

  • C語言數(shù)據(jù)在內(nèi)存中的存儲詳解

    C語言數(shù)據(jù)在內(nèi)存中的存儲詳解

    本篇文章是C語言編程篇,主要為大家介紹C語言編程中數(shù)據(jù)在內(nèi)存中存儲解析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • codeblocks 對‘cv::waitKey(int)’未定義的引用方式

    codeblocks 對‘cv::waitKey(int)’未定義的引用方式

    今天小編就為大家分享一篇codeblocks 對‘cv::waitKey(int)’未定義的引用方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 解決scanf_s輸入%d%c%d格式錯(cuò)誤的問題

    解決scanf_s輸入%d%c%d格式錯(cuò)誤的問題

    這篇文章主要介紹了解決scanf_s輸入%d%c%d格式錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++ 利用硬件加速矩陣乘法的實(shí)現(xiàn)

    C++ 利用硬件加速矩陣乘法的實(shí)現(xiàn)

    這篇文章主要介紹了C++ 利用硬件加速矩陣乘法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++雙目運(yùn)算符+=的重載詳解

    C++雙目運(yùn)算符+=的重載詳解

    這篇文章主要介紹了詳解C++編程中的雙目運(yùn)算符重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • Linux系統(tǒng)中C語言編程創(chuàng)建函數(shù)fork()執(zhí)行解析

    Linux系統(tǒng)中C語言編程創(chuàng)建函數(shù)fork()執(zhí)行解析

    最近在看進(jìn)程間的通信,看到了fork()函數(shù),雖然以前用過,這次經(jīng)過思考加深了理解?,F(xiàn)總結(jié)如下
    2013-04-04
  • C++如何刪除map容器中指定值的元素詳解

    C++如何刪除map容器中指定值的元素詳解

    map容器是C++ STL中的重要一員,刪除map容器中value為指定元素的問題是我們經(jīng)常與遇到的一個(gè)問題,下面這篇文章主要給大家介紹了關(guān)于利用C++如何刪除map容器中指定值的元素的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • C++中需要注意的細(xì)節(jié)你知道嗎

    C++中需要注意的細(xì)節(jié)你知道嗎

    這篇文章主要介紹了C++ 需要注意的幾點(diǎn)細(xì)節(jié),幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-09-09
  • C語言 超詳細(xì)講解庫函數(shù)

    C語言 超詳細(xì)講解庫函數(shù)

    C語言庫函數(shù)是把自定義函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來詳細(xì)了解它
    2022-03-03
  • C++ 中malloc()和free()函數(shù)的理解

    C++ 中malloc()和free()函數(shù)的理解

    這篇文章主要介紹了C++ 中malloc()和free()函數(shù)的理解的相關(guān)資料,這里提供用法示例幫助大家理解這部分知識,需要的朋友可以參考下
    2017-08-08

最新評論

赤水市| 甘肃省| 肥乡县| 丁青县| 阿拉善左旗| 阳春市| 湘乡市| 南皮县| 凯里市| 桂阳县| 罗源县| 江山市| 皮山县| 惠州市| 密云县| 监利县| 海口市| 库尔勒市| 育儿| 安仁县| 新津县| 晋城| 兰溪市| 陆良县| 额尔古纳市| 澄江县| 化隆| 洮南市| 温州市| 武陟县| 石阡县| 浙江省| 夹江县| 泗洪县| 安阳县| 浦东新区| 宁晋县| 商洛市| 当阳市| 民和| 绿春县|