程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 簡略控制C++中的函數模板

簡略控制C++中的函數模板

編輯:關於C++

簡略控制C++中的函數模板。本站提示廣大學習愛好者:(簡略控制C++中的函數模板)文章只能為提供參考,不一定能成為您想要的結果。以下是簡略控制C++中的函數模板正文


1.函數模板的聲明和模板函數的生成
1.1函數模板的聲明
函數模板可以用來創立一個通用的函數,以支撐多種分歧的形參,防止重載函數的函數體反復設計。它的最年夜特色是把函數應用的數據類型作為參數。
函數模板的聲明情勢為:
template<typename 數據類型參數標識符>

<前往類型><函數名>(參數表)
{
  函數體
}

個中,template是界說模板函數的症結字;template前面的尖括號不克不及省略;typename(或class)是聲明數據類型參數標識符的症結字,用以解釋它前面的標識符是數據類型標識符。如許,在今後界說的這個函數中,凡願望依據實參數據類型來肯定數據類型的變量,都可以用數據類型參數標識符來講明,從而使這個變量可以順應分歧的數據類型。例如:

template<typename T>
T fuc(T x, int y)
{
  T x;
  //……
}

假如主調函數中有以下語句:

double d;
int a;
fuc(d,a);

則體系將用實參d的數據類型double去取代函數模板中的T生成函數:

double fuc(double x,int y)
{
  double x;
  //……
}

函數模板只是聲清楚明了一個函數的描寫即模板,不是一個可以直接履行的函數,只要依據現實情形用實參的數據類型取代類型參數標識符以後,能力發生真實的函數。
症結字typename也能夠應用症結字class,這時候數據類型參數標識符便可以應用一切的C++數據類型。
1.2.模板函數的生成
函數模板的數據類型參數標識符現實上是一個類型形參,在應用函數模板時,要將這個形參實例化為肯定的數據類型。將類型形參實例化的參數稱為模板實參,用模板實參實例化的函數稱為模板函數。模板函數的生造詣是將函數模板的類型形參實例化的進程。例如:
應用中應留意的幾個成績:
(1)函數模板許可應用多個類型參數,但在template界說部門的每一個形參前必需有症結字typename或class,即:
template<class 數據類型參數標識符1,…,class 數據類型參數標識符n>

<前往類型><函數名>(參數表)
{
   函數體
}

(2)在template語句與函數模板界說語句<前往類型>之間不許可有其余語句。以下面的聲明是毛病的:
template<class T>
int I;
T min(T x,T y)
{
  函數體
}

(3)模板函數相似於重載函數,但二者有很年夜差別:函數重載時,每一個函數體內可以履行分歧的舉措,但統一個函數模板實例化後的模板函數都必需履行雷同的舉措。

2 函數模板的異常處置
函數模板中的模板形參可實例化為各類類型,但當實例化模板形參的各模板實參之間不完整分歧時,便可能產生毛病,如:

template<typename T>    
void min(T &x, T &y)
{ return (x<y)?x:y; }
void func(int i, char j)
{
  min(i, i);
  min(j, j);
  min(i, j);
  min(j, i);
}

例子中的後兩個挪用是毛病的,湧現毛病的緣由是,在挪用時,編譯器按最早碰到的實參的類型隱含地生成一個模板函數,並用它對一切模板函數停止分歧性檢討,例如對語句

min(i, j);

先碰到的實參i是整型的,編譯器就將模板形參說明為整型,爾後湧現的模板實參j不克不及說明為整型而發生毛病,此時沒有隱含的類型轉換功效。處理此種異常的辦法有兩種:
(1)采取強迫類型轉換,如將語句min(i, j);改寫為min(i,int( j));
(2)用非模板函數重載函數模板
辦法有兩種:
(1)借用函數模板的函數體
此時只聲明非模板函數的原型,它的函數體借用函數模板的函數體。如改寫下面的例子以下:
template<typename T>      

void min(T &x, T &y)
{ return (x<y)?x:y; }
int min(int,int);
void func(int i, char j)
{
  min(i, i);
  min(j, j);
  min(i, j);
  min(j, i);
}

履行該法式就不會失足了,由於重載函數支撐數據間的隱式類型轉換。
(2)從新界說函數體
就像普通的重載函數一樣,從新界說一個完全的非模板函數,它所帶的參數可以隨便。C++中,函數模板與同名的非模板函數重載時,應遵守以下挪用准繩:
• 尋覓一個參數完整婚配的函數,若找到就挪用它。若參數完整婚配的函數多於一個,則這個挪用是一個毛病的挪用。
• 尋覓一個函數模板,若找到就將其實例化生成一個婚配的模板函數並挪用它。
• 若下面兩條都掉敗,則應用函數重載的辦法,經由過程類型轉換發生參數婚配,若找到就挪用它。
•若下面三條都掉敗,還沒有找都婚配的函數,則這個挪用是一個毛病的挪用。

3.小例子

#include <iostream> 
#include <string> 
using namespace std; 
 
template<class T> void swap(T *x, T *y){//函數的模板,只需能應用等號賦值類型都可以用這個模板交換 
  T temp = *x; 
  *x = *y; 
  *y = temp; 
} 
 
void main(){ 
  int i = 9, j = 5; 
  float k = 9.2, l = 5.6; 
  swap(&i, &j);//交流整形 
  swap(&k, &l);//交流浮點型 
  cout<<"i = "<<i<<" , j = "<<j<<endl; 
  cout<<"k = "<<k<<" , l = "<<l<<endl; 
} 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved