首页 → 名言 → 毅力格言
c模版函數寫法 c語言 函數模板
日期:2023-03-20 19:47:46    编辑:网络投稿    来源:网络资源
C++函數模板  在《C++函數重載》一節中,為了交換不同類型的變量的值,我們通過函數重載定義了四個名字相同、參數列表不同的函數,下面一起來學習一下吧!  //交換 int 變量的
为你推荐:
  • 2022機械專業實訓報
  • C++函數模板

      在《C++函數重載》一節中,為了交換不同類型的變量的值,我們通過函數重載定義了四個名字相同、參數列表不同的函數,下面一起來學習一下吧!

      //交換 int 變量的值

      void Swap(int *a, int *b){

      int temp = *a;

      *a = *b;

      *b = temp;

      }

      //交換 float 變量的值

      void Swap(float *a, float *b){

      float temp = *a;

      *a = *b;

      *b = temp;

      }

      //交換 char 變量的值

      void Swap(char *a, char *b){

      char temp = *a;

      *a = *b;

      *b = temp;

      }

      //交換 bool 變量的值

      void Swap(bool *a, bool *b){

      char temp = *a;

      *a = *b;

      *b = temp;

      }

      這些函數雖然在調用時方便了一些,但從本質上說還是定義了三個功能相同、函數體相同的函數,只是數據的類型不同而已,這看起來有點浪費代碼,能不能把它們壓縮成一個函數呢?

      我們知道,數據的值可以通過函數參數傳遞,在函數定義時數據的值是未知的,只有等到函數調用時接收了實參才能確定其值。這就是值的參數化。

      在C++中,數據的.類型也可以通過參數來傳遞,在函數定義時可以不指明具體的數據類型,當發生函數調用時,編譯器可以根據傳入的實參自動推斷數據類型。這就是類型的參數化。

      值(Value)和類型(Type)是數據的兩個主要特征,它們在C++中都可以被參數化。

      所謂函數模板,實際上是建立一個通用函數,它所用到的數據的類型(包括返回值類型、形參類型、局部變量類型)可以不具體指定,而是用一個虛擬的類型來代替(實際上是用一個標識符來占位),等發生函數調用時再根據傳入的實參來逆推出真正的類型。這個通用函數就稱為函數模板(Function Template)。

      在函數模板中,數據的值和類型都被參數化了,發生函數調用時編譯器會根據傳入的實參來推演形參的值和類型。換個角度說,函數模板除了支持值的參數化,還支持類型的參數化。

      一但定義了函數模板,就可以將類型參數用于函數定義和函數聲明了。說得直白一點,原來使用 int、float、char 等內置類型的地方,都可以用類型參數來代替。

      下面我們就來實踐一下,將上面的四個Swap() 函數壓縮為一個函數模板:

      #include

      using namespace std;

      templatevoid Swap(T *a, T *b){

      T temp = *a;

      *a = *b;

      *b = temp;

      }

      int main(){

      //交換 int 變量的值

      int n1 = 100, n2 = 200;

      Swap(&n1, &n2);

      cout<<n1<<", "<<n2<<endl;

      //交換 float 變量的值

      float f1 = 12.5, f2 = 56.93;

      Swap(&f1, &f2);

      cout<<f1<<", "<<f2<<endl;

      //交換 char 變量的值

      char c1 = 'A', c2 = 'B';

      Swap(&c1, &c2);

      cout<<c1<<", "<<c2<<endl;

      //交換 bool 變量的值

      bool b1 = false, b2 = true;

      Swap(&b1, &b2);

      cout<<b1<<", "<<b2<<endl;

      return 0;

      }

      運行結果:

      200, 100

      56.93, 12.5

      B, A

      1, 0

      請讀者重點關注第 4 行代碼。template是定義函數模板的關鍵字,它后面緊跟尖括號<>,尖括號包圍的是類型參數(也可以說是虛擬的類型,或者說是類型占位符)。typename是另外一個關鍵字,用來聲明具體的類型參數,這里的類型參數就是T。從整體上看,template被稱為模板頭。

      模板頭中包含的類型參數可以用在函數定義的各個位置,包括返回值、形參列表和函數體;本例我們在形參列表和函數體中使用了類型參數T。

      類型參數的命名規則跟其他標識符的命名規則一樣,不過使用 T、T1、T2、Type 等已經成為了一種慣例。

      定義了函數模板后,就可以像調用普通函數一樣來調用它們了。

      在講解C++函數重載時我們還沒有學到引用(Reference),為了達到交換兩個變量的值的目的只能使用指針,而現在我們已經對引用進行了深入講解,不妨趁此機會來實踐一把,使用引用重新實現 Swap() 這個函數模板:

      #include

      using namespace std;

      templatevoid Swap(T &a, T &b){

      T temp = a;

      a = b;

      b = temp;

      }

      int main(){

      //交換 int 變量的值

      int n1 = 100, n2 = 200;

      Swap(n1, n2);

      cout<<n1<<", "<<n2<<endl;

      //交換 float 變量的值

      float f1 = 12.5, f2 = 56.93;

      Swap(f1, f2);

      cout<<f1<<", "<<f2<<endl;

      //交換 char 變量的值

      char c1 = 'A', c2 = 'B';

      Swap(c1, c2);

      cout<<c1<<", "<<c2<<endl;

      //交換 bool 變量的值

      bool b1 = false, b2 = true;

      Swap(b1, b2);

      cout<<b1<<", "<<b2<<endl;

      return 0;

      }

      引用不但使得函數定義簡潔明了,也使得調用函數方便了很多。整體來看,引用讓編碼更加漂亮。

      下面我們來總結一下定義模板函數的語法:

      template返回值類型 函數名(形參列表){

      //在函數體中可以使用類型參數

      }

      類型參數可以有多個,它們之間以逗號,分隔。類型參數列表以< >包圍,形式參數列表以( )包圍。

      typename關鍵字也可以使用class關鍵字替代,它們沒有任何區別。C++ 早期對模板的支持并不嚴謹,沒有引入新的關鍵字,而是用 class 來指明類型參數,但是 class 關鍵字本來已經用在類的定義中了,這樣做顯得不太友好,所以后來 C++ 又引入了一個新的關鍵字 typename,專門用來定義類型參數。不過至今仍然有很多代碼在使用 class 關鍵字,包括 C++ 標準庫、一些開源程序等。

      本教程會交替使用 typename 和 class,旨在讓讀者在別的地方遇到它們時不會感覺陌生。更改上面的 Swap() 函數,使用 class 來指明類型參數:

      templatevoid Swap(T &a, T &b){

      T temp = a;

      a = b;

      b = temp;

      }

      除了將 typename 替換為 class,其他都是一樣的。

      為了加深對函數模板的理解,我們再來看一個求三個數的最大值的例子:

      #include

      using namespace std;

      //聲明函數模板

      templateT max(T a, T b, T c);

      int main( ){

      //求三個整數的最大值

      int i1, i2, i3, i_max;

      cin >> i1 >> i2 >> i3;

      i_max = max(i1,i2,i3);

      cout << "i_max=" << i_max << endl;

      //求三個浮點數的最大值

      double d1, d2, d3, d_max;

      cin >> d1 >> d2 >> d3;

      d_max = max(d1,d2,d3);

      cout << "d_max=" << d_max << endl;

      //求三個長整型數的最大值

      long g1, g2, g3, g_max;

      cin >> g1 >> g2 >> g3;

      g_max = max(g1,g2,g3);

      cout << "g_max=" << g_max << endl;

      return 0;

      }

      //定義函數模板

      template//模板頭,這里不能有分號

      T max(T a, T b, T c){ //函數頭

      T max_num = a;

      if(b > max_num) max_num = b;

      if(c > max_num) max_num = c;

      return max_num;

      }

      運行結果:

      12 34 100↙

      i_max=100

      73.234 90.2 878.23↙

      d_max=878.23

      344 900 1000↙

      g_max=1000

      函數模板也可以提前聲明,不過聲明時需要帶上模板頭,并且模板頭和函數定義(聲明)是一個不可分割的整體,它們可以換行,但中間不能有分號。

    【C++函數模板】相關文章:

    C++函數指針學習教程10-03

    C++如何調用matlab函數09-29

    C++調用C函數的方法09-28

    C++中內聯函數的應用09-22

    C++類的成員變量和成員函數09-30

    Java程序調用C/C++語言函數的方法09-24

    計算機二級C++函數考點10-06

    C++的字符串分割函數的使用詳解10-04

    C++中可以接受任意多個參數的函數定義方法10-05

    關于C++中定義比較函數的三種方法10-05

    这里有更多你想看的
  • 關于清醒的文案 讓
    • 本类最新
    • 精品图文
    • 时尚
    • 新闻
    • 生活
    • 视觉
    • 微爱
      栏目ID=88的表不存在(操作类型=0)

    头条推荐

    热门推荐

    特别推荐

    返回顶部