日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

c语言模板类,C++类模板(Class Template)

發(fā)布時(shí)間:2024/3/26 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言模板类,C++类模板(Class Template) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C++ 除了支持函數(shù)模板,還支持類模板(Class Template)。函數(shù)模板中定義的類型參數(shù)可以用在函數(shù)聲明和函數(shù)定義中,類模板中定義的類型參數(shù)可以用在類聲明和類實(shí)現(xiàn)中。類模板的目的同樣是將數(shù)據(jù)的類型參數(shù)化。

聲明類模板的語(yǔ)法為:

template class 類名{

//TODO:

};

類模板和函數(shù)模板都是以 template 開(kāi)頭(當(dāng)然也可以使用 class,目前來(lái)講它們沒(méi)有任何區(qū)別),后跟類型參數(shù);類型參數(shù)不能為空,多個(gè)類型參數(shù)用逗號(hào)隔開(kāi)。

一但聲明了類模板,就可以將類型參數(shù)用于類的成員函數(shù)和成員變量了。換句話說(shuō),原來(lái)使用 int、float、char 等內(nèi)置類型的地方,都可以用類型參數(shù)來(lái)代替。

假如我們現(xiàn)在要定義一個(gè)類來(lái)表示坐標(biāo),要求坐標(biāo)的數(shù)據(jù)類型可以是整數(shù)、小數(shù)和字符串,例如:

x = 10、y = 10

x = 12.88、y = 129.65

x = "東經(jīng)180度"、y = "北緯210度"

這個(gè)時(shí)候就可以使用類模板,請(qǐng)看下面的代碼:

template //這里不能有分號(hào)

class Point{

public:

Point(T1 x, T2 y): m_x(x), m_y(y){ }

public:

T1 getX() const; //獲取x坐標(biāo)

void setX(T1 x); //設(shè)置x坐標(biāo)

T2 getY() const; //獲取y坐標(biāo)

void setY(T2 y); //設(shè)置y坐標(biāo)

private:

T1 m_x; //x坐標(biāo)

T2 m_y; //y坐標(biāo)

};

x 坐標(biāo)和 y 坐標(biāo)的數(shù)據(jù)類型不確定,借助類模板可以將數(shù)據(jù)類型參數(shù)化,這樣就不必定義多個(gè)類了。

注意:模板頭和類頭是一個(gè)整體,可以換行,但是中間不能有分號(hào)。

上面的代碼僅僅是類的聲明,我們還需要在類外定義成員函數(shù)。在類外定義成員函數(shù)時(shí)仍然需要帶上模板頭,格式為:

template

返回值類型 類名::函數(shù)名(形參列表){

//TODO:

}

第一行是模板頭,第二行是函數(shù)頭,它們可以合并到一行,不過(guò)為了讓代碼格式更加清晰,一般是將它們分成兩行。

下面就對(duì) Point 類的成員函數(shù)進(jìn)行定義:

template //模板頭

T1 Point::getX() const /*函數(shù)頭*/ {

return m_x;

}

template

void Point::setX(T1 x){

m_x = x;

}

template

T2 Point::getY() const{

return m_y;

}

template

void Point::setY(T2 y){

m_y = y;

}

請(qǐng)讀者仔細(xì)觀察代碼,除了 template 關(guān)鍵字后面要指明類型參數(shù),類名 Point 后面也要帶上類型參數(shù),只是不加 typename 關(guān)鍵字了。另外需要注意的是,在類外定義成員函數(shù)時(shí),template 后面的類型參數(shù)要和類聲明時(shí)的一致。

使用類模板創(chuàng)建對(duì)象

上面的兩段代碼完成了類的定義,接下來(lái)就可以使用該類創(chuàng)建對(duì)象了。使用類模板創(chuàng)建對(duì)象時(shí),需要指明具體的數(shù)據(jù)類型。請(qǐng)看下面的代碼:

Point p1(10, 20);

Point p2(10, 15.5);

Point p3(12.4, "東經(jīng)180度");

與函數(shù)模板不同的是,類模板在實(shí)例化時(shí)必須顯式地指明數(shù)據(jù)類型,編譯器不能根據(jù)給定的數(shù)據(jù)推演出數(shù)據(jù)類型。

除了對(duì)象變量,我們也可以使用對(duì)象指針的方式來(lái)實(shí)例化:

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

Point *p = new Point("東經(jīng)180度", "北緯210度");

需要注意的是,賦值號(hào)兩邊都要指明具體的數(shù)據(jù)類型,且要保持一致。下面的寫(xiě)法是錯(cuò)誤的:

//賦值號(hào)兩邊的數(shù)據(jù)類型不一致

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

//賦值號(hào)右邊沒(méi)有指明數(shù)據(jù)類型

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

綜合示例

將上面的類定義和類實(shí)例化的代碼整合起來(lái),構(gòu)成一個(gè)完整的示例,如下所示:

#include

using namespace std;

template //這里不能有分號(hào)

class Point{

public:

Point(T1 x, T2 y): m_x(x), m_y(y){ }

public:

T1 getX() const; //獲取x坐標(biāo)

void setX(T1 x); //設(shè)置x坐標(biāo)

T2 getY() const; //獲取y坐標(biāo)

void setY(T2 y); //設(shè)置y坐標(biāo)

private:

T1 m_x; //x坐標(biāo)

T2 m_y; //y坐標(biāo)

};

template //模板頭

T1 Point::getX() const /*函數(shù)頭*/ {

return m_x;

}

template

void Point::setX(T1 x){

m_x = x;

}

template

T2 Point::getY() const{

return m_y;

}

template

void Point::setY(T2 y){

m_y = y;

}

int main(){

Point p1(10, 20);

cout<

Point p2(10, "東經(jīng)180度");

cout<

Point *p3 = new Point("東經(jīng)180度", "北緯210度");

cout<getX()<getY()<

return 0;

}

運(yùn)行結(jié)果:

x=10, y=20

x=10, y=東經(jīng)180度

x=東經(jīng)180度, y=北緯210度

在定義類型參數(shù)時(shí)我們使用了 class,而不是 typename,這樣做的目的是讓讀者對(duì)兩種寫(xiě)法都熟悉。

總結(jié)

以上是生活随笔為你收集整理的c语言模板类,C++类模板(Class Template)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。