c 類是怎麼理解,c 類别範本是怎麼理解

2022-12-07 02:26:05 字數 5634 閱讀 7198

1樓:匿名使用者

模板類英文為class template,template的中文翻譯為模板,所以模板類的意思其實是:類的模板。

顧名思義,模板類是相當於一個模具,當引數給定時,生成具體的類,也叫例項化。它的提出主要是為了減少**重複。

例如,我們可以用下面的**交換兩個數b和c

a = b;

b = c;

c = a;

這個交換過程與a,b,c的具體型別沒有關係,因此我們可以用它來交換兩個整數,或者兩個浮點數。更一般的,我們可以用來交換兩個具有賦值運算子的型別。因此,可以用模板進行一般化:

template

void swap(t &b, t &c)

當然,上面介紹的這個不是模板類,而是模板函式。不過他們的概念是類似的。其中一開始的template代表後面尖括號中的是模板引數(類似於函式的引數),class代表引數是類(相應的,可以用template來宣告整型引數)。

後面的**和的函式基本沒有區別,只是用t來代替了具體的型別,例如int,double等。根據需要我們可以用swap(b,c)來交換兩個整數,swap(b,c)交換兩個浮點數。由於編譯器可以根據b,c的具體型別推導t的具體含義,因此可以簡寫為swap(b,c)。

回到模板類,假設我們需要一個型別來代表動態陣列,且該型別支援size成員函式。如果是整型的類,我們可能會寫

class vector_int;

如果某一天,我們又需要浮點型別的動態陣列,可能又會寫

class vector_double;

於是就會發現它們的**是如此的類似,因此我們希望將它一般化。如同swap函式的做法,我們將它定義為模板類:

template

class vector;

因此,vec_int等同於vector,而vector_double等同於vector。因為運用模板類的語法類似於

vectora;

因此,編譯器沒辦法為我們推導t的具體含義,所以不能像模板函式一樣進行簡寫。

當然,上面是比較簡單的情況,有時候我們需要的類在大多數情況下是一樣的,但是對於某幾個特殊情形可能不太一樣,例如我們可能希望對於bool型別的陣列能儘量減少記憶體的使用,用一個位元位代表一個bool值。從而,我們的陣列不是通過bool a[10]的形式來定義。在這種情況下,c++提供了模板特化,也就是說當模板的引數取某個具體的值時,我們使用不同的模板,定義方式如下:

template<>

class vector;

2樓:匿名使用者

你不要跟著他繞,越繞越頭暈,你只要記住這裡的t代表一種型別就行了。模版例項化時只是把t用相應的型別替換。

如簡單的min模版:

template

t min(t a, t b)

void x(t x)

void y(t y)

t x(void)const

t y(void)const

void print()const;

private:

t m_x, m_y;

}; template

void c2dpoint::print()const

3樓:lulu老公

t 就是定義了一種型別 在後面使用的時候 會給他一個初始化的值#include

using namespace std;

const int stacksize=100;

template

class seqstack

~seqstack(){}

void push(t x);

t pop();

t gettop()

bool empty();

void print();

private:

t data[stacksize];

int top;

};template

bool seqstack::empty()template

void seqstack::push(t x)template

t seqstack::pop()

template

void seqstack::print()case 2:

case 3:

case 4:

default:}}

stack.~seqstack();

return 0;}

4樓:

裡面放一個型別,這個類裡的所有t都成這個型別

c++模板概念是什麼?詳細點

5樓:都菀

模板可以認為是類的類,我們知道一個類可以例項化為一個物件,那麼類其實可以認為是一個模板類的一份例項,我們可以讓一個模板類產生多份類例項,只需要簡單的指定不同的模板引數,這樣可以進一步提高**的抽象性,不知道你瞭解lua或者as3這類指令碼程式語言麼,他們都提供函式型別,as3提供類型別,這些語言認為一份函式**其實就是某個函式物件,一份類**就是某個模板類的一份例項;不知你理解了木有

6樓:匿名使用者

模板這東西,相當於容器,就vector模板來說吧,我們可以將它想象為排成一列的桶,桶裡面的裝的東西就是你需要放的元素,也許是int型別、double型別,自定義的結構、聯合、類等元素,也可能還是另外的模板(就是說桶裡面又有一個小的桶)。

至於模板函式,就容易了,不指定任何型別,因為無法確定需要的型別,所以就相當於空在那裡,等使用者自己來確定,到底該放什麼東西在上面。

7樓:匿名使用者

有以下這樣3個求加法的函式:

int add(int x,int y)

double add(double x,double y)long add(long x,long y)它們擁有同一個函式名,相同的函式體,卻因為引數型別和返回值型別不一樣,所以是3個完全不同的函式。即使它們是二元加法的過載函式,但是不得不為每一函式編寫一組函式體完全相同的**。如果從這些函式中提煉出一個通用函式,而它又適用於多種不同型別的資料,這樣會使**的重用率大大提高。

那麼 c++的模板就可解決這樣的問題。模板可以實現型別的引數化(把型別定義為引數),從而實現了真正的**可重用性。c++中的模板可分為函式模板和類别範本,而把函式模板的具體化稱為模板函式,把類别範本的具體化成為模板類。

8樓:曦夕兮

我打個比方吧,假如說你學了c語言很久,對連結串列很熟練,然後別人想讓你寫一個簡單的學生管理系統,但是雖然爛熟於心,但是寫那麼多插入連結串列,刪除連結串列,查詢連結串列函式依然很麻煩,而且都是一樣的**,寫很多遍就煩了。

