模板1 0 模板基本原理

2021-08-14 08:40:20 字數 2699 閱讀 4381

為什麼需要模板

我們經常有這樣的一種使用的情形,就是我們可能需要設計乙個函式,然後函式的引數可能是整形的,也可能是浮點型的,還有可能是其他的型別的,這個時候如果對於每乙個型別都寫乙個函式,未免有點太複雜了

我們有以下幾個方法來實現乙個函式針對不同的型別都能夠實現

法一:通過函式過載實現

比如我們想要寫乙個相加的函式,我們需要實現函式的過載

int add(const

int a,const

int b)

double add(cosnt double a,const

double b)

char add(const

char a,const

char )

缺點分析:

1. 乙個類出現時就需要繼續過載乙個函式

2. **的復用率低

3. 如果乙個函式只是返回值不同,函式的過載還解決不了問題

4. 如果函式的邏輯錯誤了,那麼所有的函式都需要修改,麻煩

法二:使用公共的基類

我們可以將重複的**放在乙個公共的基類,然後進行乙個繼承

缺點:

1. 公共的**放在了基類裡面就缺少了型別檢查的優點了

2. 乙個簡單的函式,以後使用了繼承之後,以後維護起來麻煩

法三:使用巨集函式

#define add(a,b) ((a)+(b))
缺點:

1. 沒有了型別檢查

2. 在預處理階段就被替換掉了,不方便除錯

引入模板

c++為了解決上面的問題,於是就引入了模板的使用,像下面的形式來實現add函式的復用

template

t add(const t& a,const t&b)

其中我們使用class的時候,也是可以使用typename這個關鍵字的

我們在其他的地方呼叫這個模板函式的時候,就可以使用下面的方式進行乙個呼叫的過程

int x = 1;

int y = 2;

double m = 1.0;

double n = 2.0;

add(x,y);

add(m,n);

上面的兩次對模板函式的呼叫是不是呼叫的同乙個函式呢,答案:不是。他們呼叫了不同的函式,這裡引入的乙個概念就是模板的例項化

我們經常聽到的乙個概念是物件的例項化,就是我們拿乙個類去例項化乙個物件,比如我們使用下面的**去例項化乙個string的物件

string str;
同樣的我們的模板也是有例項化的乙個過程的,就是在我們呼叫我們函式的時候,根據我們的引數進行乙個推演,比如剛剛的那個add(x,y);這個 時候編譯器會根據引數的型別,例項化生成乙個引數是整形的add函式,然後在對他進行乙個呼叫,這個就是簡單的例項化的過程。

所以說上面的兩次呼叫實際上是生成了不同的函式,然後進行的乙個呼叫的過程

小問題

問題一:模板函式和例項函式共存

還是上面add函式,如果我們這個時候在上面的模板函式的基礎之上又實現了乙個函式,這個時候會如何呼叫呢

int add(const

int& a,const

int& b)

在這種情況下,如果我們有已經例項化的函式,這個時候會直接呼叫我們已經例項化的函式,如果沒有已經 例項化的函式,這個時候才會去找我們的模板函式,然後例項化乙個函式進行乙個呼叫的過程

問題二:模板函式和例項函式引數不匹配

還是上面的程式,我們即有了乙個模板函式,又有了乙個例項函式,這個時候我們在使用的時候,傳遞的引數不是兩個整形而是兩個雙精度浮點型,那麼這個時候是如何呼叫的呢

double a = 1.0;

double b = 2.0;

add(a,b);

這個時候會檢查我們的例項函式,但是引數的型別不匹配,所以實際上是生成了乙個引數是double型別的模板函式,然後再進行函式的乙個呼叫的過程

如果我們的引數乙個是int,乙個是double的,這個時候又是怎麼樣的呢,由大家自己去驗證吧

這裡我們還需要注意的乙個問題就是,例項化函式中的第二個引數不是乙個const的時候,這個時候,我們的給 我們的引數傳入的是乙個double的變數的時候,會發生隱式型別的轉換的,這個時候會生成乙個臨時的變數,這個臨時的變數具有常性,所以我們應該在引數上面加上乙個const

問題三:模板例項化和型別檢查

我們知道我們的模板函式只有在例項化的時候,才會生成可執行**的,如果我們在vs下面測試的時候,編譯器是不會對模板函式的內部進行檢查的,比如我們少寫了乙個分號,但是在linux下面使用g++進行 編譯的時候是會進行乙個檢查的過程的

模板類模板類也很容易實現,只不過在使用的時候,我們需要對模板類進行乙個顯式的例項化的過程

templateclass arr

private:

t _a;

}arr arr;

上面的呼叫就是乙個顯式的例項化的過程

mysql的基本原理 Mysql 基本原理

mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...

8 2 1 基本原理

乙個舞台動畫物件在包含許多舞台資訊 出現在何處,佔多大面積,處在什麼角度,是否可見 這些資訊分別儲存在動畫物件的屬性中。在 中讀取這些屬性可以了解物件的位置 大小 角度等狀態資訊 修改這些屬性可以改變物件的位置 大小 角度等狀態。如果從資料的角度去理解,動畫就是在固定時間間隔點不斷修改動畫物件某項屬...

Csocket基本原理

我通過幾個採用 csocket 類編寫並基於 client server 客戶端 服務端 的網路聊天和傳輸檔案的程式 在除錯這些程式的過程中,追蹤深入至 csocket 類核心原始碼 sockcore.cpp 對於csocket 類的執行機制可謂是一覽無遺,並且對於阻塞和非阻塞方式下的 socket...