C 模版類 詳細講解

2021-08-04 07:24:54 字數 3254 閱讀 4486

直接先說一下模版類的定義:

template 《模版型別1,模版型別2...>

class 類名

乙個小示例如下:

templateclass a 

;t getdata() //模版函式,返回型別為t的值

};

以上的模版函式是在類的內部定義的,如果我們要定義乙個定義在類外的類模版成員函式的話,我們應該將這樣的類模版成員函式定義在類的.h檔案一起,定義方法如下:

template 《模版型別1,模版型別2...>

返回型別 類名《模版型別1,模版型別2...>::函式名(引數1,引數2)

以下為乙個示例:

templateclass a 

;t getdata() //模版函式,返回型別為t的值

t test() const;

};templatet a::test() const

當我們使用如下**的時候:

a inta(1);
這個時候,類模版會繫結到int型別上,然後使用int型別來例項化出特定的類,比如上面的**就會例項化出與下面等價的類:

template<>

class a

;int getdata() //模版函式,返回型別為t的值

int test() const ;

};template<>

int a::test() const

當編譯器從我們的類模版a中例項化出乙個類的時候,它會重寫a模版,將摸板引數t的每乙個例項都替換成給定的模版實參

如果乙個成員函式沒有被使用,它就不會被例項化。成員函式只有我們使用的時候才會例項化,當然,我們可以自己特化針對特定型別的成員函式

在類模版自己的作用域下和在類外的模版使用方法是不同的

我寫乙個例子,還是如上的**,模版類a,在類的內部寫乙個如下成員函式:

a test() 

這個成員函式是不用寫成返回值為a型別的,而只需要寫成a,但若是在類外定義這個函式,就必須寫成剛才上面所說的格式:

templatet>a a

::test()

我們就必須使用完整的a作為返回值

不過在函式的內部,由於我們已經進入了類的作用域,所以在定義a1的時候,無需重複模版實參。原因如下:

在類的作用域內,如果我們不提供模版實參,則編譯器將預設我們的型別與成員例項化所用型別一致

因此,a1的定義實際上如下:

aa1 =*this ;
我們可以定義乙個typedef來引用乙個例項化的類:

typedef a inta ;
但是我們沒辦法定義乙個typedef引用乙個模版,即無法定義乙個typedef引用a

但是,新標準允許我們為類模版定義乙個型別別名:

template

using twin_p=pair;

twin stringpair;//stringpair是乙個pair型別資料

與所有類一樣,類模版也可以定義static成員:

templateclass a 

;t getdata() //模版函式,返回型別為t的值

static

int getvalue()

};

在上面的**裡面,a是乙個類模版,它有乙個名為static_value的static成員變數。這代表每乙個a的例項都有乙個名為static_valuestatic資料成員例項

即,對任何給定型別x,都有乙個a::static_value,所有a共享同乙個static成員

由於每乙個模版例項都有其獨有的static成員,所有static的定義也要定義為模版:

templatet> 

int a

::static_value = 5; //定義並且初始化static_value

同樣,我們也可以通過例項類直接訪問具體的static成員:

cout

<< a::getvalue() << endl; // 5

和其他的成員函式類似,乙個static的成員函式和成員變數也只有在使用的時候才會例項化。

在新標準中,我們可以為函式和模版類提供預設實參,比如如下**(比較兩個數的大小,預設使用標準庫less函式物件模版 ):

templatet,calss f=less>

int compare(const t& v1, const t& v2, f f = f())

我們就將這個less繫結到f的預設引數上,當我們不使用第三個引數的時候,它就預設使用less來進行比較:

int i = compare(1, 5);  //使用less,i=-1

data d1(1), d2(2);

bool j = compare(d1, d2, comparedata);//自己寫的比較函式模版

可以看到,我們可以自己寫比較函式,也可以直接用預設的比較函式,標準庫里的很多東西都是如此,套路深。

最後 觀察如下**:

templateint>

class data;};

data doubluedata(3.5);

data<>intdata(4); //空<>表示我們希望使用預設型別

我們可以給所有的模版引數都給定預設實參,且如果我們希望使用這些預設實參,我們就跟乙個空尖括號對。

~結束

C 類的靜態成員詳細講解

在c 中,靜態成員是屬於整個類的而不是某個物件,靜態成員變數只儲存乙份供所有物件共用。所以在所有物件中都可以共享它。使用靜態成員變數實現多個物件之間的資料共享不會破壞隱藏的原則,保證了安全性還可以節省記憶體。靜態成員的定義或宣告要加個關鍵static。靜態成員可以通過雙冒號來使用即 類名 靜態成員名...

C 類的靜態成員詳細講解

在c 中,靜態成員是屬於整個類的而不是某個物件,靜態成員變數只儲存乙份供所有物件共用。所以在所有物件中都可以共享它。使用靜態成員變數實現多個物件之間的資料共享不會破壞隱藏的原則,保證了安全性還可以節省記憶體。靜態成員的定義或宣告要加個關鍵static。靜態成員可以通過雙冒號來使用即 類名 靜態成員名...

C 類的靜態成員詳細講解(二)

類中的靜態成員真是個讓人愛恨交加的特性。我決定好好總結一下靜態類成員的知識點,以便自己在以後面試中,在此類問題上不在被動。靜態類成員包括靜態資料成員和靜態函式成員兩部分。一 靜態資料成員 類體中的資料成員的宣告前加上static關鍵字,該資料成員就成為了該類的靜態資料成員。和其他資料成員一樣,靜態資...