1、在C#中,class的變量為引用類型,在C++中class的變量為值類型,如myclass mc,在C++中,mc是值類型,成員存儲在程序的棧區,在C#中,mc是引用類型,指向堆中的成員。
2、switch語句,C#中case後面可根字符串,如case “abc“,但在C++中卻不行,C++中case後面只跟數字,字符,和枚舉。
3、在C#中沒有C++中的私有繼承和保護繼承,只有公有繼承。
4、C#中可以通過關鍵字sealed把一個類聲明為密封類,即不能被作為父類被繼承出派出類,在C++中可通過把構造函數聲明為private,讓其不能被作為父類被繼承出派出類,且同時不能實例化,但可通過類的靜態函數調用構造函數來產生實例。
5、C#支持用戶自定義類型轉換,可通過關鍵字implicit定義隱式轉換,可通過關鍵字explicit定義顯式轉換。在C++中,可通過重載 = 操作符來達到隱式轉換的目的。
6、在C#中,運算符重載則一定要把運算符重載函數定義為類的成員,且必須用static和public關鍵字修飾,且對於一元運算符重載,需要一個參數,對於二元運算符重載則需要兩個參數。在C++中,運算符重載,有一個默認的隱含參數this,則一元運算符重載無需參數,二元只需一個參數。而且C#中不能重載 = 號運算符。
7、C#的catch語句有一個不帶任何參數的一般catch語句,它相當於C++中的catch(...)。
8、C#中用關鍵字abstract來聲明一個類為抽象類,抽象類不能實例化。在C++中通過聲明一個純虛函數來使一個類變成抽象類,同樣不能實例化。
9、對於結構類型,即用關鍵字struct定義的數據結構,在C++中它與class的用法和功能相近,只是用class定義默認成員的訪問權限是私有的,而stract默認成員的訪問權限是公有的。而C#中class的變量是引用類型,而struct定義的變量則是值類型,成員的訪問權限與class一樣。注意,C#中結構不允許有析構函數。
10、對於結構類型,預定義的無參數構造函數對每個結構都存在,不能刪除或重定義它,可以重載構造函數,但必須帶有參數。
11、在C#中數組是對象,繼承於System.Array,擁有一定的操作方法,並且數據是引用類型,引用在棧或堆上,而數組對象本身則在堆中。C++中數組只是數據或類的對象的一個集合,數組本身並不是對象,但數組中的元素可以是對象,數組本身可在棧中或在堆中。C#並不支持動態數組,而C++則可以通過new動態分配內存,實現動態數組。
12、在C#中存在一種叫接口的數據類型,它是一組函數的聲明並沒有實現函數的引用類型,不能實例化,只有類才能實現接口,實現接口必須實現接口中的所有聲明的函數。在C++中雖然沒有這種默認數據類型,但是在C++中可以自己創建一個接口類型,就是把裡面的函數全部聲明純虛函數,並不含數據成員,來實現相同的功能。
13、C#中一個類可以實現多個接口,各個接口必須以‘,'分隔,如果還有基類,則基類必須寫在最前面,如果多個接口中有多個相同的簽名和返回類型的接口成員,類則可以實現單個成員來滿足所有包含重復成員的接口。這是C#中的默認方式,也可以用點運算符來指定實現的成員所屬的接口。這與C++中的多繼承而產生的歧義問題相似,它並不提供這種默認的機制,在C++中則是相對自由的,你可以通過域運算符來指明你所調用的是哪個基類的成員,或是你實現的是哪個基類的成員。若你只想你的派生類對同一簽名的函數或成員只有一份實現,則可以使用虛繼承的方法來實現。
14、在C#中類只能單繼承不能實現多繼承,而對於接口,接口可以實現單繼承和多繼承,而實現它的類必須對接口繼承體系中所有的接口成員提供實現。
15、在C#中存在叫裝箱和拆箱的轉換,為什麼會有這兩種轉換,是因為C#中的變量數據有的保存在堆中(引用類型),有的則保存在棧中(值類型),當要把值類型賦給引用類型時,就要把值類型裝箱,反之則需要拆箱。而且拆箱是顯式轉換。裝箱之後,引用類型在堆中保存的值是原值類型的一個副本。在C++中則不存在這樣的問題,因為變量數據默認是保存在棧中的,若要保存在堆中則需要用到指針,要賦值則需要p->data = data或(*p).data = data。也可以通過重載‘='運算符來達到隱式轉換的效果。
16、在C#的泛型編程中,可用關鍵字where來對類型參數進行約束,例如class myclass<T1, T2, T3> where T2:cls2 where T3:In3。則只有cls2類型或其派生類型才能作為T2的實參,而只有In3接口類型才能作為T3的實參。這與C++中泛型編程中的模板特化和模板偏特化相似,在C++中可以用這樣的形式實現相似的功能,class myclass<T1, cls, In3>。