1. 程式人生 > >過載函式、函式模板、函式指標的聯絡和使用

過載函式、函式模板、函式指標的聯絡和使用

過載函式

過載函式指擁有相同的函式名稱,但引數列表不相同(可能是引數型別不相同,可能是引數個數不相同).編譯器在編譯是通過將呼叫者提供的實際引數和每一個過載函式的引數對比,找出其中最合適的函式進行執行。

下面我們實現一個過載函式max(),讓它接受一下引數:(a):兩個整數,(b):兩個浮點數,©:一個整形vector,(d):一個浮點型vector,最後編寫main()函式測試這下函式。

#include<string>
#include<vector>
using namespace std;

void max(int,int);
void max(double,double);
void max(const vector<int>&);
void max(const vector<double>& );


void max(int num1,int num2)
{
	int max_num	= num1>num2?num1:num2;
	cout<<max_num<<endl;
}
void max(double num1,double num2)
{
	int max_num = num1>num2?num1:num2 ;
	cout<<max_num<<endl;
}

void max(const vector<int> &vec)
{
	int max_num = 0;
	int len = vec.size();
	for(int i= 0;i<len;i++)
		if(max_num < vec.at(i))
			max_num = vec.at(i);
	cout<<max_num<<endl;
}
void max(const vector<double> &vec)
{
	double max_num = 0.0;
	int len = vec.size();
	for(int i= 0;i<len;i++)
		if(max_num < vec.at(i))
			max_num = vec.at(i);
	cout<<max_num<<endl;
}
int main()
{
	vector<int> vec_Int;
	vector<double> vec_Double;
	vec_Int.push_back(1);
	vec_Int.push_back(2);
	vec_Double.push_back(3.0);
	vec_Double.push_back(5.0);
	max(12,11);
	max(14.0,100.0);
	max(vec_Int);
	max(vec_Double);
	return 0;
}

函式模板

同一個函式名稱,但裡面的引數不一樣就要寫這麼多程式碼是不是太低效率了,人類永遠追求高效(其實是懶),C++設計了一個函式模板來解決這個問題。function template 以關鍵字template開場,其後緊接著以成對尖括號<>包括起來的一個或多個表示符。這些表示符用來表示我們希望推遲決定的資料型別。使用者每利用一次模板,都必須提供確實的型別資訊。這些標示符事實上扮演這佔位符的角色,用來放置函式引數列表及函式體中某些實際資料型別

#include<string>
#include<vector>
using namespace std;

template <typename T>  //T開始從這裡生效
void mymax(T m1 , T m2)
{
	T m_max ;
	m_max = m1 > m2 ? m1 :m2;
	cout << m_max<<endl;
}                                    //從這裡失效
template <typename T>                     //這個T和上個T是兩個,它們的作用域僅在與它相鄰的函式
void mymax(const vector<T> &vec)
{
	if(vec.size()<=0)
		cout<<"資料為空"<<endl;
	T m_max = vec.at(0) ;
	int len = vec.size();
	for(int i=0;i< len;i++)
		if(m_max < vec.at(i))
			m_max = vec.at(i);
	cout<<m_max<<endl;
}


int main()
{
	vector<int> vec_Int;
	vector<double> vec_Double;
	vec_Int.push_back(1);
	vec_Int.push_back(2);
	vec_Double.push_back(3.0);
	vec_Double.push_back(4.0);
	mymax(2,5);
	mymax(5.0,3.0);
	mymax(vec_Int);
	mymax(vec_Double);
	return 0;
}

這裡將max()函式名改為了mymax(),原因是標準空間中已經有個max了,如果存在兩個max會導致編譯器不知道該使用那個。另外需要注意的是函式模板的作用域,它的作用域是緊跟自己的函式。

函式指標

函式指標必須知名所指函式的返回型別及引數列表,如下所示:

void (*funcall)(int ,int);假設有兩個函式min()和max(),我將使用函式指標呼叫這兩個函式。
using namespace std;
void max(int,int);
void min(int,int);

void max(int num1,int num2)
{
	int max = 0;
	max = num1>num2?num1:num2;
	cout << max<<endl;
}
void min(int num1,int num2)
{
	int min = 0 ;
  	min = num1>num2?num2:num1;
	cout<<min<<endl;
}

int main()
{
	void (*pFuncall)(int,int);  //定義函式指標
	pFuncall = max;
	(*pFuncall)(2,3);
	pFuncall= min;
	(*pFuncall)(4,5);
	return 0;
	
}

更為簡潔的一種寫法是使用typedef定義一種新型別 ,如:

typedef void (*pFuncall)(int,int)這樣就可以將函式指標當作像char、int一樣使用了.

總結

在實際的程式設計中具體使用那種方式實現簡潔的程式碼,需要根據專案要求和實際情況而定,函式模板使函式引數具有可替代性,函式指標則更具有靈活性。