c中typename和class的區別介紹

2021-03-03 21:01:35 字數 5409 閱讀 9355

1樓:老王談網際網路

相信學習c++的人對class這個關鍵字都非常明白,class用於定義類。在

模板引入c++後,最初定義模內板的方容法為: template......

在這裡class關鍵字表明t是一個型別,後來為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字。它的作用同

class一樣表明後面的符號為一個型別,這樣在定義模板的時候就可以使用下面的方式了: template......

在模板定義語法中關鍵字class與typename的作用完全一樣。

typename難道僅僅在模板定義中起作用嗎?其實不是這樣,typename另外一個作用為:使用巢狀依賴型別(nested depended name),

c++template中typename 和class有什麼區別?

2樓:匿名使用者

實際上可以說沒有區別。

按 c++ 標準來說,template用於基礎資料型別,typename 指型別名,t 可以取 char int double 等。

template用於類,t 可以取任何類。

但是這裡有一個問題,結構體應該用 typename 還是 class? 結構體肯定不是基礎資料型別,但也不是類。

所以實際情況是,template的 t 也可以取基礎資料型別,tempate的 t 也可以取類。

但有一個特例,就是當 t 是一個類,而這個類又有子類(假設名為 innerclass) 時,應該用 template:

typename t::innerclass myinnerobject;

這裡的 typename 告訴編譯器,t::innerclass 是一個類,程式要宣告一個 t::innerclass 類的物件,而不是宣告 t 的靜態成員,而 typename 如果換成 class 則語法錯誤。

以下這篇文章介紹得比較詳細:

c++template中typename 和class有什麼區別

3樓:匿名使用者

又是歷史原因,以前是用class,後來c++ standard 出現後,引入了typename, 所以他們是一樣的。

但是,又有一些微妙的不同,因為有時候,你不得不使用typename.

1. 在宣告 template parameters(模板引數)時,class 和 typename 是可互換的。

2. 用 typename 去標識 nested dependent type names(巢狀依賴型別名),在 base class

lists(基類列表)中或在一個 member initialization list(成員初始化列表)中作為一個 base class

identifier(基類識別符號)時除外。

for example:

1 using namespace std;

2 3 template int vcount(vectorv)

c++template中typename 和class有什麼區別

4樓:匿名使用者

實際上可以

說沒抄有區別。襲

按 c++ 標準來說,template 用於基礎資料型別,typename 指型別名,t 可以取 char int double 等。

template 用於類,t 可以取任何類。

但是這裡有一個問題,結構體應該用 typename 還是 class? 結構體肯定不是基礎資料型別,但也不是類。

所以實際情況是,template 的 t 也可以取基礎資料型別,tempate 的 t 也可以取類。

template作用是什麼?請幫忙解釋下,急

5樓:匿名使用者

這個是c++中的模板..template這個是定義模板的固定格式,規定了的.. 你上面的那個**就是定義了一個模板函式...

模板應該可以理解到它的意思吧.. 比如你想求2個int float 或double型變數的值,只需要定義這麼一個函式就可以了,假如不用模板的話,你就必須針對每種型別都定義一個sum函式..int sum(int, int);float sum(float, float);double sum(double, double);

c++中的<>代表什麼意思?

6樓:天涼秋夜

c++中的<>代表c++模板。

模板是c++支援引數化多型的工具,使用

模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。

c++語言是一種物件導向的強型別語言,由at&t的bell實驗室於2023年推出。c++語言是c語言的一個向上相容的擴充。c++是一種支援多範型的程式設計語言,它既支援物件導向的程式設計,也支援程序導向的程式設計。

c++支援基本的物件導向概念:物件、類、方法、訊息、子類和繼承。

7樓:匿名使用者

c++模板

模板是c++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。

模板是一種對型別進行引數化的工具;

通常有兩種形式:函式模板和類别範本;

函式模板針對僅引數型別不同的函式;

類别範本針對僅資料成員和成員函式型別不同的類。

使用模板的目的就是能夠讓程式設計師編寫與型別無關的**。比如編寫了一個交換兩個整型int 型別的swap函式,這個函式就只能實現int 型,對double,字元這些型別無法實現,要實現這些型別的交換就要重新編寫另一個swap函式。使用模板的目的就是要讓這程式的實現與型別無關,比如一個swap模板函式,即可以實現int 型,又可以實現double型的交換。

模板可以應用於函式和類。下面分別介紹。

注意:模板的宣告或定義只能在全域性,名稱空間或類範圍內進行。即不能在區域性範圍,函式內進行,比如不能在main函式中宣告或定義一個模板。

