解析C++和C的區(qū)別
C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言。它層次清晰,便于按模塊化方式組織程序,易于調(diào)試和維護(hù)。在很大程度上,標(biāo)準(zhǔn)C++是標(biāo)準(zhǔn)C的超集.實(shí)際上,所有C程序也是C++程序,然而,兩者之間有少量區(qū)別.下面簡(jiǎn)要介紹一下最重要的區(qū)別.
在C++中,民,局部變量可以在一個(gè)程序塊內(nèi)在任何地方聲明,在C中,局部變量必須在程序塊的開始部分,即在所有"操作"語(yǔ)句之前聲明,請(qǐng)注意,C99標(biāo)準(zhǔn)中取消了這種限制.
在C中,按如下方式聲明的函數(shù)沒(méi)有對(duì)函數(shù)變?cè)M(jìn)行任何說(shuō)明;
int func();
也就是說(shuō),如果沒(méi)有在函數(shù)后面的括孤內(nèi)指定任何變?cè)?這在C中就意味著對(duì)函數(shù)變?cè)醋鋈魏温暶?該函數(shù)可能有變?cè)?也可能沒(méi)有變?cè)?然而,在C++中,這樣的函數(shù)聲明意味著該函數(shù)沒(méi)有變?cè)?也就是說(shuō),在C++中,下面這兩個(gè)函數(shù)聲明具有同樣的作用:
int func();
int func(void);
在C++中,變?cè)斜碇械膙oid是任選的.許多C++程序員使用它們是為了表明函數(shù)沒(méi)有任何變?cè)?以便于他人理解程序.但是,從技術(shù)上說(shuō),void不是必須的.
在C++中,所有函數(shù)均必須被設(shè)計(jì)成原型,但這在C中只是一種選擇.編程經(jīng)驗(yàn)表明,在程序中也應(yīng)該給函數(shù)采用原型設(shè)計(jì)方法.在C與C++之間還存在一個(gè)重要而又細(xì)微的差別,即字符常數(shù)在C中被自動(dòng)作為整形來(lái)處理,但在C++中則不然.
在C中,多次聲明一個(gè)全局變量雖然不可取,但不算錯(cuò).在C++中,多次聲明同一個(gè)全局變量會(huì)引發(fā)錯(cuò)誤.
在C中,一個(gè)標(biāo)識(shí)符可以至少31個(gè)有效的組成字符.
在C++中,一個(gè)標(biāo)識(shí)符的所有組成字符均是有效的.可是,從實(shí)用角度看,過(guò)長(zhǎng)的標(biāo)識(shí)符沒(méi)有太大的用處,不僅不便于記憶,而且還會(huì)增加出現(xiàn)打字錯(cuò)誤的可能性.
在C中,在程序內(nèi)部調(diào)用main()函數(shù)的情形不常見,但這種做法是容許的,在C++中,這種做法是不容許的.
在C中,無(wú)法獲得register型的地址,在C++中則可以獲得這種地址.
在C中,如果類型聲明語(yǔ)句中沒(méi)有指定類型名,該類型被假定成int,這種隱式轉(zhuǎn)型在C99與C++中是不允許的.
#include
using namespace std;
為什么沒(méi)有.h后綴名?
名稱iostream沒(méi)有擴(kuò)展名.h,原因是
第二行告訴編譯程序使用std名稱空間,名稱空間是最近才添加到C++中,一個(gè)名稱空間建立一個(gè)聲明范圍,在該范圍內(nèi)可以放置各種程序元素.名稱空間用來(lái)幫助組織大型程序的結(jié)構(gòu).這條using語(yǔ)句通知編譯程序,程序員需要使用std名稱空間,這是整個(gè)標(biāo)準(zhǔn)C++庫(kù)聲明所使用的名稱空間.通過(guò)使用sdt名稱空間,程序可以簡(jiǎn)化對(duì)標(biāo)準(zhǔn)庫(kù)的訪問(wèn).普通C程序僅使用C子集,不需要名稱空間語(yǔ)句,因?yàn)镃的庫(kù)函數(shù)在默認(rèn)的全局名稱空間中是可使用的.
類與結(jié)構(gòu)體的區(qū)別:類與結(jié)構(gòu)體是相互關(guān)聯(lián)的
結(jié)構(gòu)是C的一部分,C++從C中繼承了結(jié)構(gòu),在語(yǔ)法上,類與結(jié)構(gòu)十分相似,在關(guān)系上,這兩者也很接近,在C++中,結(jié)構(gòu)的作用被拓寬了,進(jìn)而使結(jié)構(gòu)成為了類的一種替代方法.實(shí)際上,類與結(jié)構(gòu)的惟一區(qū)別在于:在默認(rèn)狀態(tài)下,結(jié)構(gòu)的所有成員均是公有的,而類的所有成員是私有的.除此之外,類與結(jié)構(gòu)是等價(jià)的,也就是說(shuō),一個(gè)結(jié)構(gòu)定義了一個(gè)類的類型.
C++同時(shí)包含這兩個(gè)等價(jià)的關(guān)鍵字struct與class基于3個(gè)方面的原因.第一,加強(qiáng)結(jié)構(gòu)的能力.在C中,結(jié)構(gòu)提供了一種數(shù)據(jù)分組方法,因而讓結(jié)構(gòu)包含成員函數(shù)是一個(gè)小小的改進(jìn).第二,由于類與結(jié)構(gòu)是相互關(guān)聯(lián)的,所有現(xiàn)有C代碼到C++的移植變得更容易.第三,由于類與結(jié)構(gòu)的等價(jià)性,提供兩個(gè)不同的關(guān)鍵字可以使類定義自由發(fā)展,為了保持C++與C的兼容性,結(jié)構(gòu)定義必須始終受它的C定義的結(jié)束.
即使在有些地方可以使用結(jié)構(gòu)來(lái)代替類,但盡量不要這么做,為了清楚起見,該用類的地方就用class關(guān)鍵字,該用C結(jié)構(gòu)的地方就用struct關(guān)鍵字.
類與聯(lián)合是相互關(guān)聯(lián)的
聯(lián)合也可以用來(lái)定義類.在C++中,聯(lián)合包含成員函數(shù),變量以及構(gòu)造與析構(gòu)函數(shù).C++聯(lián)合保留了C聯(lián)合的全部特征,其中最重要的特征是所有數(shù)據(jù)元素共享內(nèi)存的相同地址.與結(jié)構(gòu)類似,聯(lián)合的成員在默認(rèn)狀態(tài)下也是公有的,并且完全兼容于C.與結(jié)構(gòu)一樣,C++中的聯(lián)合聲明定義了一種特殊的類,進(jìn)而意味著保持了類的封裝原則.
C++的聯(lián)合有幾個(gè)必須遵守的使用限制.第一,聯(lián)合不能繼承其他任何類型的類.第二,聯(lián)合不能是基類,不能包含有虛函數(shù)成員.靜態(tài)變量不能是聯(lián)合的成員.聯(lián)合不能使用引用成員,而且不能有任何作為成員的重載賦值運(yùn)算符的對(duì)象.第三,如果一個(gè)對(duì)象包含明確的構(gòu)造或析構(gòu)函數(shù),該對(duì)象不能成為聯(lián)合的成員.
C++有一個(gè)叫做匿名聯(lián)合的特殊聯(lián)合.匿名聯(lián)合沒(méi)有類型名,也不聲明任何變量,只是告訴編譯程序它的成員變量共享一個(gè)內(nèi)存地址.但是,變量本身無(wú)需要使用常規(guī)的點(diǎn)運(yùn)算符語(yǔ)法即可直接引用.
上述聯(lián)合的使用限制也適用于匿名聯(lián)合,但下面這兩個(gè)限制除外,第一,匿名聯(lián)合所包含的元素只能是數(shù)據(jù),不能包含成員函數(shù),也不能包含私有或受保護(hù)元素;第二,全局匿名聯(lián)合必須聲明成靜態(tài)的.
通過(guò)本文的介紹,我們可以了解到,C是C++的基礎(chǔ),C++語(yǔ)言和C語(yǔ)言在很多方面是兼容的。因此,掌握了C語(yǔ)言,再進(jìn)一步學(xué)習(xí)C++就能以一種熟悉的語(yǔ)法來(lái)學(xué)習(xí)面向?qū)ο蟮恼Z(yǔ)言,從而達(dá)到事半功倍的目的。
【編輯推薦】
























