c 基礎 筆記(八)

2021-08-09 07:16:31 字數 2436 閱讀 9803

1 函式模板

1.1 模板分類

函式模板

、類模板

1.2 template< typename t >   告訴編譯器緊跟著下面的函式或類出現

t不要報錯

1.3 void myswap( t & a ,t &b )

1.4 呼叫時候

兩種方式

1.4.1 自動型別推導,比如推導出t型別才能使用模板,不要出現二義性問題

1.4.2 顯示指定型別,myswap( a,b)

1.4.3 模板使用時候必須告訴編譯器t的型別,否則無法使用

2 利用函式模板

實現對通用的資料型別的乙個選擇排序

2.1 排序規則

從大到小

2.2 排序方式

選擇排序

2.3 函式模板

2.3.1 mysort

2.3.2 myswap

2.3.3 myprint

3 函式模板與普通函式的區別以及呼叫規則

3.1 區別

3.1.1 普通函式可以進行隱式型別轉換

3.1.2 函式模板不可以進行隱式型別轉換

3.2 呼叫規則

3.2.1 如果普通函式和模板函式都可以匹配,優先選擇普通函式

3.2.2 可以通過空模板引數列表方式

強制呼叫函式模板

myprint

<>(a, b);

3.2.3 函式模板也可以發生過載

3.2.4 如果函式模板可以產生更好的匹配,優先函式模板

4 模板實現機制

4.1 模板並不能對任意的資料型別都進行通用化

4.2 通過模板

產生的函式

,叫模板函式

4.3 模板會進行二次編譯,第一次編譯是模板的本身的**,第二次會對型別替換後的模板函式

進行二次的編譯

5 模板侷限性

5.1 模板而言並不能做萬能的通用

5.2 對於特殊的型別,可以做具體化的乙個函式版本

5.3 template<> 返回值 函式名

<

具體的型別

>(

具體型別  引數… )

5.4 template<> void myswap(person & a, person &b)

5.5 對於具體化版本,如果出現和普通模板都可以匹配成功,優先選擇具體化版本

6 類模板

6.1 template<> 下面緊跟著的是類,那麼就是類模板

6.2 類模板和函式模板區別

6.2.1 類模板在建立物件時候

,必須用指定顯示型別方式,不能進行自動型別轉換

6.2.2 類模板中的宣告裡,可以有預設的值

7 類模板中成員函式的建立時機

7.1 類模板中的成員函式並不是一上來就建立好的

7.2 而是在二次編譯期間,替換完t的型別後,才去建立

8 類模板作為函式的引數

8.1 指定傳入型別

8.2 引數模板化

8.3 整個類模板化

8.4 檢視t型別

8.4.1 cout << "t 型別:

" << typeid(t).name() << endl;

9 類模板-繼承中引發的問題以及解決

9.1 父類如果是模板,子類繼承時候要指定出父類中的t型別,否則無法分配記憶體

9.2 語法  class son :public base

10 類模板的類外實現

10.1 返回值

作用域《模板引數

,模板引數

2>::

實現成員函式

(){}

11 類模板的分檔案編寫問題以及解決

11.1 問題:類模板中的成員函式一開始不會被建立,導致分檔案編寫時候連線不到函式的實現

11.2 解決:將.cpp和

.h都寫到同乙個檔案中,字尾名改為

.hpp

12 類模板碰到友元函式

12.1 友元函式類內實現

12.2 friend void showperson( person&p)

12.3 友元函式類外實現

12.4 宣告:

12.4.1 friend void showperson2<>(person&p);

12.4.2 templateclass person;

12.4.3 templatevoid showperson2(person& p);

13 類模板應用-實現乙個通用的陣列

13.1 屬性

13.1.1 t * paddress; //指向堆區的指標

13.1.2 int m_capacity 容量

13.1.3 int m_size; 大小

13.2 有參構造

13.3 拷貝構造

13.4 析構

13.5 過載

13.6 尾插

13.7 尾刪

c語言基礎(八)

結構體內成員對齊規則 1 我們的結構體變數本身就是在4位元組對齊的位置,編譯器幫我們做的事。2 第乙個成員,就從結構體開始的位址處,存放。這個元素,具體佔多少位元組,由緊挨著下個元素決定。3 整個成員變數自身都對齊 了,還沒有結束。4 整個結構體還要是預設位元組對齊的最小整數倍。結構體預設的位元組對...

C語言基礎八

define是一條預處理指令,可以用來編寫巨集定義語句。巨集定義語句可以用來給數字起名字。可以在編譯時使用 d選項給乙個名字指定對應的數字,例如 gcc dsize 6 02circle.巨集是可以帶引數的,巨集的引數通常表示乙個名稱 巨集的引數直接參與計算,函式的引數要先製作出乙個替身然後才參與計...

C 學習筆記八

24 子物件 當乙個類的成員時另乙個類的物件時,該物件就為子物件。子物件即是物件的成員 當類中出現了子物件 物件成員 該類的建構函式要包含對子物件的初始化,通常採用成員初始化列表的方法來初始化子物件 include class a void print class b 成員初始化列表,私有成員可以通...