CC++中typedefstruct和struct的用法_第1頁
CC++中typedefstruct和struct的用法_第2頁
CC++中typedefstruct和struct的用法_第3頁
CC++中typedefstruct和struct的用法_第4頁
CC++中typedefstruct和struct的用法_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、C/C+中typedefstruct和struct的用法xml代碼1. 由于對typedefS解不夠,因此從網(wǎng)上摘錄了一些資料,整理如下:2.3. C/C+中typedefstruc和struct的用法4.5. struct_x1x1和typedefstruct_x2x2有什么不同?6.7.8. 其實,前者是定義了類_x1和_x1的對象實例x1,后者是定義了類_x2和_x2的類別名x2,9.10.所以它們在使用過程中是有取別的.請看實例1.11 .12 .知識點13.14.結(jié)構(gòu)也是一種數(shù)據(jù)類型,可以使用結(jié)構(gòu)變量,因此,象其它類型的變量一樣,在使用結(jié)構(gòu)變量時要先對其定義。15.16. 定義結(jié)構(gòu)變

2、量白一般格式為:17.18. struct結(jié)構(gòu)名19.20. 21.22. 類型變量名;23.24. 類型變量名;25.26. .27.28. 結(jié)構(gòu)變量;29.30. 結(jié)構(gòu)名是結(jié)構(gòu)的標識符不是變量名。4.另一種常用格式為:8. typedefstruc錯構(gòu)名39.40. 41.42. 類型變量名;43.44. 類型變量名;45.46. .47.48. 結(jié)構(gòu)別名;2.53.54.另外注意:在C中,struct不能包含函數(shù)。在C+中,對struct進行了擴展,可以包含函數(shù)8.=2. 實例1:stru

3、ct.cpp6. #include<iostream>67.68. usingnamespacestd;69.70. typedefstruct_point71.72. intx;73.74. inty;75.76. point;/定義類,給類一個別名0. struct_hello81.82. intx,y;83.84. hello;/同時定義類和對象8.89.90. intmain()91.92. 93.94. pointpt1;95.96. ptl.x=2;97.98. pt1.y=5;99.100. cout<

4、<"ptpt1.x="<<pt1.x<<"pt.y="<<pt1.y<<endl;04. /hellopt2;105.106. /pt2.x=8;107.108. /pt2.y=10;109.110. /cout<<"pt2Pt2.x="<<pt2.x<<"pt2.y="<<pt2.y<<endl;111.112. /上面的hellopt2;這一行編譯將不能通過.為什么?113

5、.114. 因為hello是被定義了的對象實例了.115.116. /正確做法如下:用hello.x和hello.y20. hello.x=8;121.122. hello.y=10;123.124. cout<<"hellohello.x="<<hello.x<<"hello.y="<<hello.y<<endl;28. return0;129.130. 34.135.136. typedefstructstruct

6、的區(qū)別137.138. 1.基本解釋139.140. typedef為C語言的關(guān)鍵字,作用是為一種數(shù)據(jù)類型定義一個新名字。這里的數(shù)據(jù)類型包括內(nèi)部數(shù)據(jù)類型(int,char等)和自定義的數(shù)據(jù)類型(struct等)。44.在編程中使用typedef目的一般有兩個,一個是給變量一個易記且意義明確的新名字,另一個是簡化一些比較復(fù)雜的類型聲明。48.至于typede年T什么微妙之處,請你接著看下面對幾個問題的具體闡述。52. 2.typedef匐構(gòu)的問題56.當(dāng)用下面的代碼定義一個結(jié)構(gòu)時,編譯器報了一

7、個錯誤,為什么呢?莫非C語言不允許在結(jié)構(gòu)中包含指向它自己的指針嗎?請你先猜想一下,然后看下文說明:60. typedefstructtagNode161.162. 163.164. char*pItem;165.166. pNodepNext;167.168. *pNode;72.答案與分析:76. 1、typedef的最簡單使用80. typedeflongbyte_4;84. 給已知數(shù)據(jù)類型long起個新名字,叫byte_488. 2、

8、typedef與結(jié)構(gòu)結(jié)合使用92. typedefstructtagMyStruct193.194. 195.196. intiNum;197.198. longlLength;199.200. MyStruct;04.這語句實際上完成兩個操作:08. 1)定義一個新的結(jié)構(gòu)類型12. structtagMyStruct213.214. 215.216. intiNum;217.218. longlLength;219.220. ;24. 分析:tagMyStru的為

9、“tag,"即標簽",實際上是一個臨時名字,struct關(guān)鍵字和tagMyStructr起,構(gòu)成了這個結(jié)構(gòu)類型,不論是否有typedef,這個結(jié)構(gòu)都存在。28. 我們可以用structtagMyStructvarNarfie定義變量,但要注意,使用tagMyStructvarName來定義變量是不對的,因為struct和tagMyStru吟在一起才能表示一個結(jié)構(gòu)類型32.2)typede供;這個新的結(jié)構(gòu)起了一個名字,叫MyStruct35.typedefstructtagMyStructMyStr