那麼能不能做一個模板類,把所有的通用**整合起來,我們只需要呼叫模板函式就可以不用寫一些基礎**了。

就這樣,模板類誕生了,模板類整合了很對前人優秀的**,舉了例子,list模板

這是連結串列模板,我們以後寫插入連結串列,刪除連結串列,查詢連結串列函式,再也不用也麻煩的**從遍歷連結串列開始,直接list。insert(),list。srarch(),list。

delete()就可以實現功能了,所以,模板就是為了方便而產生的

c++中類别範本與模板類什麼區別?

9樓:匿名使用者

關於來模版方面的一些概自念和術語,標準委員會中還沒有給出精確地定義。

關於如何稱呼具備模版特性的類現今還存在一些混淆。

類模版 (class template)說明的是該類是一個模版,它代表的是整個類家族的引數化描述。

模版類 (template class)通常被用於下面幾個方面:

(1)作為類模版的同義詞

(2)從模版產生類

(3)具有一個template-id名稱的類。(template-id指的是模版名稱與緊隨其後的尖括號內部的所有實參的組合)

第二個和第三個含義區別是很細微的,它們的這些區別無關緊要。

通常使用的是 類模版。就像常使用 函式模版,而不是模版函式。

看一下 《c++ templates》這些解釋都有~

10樓:匿名使用者

類别範本表示一個類來是模板。

這就是源說它是「一整族類」bai的參du數化描述。

模板類zhi有以下用法:

1 作為類别範本的dao同義語。

2 表示由模板產生的類。

3 由模板識別符號表示的類。

所謂模板識別符號,就是包含 <> 的類表示形式,如 list就是一個模板識別符號,list也是,有細微差別,此處不詳述了。

模板類的含義不夠精確,最好使用類别範本這個名詞。

11樓:錦風很常見

給你補充一

bai下:c++中函式

du模板與模板函式的區zhi別?

其(一)函式dao模板專不是一個函式,而是一組函式的模板,在屬定義中使用了引數型別;

其(二)模板函式是一個實實在在的函式定義,它的函式體與某個模板函式的函式體相同。

c++中,類别範本和模板類有什麼區別?

12樓:匿名使用者

類模版 (class template)說明的是該類是一個模版,它代表的是整個類家族的引數化描述。

模版類 (template class)通常被用於下面幾個方面:

(1)作為類模版的同義詞

(2)從模版產生類

(3)具有一個template-id名稱的類。(template-id指的是模版名稱與緊隨其後的尖括號內部的所有實參的組合)

第二個和第三個含義區別是很細微的,它們的這些區別無關緊要。

通常使用的是 類模版。就像常使用 函式模版,而不是模版函式。

13樓:匿名使用者

類别範本的重點是模板。表示的是一個模板,專門用於產生類的模子。例子:

template

class vector

; 使用這個vector模板就可以產生很多的class(類),vector 、vector 、vector < vector > 、vector ……。

模板類的重點是類。表示的是由一個模板生成而來的類。例子:

上面的vector 、vector 、……全是模板類。

14樓:匿名使用者

類别範本,主要是指c++中的模板可以分為函式模板和類别範本兩種。

模板類,則是和普通類相區別,指使用了模板的類。

兩者都是指代使用了template進行定義或宣告的類。

15樓:匿名使用者

只是說法不同. 意義一樣.

c++為什麼要有模板?模板有什麼用?使用模板和直接使用類或函式有什麼區別?

16樓:匿名使用者

使用模板是為了實現泛型,可以減輕程式設計的工作量,增強函式的重用性。

例如將兩個變數交換的函式swap;

如果不是用模板的話我們需要針對不同的型別寫很多個功能相同的函式,例如int、char等等

而使用模板的話則只用使用一個函式就足夠了

template

void swap(t a, t b);

呼叫的時候可以顯示的說明型別例如:swap(3, 5)也可以使用簡單的用法,和使用普通函式是一樣的:swap(3, 5)更具體的你可以自己查閱相關資料

c為何類才能使用預設引數而函式c,為何模板類才能使用預設模板引數,而模板函式卻不能?求教。

這是因為函式是根據呼叫時的引數型別反推模板引數型別。而模板類别範本引數型別是你申明物件時給出的。好拗口啊!還是拿你的例子來舉例來說明好了 我們定義一個模板函式 template func t1 p1,t2 p2 然後在某一個地方呼叫 int x short y func x,y 編譯器編譯這裡的 時...

c變長引數列表,c 使用類别範本的引數列表

在c編譯器通常提供了一系列處理可變引數的巨集,實現就像printf 那樣的變長引數列表,這樣可以遮蔽不同的硬體平臺造成的差異,增加程式的可移植性。這些巨集包括va start va arg和va end等,這些巨集都是在標頭檔案裡定義的。採用ansi標準形式時,引數個數可變的函式的原型宣告是 typ...

C類庫怎麼寫怎麼用,C 的類庫檔案怎麼用?

類庫是有多個類組成的,每個類為你做系列的操作。以access為例,你建立一個access類庫,這個類庫裡面包含有多個類,如果想要執行資料庫的刪,改,增加,只呼叫類庫中一個類的executenonquery方法就好了,在其他位置呼叫executenonquery方法的時候,只需要輸入把資料庫連線字串,...