2、非型別模板引數
1.1、模板的概念
模板就是生成乙個通用的函式,這個函式可以接受任意資料型別的引數,可以返回任意型別的值。
模板是泛型程式設計的基礎。所謂泛型程式設計就是編寫與型別無關的邏輯**,是一種強大的復用方式。
1.2、模板的分類
1.2.1、模板函式
template1 , class 形參2,...>
返回型別 函式名(形參表)
template1 , typename 形參2,...>
返回型別 函式名(形參表)
模板形參定義class和typename是完全等價的,沒有區別,所以你可以任意使用,但是不要兩個混搭,讓人看著不舒服。
eg:
void swap(int
*x1,int
*x2)
void swap(int
**x1, int
**x2)
int main()
根據上面例子看出:當你想進行兩個整型交換時,是不是要寫乙個交換函式,當你想交換兩個指標,又要寫乙個交換函式,那麼你想交換兩個字串是不是又要寫,為了解決這種麻煩,c++有了模板的這個概念,
templatevoid swap(t *x1, t* x2)
這就是模板,它不關注你具體需要的型別,它會根據你的需求確定不同的函式型別執行不同的**(這叫做模板函式例項化)。並且在c++庫中交換函式swap也是用模板實現的。
重要的一點:編譯時不會編譯模板函式大括號裡面的內容,那是因為模板函式還沒有例項化,因為不知道函式形參型別,所以根本不能在堆疊上開闢空間。
//例項化呼叫
1.2.2、模板類
template1, class 形參名2, ...,class 形參名n>
class 類名
;
templateclass a
protected:
t _a;
};int main()
2.1、定義模板引數不僅可以定義為型別還可以定義為固定型別的常量值。
2.2、例子
模板類與模板函式都可以用非型別形參。
template
void sum(t a,int n)
cout
<< sum << endl;
}template
class seqlist
;void test()
2.3、使用規則
template
class list
};
const
int num1 = 9; ;//全域性變數
static
int num2= 9; ;//全域性變數
void test()
//再看乙個關於指標和字串比較特別的例子
template
const* name>
class pointer
; char a = "aa";;//全域性變數
char *b = "aa";//全域性變數
char *const c = "aa";//全域性變數,頂層指標,指標常量
void test()
C 模板的理解
泛型程式設計 函式模板 函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。templatevoid swap t left,t right int main 模板例項化 隱式例項化 templateadd const t left,const t right int main...
理解C 模板
模板就是實現 重用機制的一種工具,模板通常在較大的 庫中使用,目的是實現 的可重用性和程式的靈活性。它可以實現型別引數化,即把型別定義為引數,從而實現了真正的 可重用性。模版可以分為兩類,乙個是函式模版,另外乙個是類模版。宣告方式 t是乙個模板引數,它接受不同的資料型別 如int,float等 而c...
C 學習8 模板初步理解
類模板是在類的定義時,不能確定成員的型別時,為了防止 的冗餘,用t代替。t是乙個型別,告訴編譯器,型別還沒有繫結,不知道現在是什麼型別。使用的時候,類名後要用尖括號把型別名括起來。complex int a 1,2 complex double a 1.0,2.0 當編譯時,編譯器看到了使用者的t是...