10、uct;40. 因此,MyStruc拱際上相當(dāng)于structtagMyStruct我們可以使用MyStructvarName定義變量。44. 答案與分析48. C語言當(dāng)然允許在結(jié)構(gòu)中包含指向它自己的指針,我們可以在建立鏈表等數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)上看到無數(shù)這樣的例子,上述代碼的根本問題在于typedef的應(yīng)用。52. 根據(jù)我們上面的闡述可以知道:新結(jié)構(gòu)建立的過程中遇到了pNex城的聲明,類型是pNode要知道pNodeft示的是類型的新名字,那么在類型本身還沒有建立完成的時候,這個類型的新名字也還不

11、存在,也就是說這個時候編譯器根本不認識pNode56. 解決這個問題的方法有多種:257.258. 1)、259.260.261.262. typedefstructtagNode263.264. 265.266. char*pItem;267.268. structtagNode*pNext;269.270. *pNode;271.272. 2)、273.274.275.276. typedefstructtagNode*pNode;277.278. structtagNode279.280. 281.282. char*pItem;283.284. pNodepN

12、ext;285.286. ;287.288.289.290.注意:在這個傷J子中,你用typede給一個還未完全聲明的類型起新名字。C語言編譯器支持這種做法。291.292. 3)、規(guī)范做法:293.294.295.296. structtagNode297.298. 299.300. char*pItem;301.302. structtagNode*pNext;303.304. ;305.306. typedefstructtagNode*pNode;307.308.309.310.311.312. C+中typedef關(guān)鍵字的用法313.314. Typede于明有助于創(chuàng)建平臺無關(guān)類型,

13、甚至能隱藏復(fù)雜和難以理解的語法。不管怎樣,使用typedef能為代碼帶來意想不到的好處,通過本文你可以學(xué)習(xí)用typedef避免缺欠,從而使代碼更健壯。315.316. typedef明,簡稱typedef為現(xiàn)有類型創(chuàng)建一個新的名字。比如人們常常使用typedef來編寫更美觀和可讀的代碼。所謂美觀,意指typedef能隱藏笨拙的語法構(gòu)造以及平臺相關(guān)的數(shù)據(jù)類型,從而增強可移植性和以及未來的可維護性。本文下面將竭盡全力來揭示typedef強大功能以及如何避免一些常見的陷阱。317.318. 如何創(chuàng)建平臺無關(guān)的數(shù)據(jù)類型,隱藏笨拙且難以理解的語法?319.320.321.322.使用typedefs為現(xiàn)

14、有類型創(chuàng)建同義字。定義易于記憶的類型名323.324. typedef使用最多的地方是創(chuàng)建易于記憶的類型名,用它來歸檔程序員的意圖。類型出現(xiàn)在所聲明的變量名字中,位于"typedef"關(guān)鍵字右邊。例如:typedefintsize;325.326.此聲明定義了一個int的同義字,名字為size注意typedef并不創(chuàng)建新的類型。它僅僅為現(xiàn)有類型添加一個同義字。你可以在任何需要int的上下文中使用sizevoidmeasure(size*psz);327.328.sizearray4;329.330.sizelen=file.getlength();331.332.std:v

15、ector<size>vs;333.334.typedef還可以掩飾符合類型,如指針和數(shù)組。例如,你不用象下面這樣重復(fù)定義有81個字符元素的數(shù)組:charline81;335.336.chartext81;337.338.定義一個typedef每當(dāng)要用到相同類型和大小的數(shù)組時,可以這樣:typedefcharLine81;339.340.Linetext,secondline;341.342.getline(text);343.344.同樣,可以象下面這樣隱藏指針語法:typedefchar*pstr;345.346.intmystrcmp(pstr,pstr);347.348.這

