C 自學筆記

2021-10-25 22:24:33 字數 4762 閱讀 8183

本次記錄函式模板,還請各位大佬批評指正!

模板就是建立通用的模具,大大提高復用性。

特點:

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 如果函式的宣告有預設引數,那麼函式的實現就不能有預設引數。宣告和實現只能有乙個有預設...