欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析C#與C++相關(guān)概念的比較

 更新時間:2013年08月20日 09:05:46   作者:  
以下是對C#與C++的相關(guān)概念進行了比較和介紹。需要的朋友可以過來參考下

1、在C#中,class的變量為引用類型,在C++中class的變量為值類型,如myclass mc,在C++中,mc是值類型,成員存儲在程序的棧區(qū),在C#中,mc是引用類型,指向堆中的成員。

2、switch語句,C#中case后面可根字符串,如case “abc“,但在C++中卻不行,C++中case后面只跟數(shù)字,字符,和枚舉。

3、在C#中沒有C++中的私有繼承和保護繼承,只有公有繼承。

4、C#中可以通過關(guān)鍵字sealed把一個類聲明為密封類,即不能被作為父類被繼承出派出類,在C++中可通過把構(gòu)造函數(shù)聲明為private,讓其不能被作為父類被繼承出派出類,且同時不能實例化,但可通過類的靜態(tài)函數(shù)調(diào)用構(gòu)造函數(shù)來產(chǎn)生實例。

5、C#支持用戶自定義類型轉(zhuǎn)換,可通過關(guān)鍵字implicit定義隱式轉(zhuǎn)換,可通過關(guān)鍵字explicit定義顯式轉(zhuǎn)換。在C++中,可通過重載 = 操作符來達到隱式轉(zhuǎn)換的目的。

6、在C#中,運算符重載則一定要把運算符重載函數(shù)定義為類的成員,且必須用static和public關(guān)鍵字修飾,且對于一元運算符重載,需要一個參數(shù),對于二元運算符重載則需要兩個參數(shù)。在C++中,運算符重載,有一個默認的隱含參數(shù)this,則一元運算符重載無需參數(shù),二元只需一個參數(shù)。而且C#中不能重載 = 號運算符。

7、C#的catch語句有一個不帶任何參數(shù)的一般catch語句,它相當于C++中的catch(...)。

8、C#中用關(guān)鍵字abstract來聲明一個類為抽象類,抽象類不能實例化。在C++中通過聲明一個純虛函數(shù)來使一個類變成抽象類,同樣不能實例化。

9、對于結(jié)構(gòu)類型,即用關(guān)鍵字struct定義的數(shù)據(jù)結(jié)構(gòu),在C++中它與class的用法和功能相近,只是用class定義默認成員的訪問權(quán)限是私有的,而stract默認成員的訪問權(quán)限是公有的。而C#中class的變量是引用類型,而struct定義的變量則是值類型,成員的訪問權(quán)限與class一樣。注意,C#中結(jié)構(gòu)不允許有析構(gòu)函數(shù)。

10、對于結(jié)構(gòu)類型,預(yù)定義的無參數(shù)構(gòu)造函數(shù)對每個結(jié)構(gòu)都存在,不能刪除或重定義它,可以重載構(gòu)造函數(shù),但必須帶有參數(shù)。

11、在C#中數(shù)組是對象,繼承于System.Array,擁有一定的操作方法,并且數(shù)據(jù)是引用類型,引用在棧或堆上,而數(shù)組對象本身則在堆中。C++中數(shù)組只是數(shù)據(jù)或類的對象的一個集合,數(shù)組本身并不是對象,但數(shù)組中的元素可以是對象,數(shù)組本身可在棧中或在堆中。C#并不支持動態(tài)數(shù)組,而C++則可以通過new動態(tài)分配內(nèi)存,實現(xiàn)動態(tài)數(shù)組。

12、在C#中存在一種叫接口的數(shù)據(jù)類型,它是一組函數(shù)的聲明并沒有實現(xiàn)函數(shù)的引用類型,不能實例化,只有類才能實現(xiàn)接口,實現(xiàn)接口必須實現(xiàn)接口中的所有聲明的函數(shù)。在C++中雖然沒有這種默認數(shù)據(jù)類型,但是在C++中可以自己創(chuàng)建一個接口類型,就是把里面的函數(shù)全部聲明純虛函數(shù),并不含數(shù)據(jù)成員,來實現(xiàn)相同的功能。

13、C#中一個類可以實現(xiàn)多個接口,各個接口必須以‘,'分隔,如果還有基類,則基類必須寫在最前面,如果多個接口中有多個相同的簽名和返回類型的接口成員,類則可以實現(xiàn)單個成員來滿足所有包含重復(fù)成員的接口。這是C#中的默認方式,也可以用點運算符來指定實現(xiàn)的成員所屬的接口。這與C++中的多繼承而產(chǎn)生的歧義問題相似,它并不提供這種默認的機制,在C++中則是相對自由的,你可以通過域運算符來指明你所調(diào)用的是哪個基類的成員,或是你實現(xiàn)的是哪個基類的成員。若你只想你的派生類對同一簽名的函數(shù)或成員只有一份實現(xiàn),則可以使用虛繼承的方法來實現(xiàn)。

14、在C#中類只能單繼承不能實現(xiàn)多繼承,而對于接口,接口可以實現(xiàn)單繼承和多繼承,而實現(xiàn)它的類必須對接口繼承體系中所有的接口成員提供實現(xiàn)。

15、在C#中存在叫裝箱和拆箱的轉(zhuǎn)換,為什么會有這兩種轉(zhuǎn)換,是因為C#中的變量數(shù)據(jù)有的保存在堆中(引用類型),有的則保存在棧中(值類型),當要把值類型賦給引用類型時,就要把值類型裝箱,反之則需要拆箱。而且拆箱是顯式轉(zhuǎn)換。裝箱之后,引用類型在堆中保存的值是原值類型的一個副本。在C++中則不存在這樣的問題,因為變量數(shù)據(jù)默認是保存在棧中的,若要保存在堆中則需要用到指針,要賦值則需要p->data = data或(*p).data = data。也可以通過重載‘='運算符來達到隱式轉(zhuǎn)換的效果。

16、在C#的泛型編程中,可用關(guān)鍵字where來對類型參數(shù)進行約束,例如class myclass<T1, T2, T3> where T2:cls2 where T3:In3。則只有cls2類型或其派生類型才能作為T2的實參,而只有In3接口類型才能作為T3的實參。這與C++中泛型編程中的模板特化和模板偏特化相似,在C++中可以用這樣的形式實現(xiàn)相似的功能,class myclass<T1, cls, In3>。

相關(guān)文章

最新評論