一、函式模板通式

1、函式模板的格式:

template

返回型別 函式名(引數列表)

其中template和class是關見字,class可以用typename 關見字代替,在這裡typename 和class沒區別,<>括號中的引數叫模板形參,模板形參和函式形參很相像,模板形參不能為空。一但宣告瞭模板函式就可以用模板函式的形參名宣告類中的成員變數和成員函式,即可以在該函式中使用內建型別的地方都可以使用模板形參名。模板形參需要呼叫該模板函式時提供的模板實參來初始化模板形參,一旦編譯器確定了實際的模板實參型別就稱他例項化了函式模板的一個例項。

比如swap的模板函式形式為

template void swap(t& a, t& b){},

當呼叫這樣的模板函式時型別t就會被被呼叫時的型別所代替,比如swap(a,b)其中a和b是int 型,這時模板函式swap中的形參t就會被int 所代替,模板函式就變為swap(int &a, int &b)。而當swap(c,d)其中c和d是double型別時,模板函式會被替換為swap(double &a, double &b),這樣就實現了函式的實現與型別無關的**。

2、注意:對於函式模板而言不存在 h(int,int) 這樣的呼叫,不能在函式呼叫的引數中指定模板形參的型別,對函式模板的呼叫應使用實參推演來進行,即只能進行 h(2,3) 這樣的呼叫,或者int a, b; h(a,b)。

二、類别範本通式

1、類别範本的格式為:

template

class 類名

;類别範本和函式模板都是以template開始後接模板形參列表組成,模板形參不能為空,一但宣告瞭類别範本就可以用類别範本的形參名宣告類中的成員變數和成員函式,即可以在類中使用內建型別的地方都可以使用模板形參名來宣告。比如

templateclass a;

在類a中宣告瞭兩個型別為t的成員變數a和b,還宣告瞭一個返回型別為t帶兩個引數型別為t的函式hy。

2、類别範本物件的建立:比如一個模板類a,則使用類别範本建立物件的方法為am;在類a後面跟上一個<>尖括號並在裡面填上相應的型別,這樣的話類a中凡是用到模板形參的地方都會被int 所代替。當類别範本有兩個模板形參時建立物件的方法為am;型別之間用逗號隔開。

3、對於類别範本,模板形參的型別必須在類名後的尖括號中明確指定。比如a<2> m;用這種方法把模板形參設定為int是錯誤的(編譯錯誤:error c2079:

'a' uses undefined class 'a'),類别範本形參不存在實參推演的問題。也就是說不能把整型值2推演為int 型傳遞給模板形參。要把類别範本形參調置為int 型必須這樣指定am。

4、在類别範本外部定義成員函式的方法為:

template《模板形參列表》 函式返回型別 類名《模板形參名》::函式名(引數列表),

比如有兩個模板形參t1,t2的類a中含有一個void h()函式,則定義該函式的語法為:

templatevoid a::h(){}。

注意:當在類外面定義類的成員時template後面的模板形參應與要定義的類的模板形參一致。

5、再次提醒注意:模板的宣告或定義只能在全域性,名稱空間或類範圍內進行。即不能在區域性範圍,函式內進行,比如不能在main函式中宣告或定義一個模板。

8樓:匿名使用者

這個<>是用來寫指令的,比如hallowork

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

9樓:匿名使用者

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

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

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

(2)從模版產生類

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

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

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

10樓:匿名使用者

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

template

class vector

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

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

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

C 中outfile open和infile open是什麼意思啊

這是不是演算法啊 好象就是嵌入程式和結束程式 outfile應該是定義的一個檔案輸出流 根據名字判斷 就是輸出資料到檔案裡。infile應該是定義的一個檔案輸入流 根據名字判斷 就是要從檔案讀取資料的。open 是要開啟這個檔案流對應的檔案 infile.open d aaa.txt 就是要用變數名...

C中decimal,double和float的區別

vue實踐 css樣式position display float屬性對比使用 float 單精度浮點 32bit,double 雙精度浮點64bit,decimal是高精度 128bit,浮點型。float double 是 基本型別 primitive type decimal不是。float ...

c盤中programfiles和programfiles86區別

program files的資料夾都是系統盤中安裝軟體的資料夾,其中program files是64位軟體安裝目錄 program files x86 是32位軟體安裝目錄,這是因為64位系統可以相容32位的軟體,但兩者需要區分安裝,使用上沒有區別。以下是詳細介紹 1 這兩個資料夾都是系統盤中安裝軟...