16、里將帶我們到達第一個typedef陷阱。標準函數(shù)strcmp(打兩個conshar*'類型的參數(shù)。因止匕,它可能會誤導(dǎo)人們象下面這樣聲明mystrcmp()intmystrcmp(constpstr,constpstr);349.350.這是錯誤的,按照順序,'conpstr被解釋為charconst'(一個指向char的常量指針),而不是conchar*'(指向常量char的指針)。這個問題很容易解決:typedefconstchar*cpstr;351.352.intmystrcmp(cpstr,cpstr);/現(xiàn)在是正確的353.354.記?。翰还苁裁磿r候

17、,只要為指針聲明typedef,那么都要在最終的typedef名稱中加一個const以使得該指針本身是常量,而不是對象。代碼簡化355.356.上面討論的typedef行為有點像#de巾ne宏,用其實際類型替代同義字。不同點是typedef在編譯時被解釋,因此讓編譯器來應(yīng)付超越預(yù)處理器能力的文本替換。例如:typedefint(*PF)(constchar*,constchar*);357.358.這個聲明引入了PF類型作為函數(shù)指針的同義字,該函數(shù)有兩個constchar*類型的參數(shù)以及一個int類型的返回值。如果要使用下列形式的函數(shù)聲明,那么上述這個typedef是不可或缺的:PFRegis

18、ter(PFpf);359.360.Register。的參數(shù)是一個PF類型的回調(diào)函數(shù),返回某個函數(shù)的地址,其署名與先前注冊的名字相同。做一次深呼吸。下面我展示一下如果不用typedef我們是如何實現(xiàn)這個聲明的:intRegister(int(*pf)(constchar*,constchar*)361.362.(constchar*,constchar*);363.364.很少有程序員理解它是什么意思,更不用說這種費解的代碼所帶來的出錯風(fēng)險了。顯然,這里使用typedef不是一種特權(quán),而是一種必需。持懷疑態(tài)度的人可能會問:”O(jiān)K,有人還會寫這樣的代碼嗎?”,快速瀏覽一下揭示signal(而數(shù)的

19、頭文件<csinal>,一個有同樣接口的函數(shù)。typedef和存儲類關(guān)鍵字(storageclassspecifier365.366.這種說法是不是有點令人驚訝,typedefM像auto,extern,mutable,static,和register樣,是一個存儲類關(guān)鍵字。這并是說typedef會真正影響對象的存儲特性;它只是說在語句構(gòu)成上,typedef聲明看起來象static,extern等類型的變量聲明。下面將帶到第二個陷阱:typedefregisterintFAST_COUNTE錯誤367.368.編譯通不過。問題出在你不能在聲明中有多個存儲類關(guān)鍵字。因為符號typed

20、ef已經(jīng)占據(jù)了存儲類關(guān)鍵字的位置,在typedef明中不能用register(或任何其它存儲類關(guān)鍵字)。促進跨平臺開發(fā)369.370.typedef有另外一個重要的用途,那就是定義機器無關(guān)的類型,例如,你可以定義一個叫REAL勺浮點類型,在目標機器上它可以i獲得最高的精度:typedeflongdoubleREAL;371.372.在不支持longdouble的機器上,該typedef看起來會是下面這樣:typedefdoubleREAL;373.374.并且,在連double都不支持的機器上,該typedef看起來會是這樣:、typedeffloatREAL;375.376.你不用對源代碼做

21、任何修改,便可以在每一種平臺上編譯這個使用REA改型的應(yīng)用程序。唯一要改的是typedef本身。在大多數(shù)情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現(xiàn)。不是嗎?標準庫廣泛地使用typedef來創(chuàng)建這樣的平臺無關(guān)類型:size_tptrdiff和fpos_t就是其中的例子。止匕外,象std:string和std:ofstream®樣的typedef還隱藏了長長的,難以理解的模板特化語法,例如:basic_string<char,char_traits<char>allocator<char>>和basic_ofstream<c

22、har,char_traits<char>>377.378.379.380.381.382.typedef&#de巾ne的問題有下面兩種定義pStr數(shù)據(jù)類型的方法,兩者有什么不同?哪一種更好一點?typedefchar*pStr;383.384.#definepStrchar*;385.386.答案與分析:387.388.通常講,typedef要比#61ne要好,特別是在有指針的場合。請看例子:typedefchar*pStr1;389.390.#definepStr2char*391.392.pStrls1,s2;393.394.pStr2s3,s4;395.396

23、.在上述的變量定義中,sts2、s3都被定義為char*,而s4則定義成了char,不是我們所預(yù)期的指針變量,根本原因就在于#de巾ne只是簡單的字符串替換而typedef則是為一個類型起新名字。#define用法例子:#definef(x)x*x397.398.main()399.400.401.402.inta=6,b=2,c;403.404.c=f(a)/f(b);405.406.printf("%dn",c);407.408.409.410.以下程序的輸出結(jié)果是:36。411.412.因為如此原因,在許多C語言編程規(guī)范中提到使用#define定義時,如果定義中包含表

24、達式,必須使用括號,則上述定義應(yīng)該如下定義才對:#definef(x)(x*x)當(dāng)然,如果你使用typede砒沒有這樣的問題。413.414.4.typedef&#de巾ne的另一例下面的代碼中編譯器會報一個錯誤,你知道是哪個語句錯了嗎?415.416.typedefchar*pStr;417.418.charstring4="abc"419.420.constchar*p1=string;421.422.constpStrp2=string;423.424.p1+;425.426.p2+;427.428.答案與分析:429.430.是p2+出錯了。這個問題再一次提

25、醒我們:typedeD#de巾ne不同,它不是簡單的文本替換。上述代碼中constpStrp并不等于constchar*p2constpStrp和constlong林質(zhì)上沒有區(qū)別,都是對變量進行只讀限制,只不過此處變量p2的數(shù)據(jù)類型是我們自己定義的而不是系統(tǒng)固有類型而已。因止匕,constpStrp2勺含義是:限定數(shù)據(jù)類型為char*的變量p2為只讀,因此p2+錯誤。#define與typedefUl中談431.432.1)#de巾ne宏定義有一個特別的長處:可以使用#ifdef,#ifndef等來進行邏輯判斷,還可以使用#undef來取消定義。433.434.2)typede他有一個特別的長處:它符合范圍規(guī)則,使用typedef定義的變量類型其作用范圍限制在所定義的函數(shù)或者文件內(nèi)(取決于此變量定義的位置),而宏定義則沒有這種特性。435.436.5.typedef&復(fù)雜的變量聲明4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論