本次記錄函式模板,還請各位大佬批評指正!
模板就是建立通用的模具,大大提高復用性。
特點:
1、通用性強,但是一般不能直接使用,它只是乙個框架;
2、模板的通用不是萬能的。
c++中另一種程式設計思想稱為泛型程式設計,主要利用的技術就是模板。
c++提供兩種模板機制:函式模板和類模板。
函式模板作用:
建立乙個通用函式,其函式返回值型別和形參型別可以不具體制定,用乙個虛擬的型別來代表。
函式模板語法:
template< typename t>
函式宣告或定義
解釋:
template - 宣告建立模板
typename - 表明其後面的符號是一種資料型別,可以用class代替
t - 通用的資料型別,名稱可以替換,通常為大寫字母
#include
#include
#include
using
namespace std;
//函式模板
//交換兩個整型的函式
void
swapint
(int
& a,
int& b)
//交換兩個浮點數的函式
void
swapint
(double
& a,
double
& b)
//模板
//宣告乙個模板,告訴編譯器後面**中緊跟著的t不要報錯,t是乙個通用資料型別
template
<
typename t>
void
myswap
(t& a, t& b)
void
test01()
intmain()
總結:
1、函式模板利用關鍵字 template;
2、使用函式模板有兩種方式:自動型別推導 和 顯示指定型別;
3、模板的目的是為了提高復用性,將型別引數化。
1、自動型別推導中,必須推導出一致的資料型別 t,才可以使用;
2、模板必須要確定出 t 的資料型別,才可以使用。
#include
#include
#include
using
namespace std;
//函式模板注意事項
template
<
class
t>
void
myswap
(t &a, t &b)
//1、自動型別推導中,必須推導出一致的資料型別 t,才可以使用
void
test01()
//2、模板必須要確定出 t 的資料型別,才可以使用
template
<
class
t>
void
func()
void
test02()
intmain()
總結:使用函式模板時必須確定出通用資料型別 t,並且能夠推導出一致的型別。
案例描述:
利用函式模板封裝乙個排序的函式,可以對不同資料型別陣列進行排序;
排序規則為從大到小,排序演算法為選擇排序;
分別利用char陣列和int陣列進行測試。
#include
#include
#include
using
namespace std;
//函式模板案例 實現通用的對陣列進行排序的函式 從大到小排序;演算法:選擇
template
<
class
t>
void
myswap
(t& a, t& b)
template
<
class
t>
void
mysort
(t arr,
int len)}if
(max != i)}}
//提供列印陣列模板
template
<
class
t>
void
printarray
(t arr,
int len)
cout << endl;
}void
test01()
void
test02()
;int num =
sizeof
(intarr)
/sizeof
(int);
mysort
(intarr, num)
;printarray
(intarr, num);}
intmain()
普通函式與函式模板的區別:
1、普通函式呼叫時可以發生自動型別轉換(隱式型別轉換);
2、函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換;
3、如果利用顯示指定型別方式,可以發生隱式型別轉換。
#include
#include
#include
using
namespace std;
//普通函式與函式模板的區別:
//1、普通函式呼叫時可以發生自動型別轉換(隱式型別轉換)
intmyadd01
(int a,
int b)
void
test01()
//模板
template
<
class
t>
t myadd02
(t a, t b)
void
test02()
intmain()
總結:建議使用顯示指定型別的方式 呼叫函式模板,因為可以自己確定通用型別t。
呼叫規則如下:
1、如果函式模板和普通函式都可以實現,優先呼叫普通函式;
2、可以通過空模板引數列表來強制呼叫函式模板;
3、函式模板也可以發生過載;
4、如果函式模板可以產生更好的匹配,優先呼叫函式模板。
#include
#include
#include
using
namespace std;
//普通函式與函式模板的呼叫規則
void
myprint
(int a,
int b)
template
<
class
t>
void
myprint
(t a, t b)
template
<
class
t>
void
myprint
(t a, t b,t c)
void
test01()
intmain()
總結:既然提供了函式模板,最好就不要提供普通函式,否則容易出現二義性。
侷限性:模板的通用性並不是萬能的。
如:
template
<
class
t>
void
func
(t a, t b)
}
如果t的資料型別傳入的是像person這樣的自定義資料型別,**無法正常執行。因此,c++為了解決這種問題,提供模板的過載,可以為這些特定的型別提供具體化的模板。
#include
#include
#include
using
namespace std;
//模板的侷限性
//對比兩個資料是否相等
class
person
string m_name;
int m_age;};
template
<
class
t>
bool
mycompare
(t& a, t& b)
else
}//利用具體化person的版本實現**,具體化優先呼叫
template
<
>
bool
mycompare
(person & p1, person & p2)
else
}void
test01()
else
}void
test02()
else
}int
main()
總結:
1、利用具體化的模板,可以解決自定義型別的通用化;
2、學習模板並不是為了寫模板,而是在stl能夠運用系統提供的模板。
C 自學筆記
本次記錄結構體,還請各位大佬批評指正!結構體屬於使用者自定義的資料型別,允許使用者儲存不同的資料型別 整型 浮點型 字元型 布林型 即不同資料型別的集合所組成的乙個型別。建立學生資料型別,然後通過學生資料型別建立具體的學生。通過結構體建立變數的方式有三種 1 struct 結構體名 變數名 2 st...
C 自學筆記
本次記錄程式的記憶體分割槽模型,還請各位大佬批評指正!c 程式在執行時,將記憶體大方向劃分為4個區域 1 區 存放函式體的二進位制 有作業系統進行管理 寫的所有 放在該區域 2 全域性區 存放全域性變數和靜態變數以及常量 3 棧區 由編譯器自動分配釋放,存放函式的引數值,區域性變數 4 堆區 由程式...
C 自學筆記
本次記錄函式提高,還請各位大佬批評指正!在c 中,函式的形參列表中的形參是可以有預設值的。語法 返回值型別 函式名 引數 預設值 注意事項 1 如果某個位置有預設引數,那麼從這個位置之後,從左往右都必須有預設值。2 如果函式的宣告有預設引數,那麼函式的實現就不能有預設引數。宣告和實現只能有乙個有預設...