c++重溫之函數指針和模板篇

函數指針

引入: 何爲函數指針,和普通指針有什麼區別!函數也是一段二進制碼而已,所以也是要佔用存儲空間的,只是它的空間比普通的空間更安全。所以我們可以用指針指向它。

常用自定義形式:

typedef int(*ADD)(int, int) ;
using pADD = int(*)(int, int); //應該c++17可用

代碼舉例:

typedef int(*ADD)(int, int) ;
using pADD = int(*)(int, int);

int Add(int a, int b)
{
    return a + b;
}

int main()
{
    //第一種
    ADD pAdd = Add;  cout << pAdd(3, 6) << endl;
    //第二種
    pADD pAdd = Add; cout << pAdd(3, 6) << endl;
}

結果:
在這裏插入圖片描述

函數模板

引入: 爲什麼要引入函數模板的問題呢?還是爲了解決代碼重複性問題!

例如:

int Add(int a, int b)  //int  加法
{
	return a + b;
}
float Add(float a, float b)  //float 加法
{
	return a + b;
}
double Add(double a, double b)  //double 加法
{
	return a + b;
}

所以c++委員會引入了函數模板來解決這種尷尬的問題

函數模板格式:

//注意:template 和 typename 都是關鍵字 並且T只是個名字,可以修改

template <typename T>       
T Add(T a, T b)
{
	return a + b;
}

//常見格式的還有許多,例如:

template <typename T1,typename T2>   //我們也可以要求多個類型名,要多少有多少
T1 Add(T1 a, T2 b)
{
	return a + b;
}

//還有許多。。。。

模板也有尷尬?顯式聲明就ok!

接着,我們引入一個例子來說明一些常見問題:

	template<typename T>
	T Add(T a, T b)
	{
		return a + b;
	}
	int main()
	{
		//錯誤代碼
		//原因:因爲編譯器無法確定類型是int還是float
		//cout << Add(1.000, 2.0f);  
	
		//正確代碼
		//通過顯示聲明類型來不讓編譯器煩惱
		cout << Add<int>(1.000, 2.0f);
	}

函數模板的例外處理

先引入個例子來說明:

	template<typename T>
	T Max(T a, T b)
	{
		return a>b?a:b;
	}
	int main()
	{
		int a{ 10 }, b{ 20 };
		cout << "a=10;b=20 大的是幾?答案:" << *Max(&a, &b);
	}

來看一下結果:
在這裏插入圖片描述
追加: 驚不驚喜意不意外?當我們未來可能會出現這種情況時,就需要用到模板的例外處理就可以解決這種情況!!!

我們只需要添加以下代碼就可解決:

template<>  //尖括號內爲空,代表例外處理
int* Max(int* a, int* b)
{
	int* max = new int{ (*a) > (*b) ? (*a) : (*b) }; //防止返回局部變量的問題
	return max;
}

再看結果:
在這裏插入圖片描述

函數模板與函數重載的優先級

引入: 若在未來的實際項目中,出現了一個重載函數和模板函數名相同時?會出現什麼情況呢?我們來看看下面代碼:

	template<typename T>
	T Avg(T a, T b)
	{
		return a + b;
	}
	int Avg(int a, int b)
	{
		return a > b ? a : b;
	}
	int main()
	{
		int a{ 10 }, b{ 20 };
		cout << "Avg(a,b) = " << Avg(a, b) << endl;
	}

來看一下結果:
在這裏插入圖片描述
追加: 所以我們可以看到函數重載的優先級時高級函數模板的!

函數模板中的函數重載

引入: 是不是聽起來很玄乎麼?纔沒有!模板函數也是函數呀,當然可以重載!下面給出代碼讓大家體會一下結合運用的快感!

template<typename T>
T Avg(T a, T b)
{
	return (a + b)/2;
}
template<typename T>
T Avg(T a, T b,T c)
{
	return (a + b + c) / 3;
}

int main()
{
	int a{ 10 }, b{ 20 }, c{ 30 };
	cout << "Avg(a,b) = " << Avg(a, b) << endl;
	cout << "Avg(a,b,c) = " << Avg(a, b, c) << endl;
}

來看一下結果哈:
在這裏插入圖片描述
總結: 結果正確!一點問題沒有哈,是不是感覺非常愉快呢!!

發佈了20 篇原創文章 · 獲贊 19 · 訪問量 2343
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章