函數指針
引入: 何爲函數指針,和普通指針有什麼區別!函數也是一段二進制碼而已,所以也是要佔用存儲空間的,只是它的空間比普通的空間更安全。所以我們可以用指針指向它。
常用自定義形式:
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;
}
來看一下結果哈:
總結: 結果正確!一點問題沒有哈,是不是感覺非常愉快呢!!