日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

如何在C++中struct與Class的的區(qū)別

出處:tpe1026 發(fā)布于:2010-04-13 16:33:49

  從語法上,在C++中(只討論C++中)。class和struct做類型定義時只有兩點區(qū)別:

 ?。ㄒ唬┠J(rèn)繼承權(quán)限。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理;

 ?。ǘ┏蓡T的默認(rèn)訪問權(quán)限。class的成員默認(rèn)是private權(quán)限,struct默認(rèn)是public權(quán)限。

  除了這兩點,class和struct基本就是一個東西。語法上沒有任何其它區(qū)別。

  不能因為學(xué)過C就總覺得連C++中struct和class都區(qū)別很大,下面列舉的說明可能比較無聊,因為struct和class本來就是基本一樣的東西,無需多說。但這些說明可能有助于澄清一些常見的關(guān)于struct和class的錯誤認(rèn)識:

 ?。?)都可以有成員函數(shù);包括各類構(gòu)造函數(shù),析構(gòu)函數(shù),重載的運算符,友元類,友元結(jié)構(gòu),友元函數(shù),虛函數(shù),純虛函數(shù),靜態(tài)函數(shù);

 ?。?)都可以有一大堆public/private/protected修飾符在里邊;

 ?。?)雖然這種風(fēng)格不再被提倡,但語法上二者都可以使用大括號的方式初始化:A a = {1, 2, 3};不管A是個struct還是個class,前提是這個類/結(jié)構(gòu)足夠簡單,比如所有的成員都是public的,所有的成員都是簡單類型,沒有顯式聲明的構(gòu)造函數(shù)。

 ?。?)都可以進行復(fù)雜的繼承甚至多重繼承,一個struct可以繼承自一個class,反之亦可;一個struct可以同時繼承5個class和5個struct,雖然這樣做不太好。

  (5)如果說class的設(shè)計需要注意OO的原則和風(fēng)格,那么沒任何理由說設(shè)計struct就不需要注意。

 ?。?)再次說明,以上所有說法都是指在C++語言中,至于在C里的情況,C里是根本沒有“class”,而C的struct從根本上也只是個包裝數(shù)據(jù)的語法機制。

  ---------------------------------------------------------------

  ,作為語言的兩個關(guān)鍵字,除去定義類型時有上述區(qū)別之外,另外還有一點點:“class”這個關(guān)鍵字還用于定義模板參數(shù),就像“typename”。但關(guān)鍵字“struct”不用于定義模板參數(shù)。

  如果沒有多態(tài)和虛擬繼承,在C++中,struct和class的存取效率完全相同!簡單的說就是,存取class的data member和非virtual function效率和struct完全相同!不管該data member是定義在基類還是派生類的。

  如果不是為了和C兼容,C++中就不會有struct關(guān)鍵字。因此建議是:如果不需要與C兼容或傳遞參數(shù)給C程序,不要在C++中用struct。

  注意class的data member在內(nèi)存中的布局可不一定是data member的申明次序。C++只保證處于同一個access section的data member按照申明次序排列。

  struct所體現(xiàn)的是一種數(shù)據(jù)結(jié)構(gòu),而class則是體現(xiàn)OOP思想中的"封裝"的特性~~~

  還有一個區(qū)別:struct可以用{}賦初值,而class不行

  比如聲明如下:

  struct abc{ int m1; float m2; bool m3; }

  可以這么構(gòu)造對象:

  abc abcInstance{ 1, 1.0f, false };

  struct:屬性

  class:屬性+行為

  注意:在VC6里,class可以與模板關(guān)鍵字typename互換,但是struct好像就不可以,編譯好像通不過。對這個問題,我專門查了一些資料,發(fā)現(xiàn)網(wǎng)上確實有說 struct不能用于模板關(guān)鍵字而class可以,這似乎應(yīng)該是他們的一個不同了。然而,我又看了一下 《深度探索C++對象模型》,在書的前幾章(好像就是章)Lippman說:本來他的編譯器是不支持將struct作為模板關(guān)鍵字的,但后來改變了,也就是說struct 和class除了默認(rèn)的訪問屬性外,其他場合下真正的完全一樣了。對此,我認(rèn)為這個按理說是這樣的,但不同的編譯器可能會有自己的處理,就像VC6那樣。

  class中有方法,

  struct中沒有.

  class是一個擴展的struct

  array(類型一樣)->struct(類型可以不一致)->class(添加方法)

  雖然兩者都可以捆綁行為。

  但是,理解不一樣。

  struct,就是對程序員全局可見的數(shù)據(jù)與方法。簡化數(shù)據(jù)邏輯結(jié)構(gòu)的設(shè)計??梢哉f是一種自定義的數(shù)據(jù)結(jié)構(gòu)。

  而class,則是將數(shù)據(jù)與方法封裝,即讓行為與數(shù)據(jù)一致。則是一種編程方法。即客觀世界在代碼世界中的體現(xiàn)。體現(xiàn)的是一種編程思想。

  在C里面:struct不能包含函數(shù),而class可以。

  在C++里面:都可以有函數(shù),默認(rèn)情況下struct中變量是public,而class中是private

  有一點不明白,class支持的繼承和多態(tài),struct也支持??

  class在賦值運算符右邊出現(xiàn)需要有定義的拷貝構(gòu)造函數(shù),而struct是默認(rèn)的位拷貝.

  但是一般從兼容C的角度考慮,struct里面只包含數(shù)據(jù)成員而不包含成員函數(shù),這只是一個編程習(xí)慣問題。



  
關(guān)鍵詞:如何在C++中struct與Class的的區(qū)別

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!