C 類模板5分鐘入門

2021-09-22 08:02:53 字數 3010 閱讀 9364

參考自

c++ 除了支援函式模板,還支援類模板(class template)。函式模板中定義的型別引數可以用在函式宣告和函式定義中,類模板中定義的型別引數可以用在類宣告和類實現中。類模板的目的同樣是將資料的型別引數化。

宣告類模板的語法為:

templateclass 類名;

類模板和函式模板都是以 template 開頭(當然也可以使用 class,目前來講它們沒有任何區別),後跟型別引數;型別引數不能為空,多個型別引數用逗號隔開。

一但宣告了類模板,就可以將型別引數用於類的成員函式和成員變數了。換句話說,原來使用 int、float、char 等內建型別的地方,都可以用型別引數來代替。

假如我們現在要定義乙個類來表示座標,要求座標的資料型別可以是整數、小數和字串,例如:

這個時候就可以使用類模板,請看下面的**:

template//這裡不能有分號

class point

public:

t1 getx() const; //獲取x座標

void setx(t1 x); //設定x座標

t2 gety() const; //獲取y座標

void sety(t2 y); //設定y座標

private:

t1 m_x; //x座標

t2 m_y; //y座標

};

x 座標和 y 座標的資料型別不確定,借助類模板可以將資料型別引數化,這樣就不必定義多個類了。

注意:模板頭和類頭是乙個整體,可以換行,但是中間不能有分號。
上面的**僅僅是類的宣告,我們還需要在類外定義成員函式。在類外定義成員函式時仍然需要帶上模板頭,格式為:

template

返回值型別 類名《型別引數1 , 型別引數2, ...>::函式名(形參列表)

第一行是模板頭,第二行是函式頭,它們可以合併到一行,不過為了讓**格式更加清晰,一般是將它們分成兩行。

下面就對 point 類的成員函式進行定義:

template//模板頭

t1 point::getx() const /*函式頭*/

templatevoid point::setx(t1 x)

templatet2 point::gety() const

templatevoid point::sety(t2 y)

請讀者仔細觀察**,除了 template 關鍵字後面要指明型別引數,類名 point 後面也要帶上型別引數,只是不加 typename 關鍵字了。另外需要注意的是,在類外定義成員函式時,template 後面的型別引數要和類宣告時的一致。

上面的兩段**完成了類的定義,接下來就可以使用該類建立物件了。使用類模板建立物件時,需要指明具體的資料型別。請看下面的**:

pointp1(10, 20);

pointp2(10, 15.5);

pointp3(12.4, "東經180度");

與函式模板不同的是,類模板在例項化時必須顯式地指明資料型別,編譯器不能根據給定的資料推演出資料型別。

除了物件變數,我們也可以使用物件指標的方式來例項化:

point*p1 = new point(10.6, 109.3);

point*p = new point("東經180度", "北緯210度");

需要注意的是,賦值號兩邊都要指明具體的資料型別,且要保持一致。下面的寫法是錯誤的:

//賦值號兩邊的資料型別不一致

point*p = new point(10.6, 109);

//賦值號右邊沒有指明資料型別

point*p = new point(10.6, 109);

【例項1】將上面的類定義和類例項化的**整合起來,構成乙個完整的示例,如下所示:

#include using namespace std;

template//這裡不能有分號

class point

public:

t1 getx() const; //獲取x座標

void setx(t1 x); //設定x座標

t2 gety() const; //獲取y座標

void sety(t2 y); //設定y座標

private:

t1 m_x; //x座標

t2 m_y; //y座標

};template//模板頭

t1 point::getx() const /*函式頭*/

templatevoid point::setx(t1 x)

templatet2 point::gety() const

templatevoid point::sety(t2 y)

int main()

t & operator(int i)

};templatecarray::carray(int s):size(s)

templatecarray::carray(carray & a)

ptr = new t[a.size];

memcpy(ptr, a.ptr, sizeof(t ) * a.size);

size = a.size;

}template carray::~carray()

template carray& carray::operator=(const carray & a)

if(size < a.size)

memcpy(ptr,a.ptr,sizeof(t)*a.size);

size = a.size;

return *this;

}template void carray::push_back(const t & v)

else //陣列本來是空的

ptr = new t[1];

ptr[size++] = v; //加入新的陣列元素

}int main()

5分鐘入門golang module

golang團隊在版本1.13及以後全面支援module機制,用於結束混亂複雜的專案管理機制。同學們可以簡單的將module機制理解成pip apt get等包管理工具。乙個專案 倉庫 包括多個module 模組 乙個模組包括多個package 包 而乙個包含多個 原始檔。簡單的說,在乙個modul...

5分鐘入門Lindorm SearchIndex

簡介 searchindex是lindorm寬表的二級索引,主要用來幫助業務實現快速的檢索分析。本篇文章介紹如何通過簡單的sql介面操作searchindex。lindorm對外提供統一的標準sql入口,可以讓開發人員快速上手,輕鬆運維海量資料。searchindex是lindorm寬表的二級索引,...

RabbitMQ 輕鬆入門 5分鐘講解

rabbitmq是乙個輕量級的訊息 中介軟體,它支援多種訊息通訊協議,支援分布式部署,同事也支援執行於多個作業系統,它的靈活 高可用特性是它成為流行mq中介軟體的重要因素。它在點到點 發布訂閱的基礎上還加入了中間這亂七八糟的一坨。這一坨是高階訊息佇列的關鍵,可以自由地規劃路線,選擇傳送到哪乙個佇列上...