下表包含 C++ 和 C# 功能之間的重要比較。如果您是一位 C++ 程序員,此表將為您提供這兩種語言的最重要差異。
注意 C++ 和 C# 項目派生于不同的項目模型。有關(guān) C++ 和 C# 項目之間差異的信息,請參見項目中的項管理和使用解決方案資源管理器。 功能 參考主題 繼承:類只能繼承一個基類中的實現(xiàn)。另外,類或接口可以實現(xiàn)多個接口。 數(shù)組:聲明 C# 數(shù)組和聲明 C++ 數(shù)組的語法不同。在 C# 中,“[]”標(biāo)記出現(xiàn)在數(shù)組類型的后面。 bool 類型:bool 類型和其他類型(特別是 int)之間沒有轉(zhuǎn)換。 long 類型:在 C# 中,long 數(shù)據(jù)類型為 64 位,而在 C++ 中為 32 位。 struct 類型:在 C# 中,類和結(jié)構(gòu)在語義上不同。struct 是值類型,而 class 是引用類型。 switch 語句:與 C++ 中的 switch 語句不同,C# 不支持從一個 case 標(biāo)簽貫穿到另一個 case 標(biāo)簽。 delegate 類型:委托與 C++ 中的函數(shù)指針基本相似,但前者具有類型安全,是安全的。 從派生類調(diào)用重寫基類成員。 使用 new 修飾符顯式隱藏繼承成員。 聲明重寫方法需要有 override 關(guān)鍵字。 預(yù)處理器指令用于條件編譯。C# 中不使用頭文件。 異常處理:使用 finally 語句。 C# 運算符:C# 支持其他運算符,如 is 和 typeof。它還引入了某些邏輯運算符的不同功能。 關(guān)鍵字 extern 的使用。 關(guān)鍵字 static 的使用。 在構(gòu)造基類上替代 C++ 初始化列表的方法。 C# 程序的常規(guī)結(jié)構(gòu):命名空間、類、結(jié)構(gòu)、委托和枚舉。 Main 方法和 C++ 中的 main 函數(shù)的聲明方式不同。 方法參數(shù):C# 支持 ref 和 out 參數(shù),這兩個參數(shù)取代指針通過引用傳遞參數(shù)。 在 C# 中只在不安全模式下才使用指針。 unsafe 在 C# 中以不同的方式執(zhí)行重載運算符。 字符串:C# 字符串不同于 C++ 字符串。 string foreach 關(guān)鍵字使您得以循環(huán)訪問數(shù)組和集合。 foreach, in C# 中沒有全局方法和全局變量:方法和變量必須包含在類型聲明(如 class 或 struct)中。 C# 中沒有頭文件和 #include 指令:using 指令用于引用其他未完全限定類型名的命名空間中的類型。 C# 中的局部變量在初始化前不能使用。 析構(gòu)函數(shù):在 C# 中,不能控制析構(gòu)函數(shù)的調(diào)用時間,原因是析構(gòu)函數(shù)由垃圾回收器自動調(diào)用。 構(gòu)造函數(shù):與 C++ 類似,如果在 C# 中沒有提供類構(gòu)造函數(shù),則為您自動生成默認(rèn)構(gòu)造函數(shù)。該默認(rèn)構(gòu)造函數(shù)將所有字段初始化為它們的默認(rèn)值。 C# 不支持位域。 C++ 位域 C# 的輸入/輸出服務(wù)和格式設(shè)置依賴于 .NET Framework 的運行時庫。 在 C# 中,方法參數(shù)不能有默認(rèn)值。如果要獲得同樣的效果,請使用方法重載。
1.繼承:C++支持多繼承,C#類只能繼承一個基類中的實現(xiàn)但可以實現(xiàn)多個接口。 2.數(shù)組:聲明 C# 數(shù)組和聲明 C++ 數(shù)組的語法不同。在 C# 中,“[]”標(biāo)記出現(xiàn)在數(shù)組類型的后面。 3.數(shù)據(jù)類型:在C++中bool類可以與整型轉(zhuǎn)換,但C#中bool 類型和其他類型(特別是 int)之間沒有轉(zhuǎn)換。long 類型:在 C# 中,long 數(shù)據(jù)類型為 64 位,而在 C++ 中為 32 位。 4.struct 類型:在 C# 中,類和結(jié)構(gòu)在語義上不同。struct 是值類型,而 class 是引用類型。 5.switch 語句:與 C++ 中的 switch 語句不同,C# 不支持從一個 case 標(biāo)簽貫穿到另一個 case 標(biāo)簽。 6.delegate 類型:委托與 C++ 中的函數(shù)指針基本相似,但前者具有類型安全,是安全的。 7.從派生類調(diào)用重寫基類成員。 base 8.使用 new 修飾符顯式隱藏繼承成員。 9.重寫方法需要父類方法中用virtual聲名,子類方法用override 關(guān)鍵字。 10.預(yù)處理器指令用于條件編譯。C# 中不使用頭文件。 C# 預(yù)處理器指令 11.異常處理:C#中引入了 finally 語句,這是C++沒有的。 12.C# 運算符:C# 支持其他運算符,如 is 和 typeof。它還引入了某些邏輯運算符的不同功能。 13. static 的使用,static方法只能由類名調(diào)用,改變static變量。 14.在構(gòu)造基類上替代 C++ 初始化列表的方法。 15.Main 方法和 C++ 及Java中的 main 函數(shù)的聲明方式不同,Main而不能用main 16.方法參數(shù):C# 支持 ref 和 out 參數(shù),這兩個參數(shù)取代指針通過引用傳遞參數(shù)。 17.在 C# 中只能在unsafe不安全模式下才使用指針。 18.在 C# 中以不同的方式執(zhí)行重載運算符。 19.字符串:C# 字符串不同于 C++ 字符串。 20.foreach:C#從VB中引入了foreach關(guān)鍵字使得以循環(huán)訪問數(shù)組和集合。 21.C# 中沒有全局方法和全局變量:方法和變量必須包含在類型聲明(如 class 或 struct)中。 22.C# 中沒有頭文件和 #include 指令:using 指令用于引用其他未完全限定類型名的命名空間中的類型。 23.C# 中的局部變量在初始化前不能使用。 24析構(gòu)函數(shù):在 C# 中,不能控制析構(gòu)函數(shù)的調(diào)用時間,原因是析構(gòu)函數(shù)由垃圾回收器自動調(diào)用。 析構(gòu)函數(shù) 25構(gòu)造函數(shù):與 C++ 類似,如果在 C# 中沒有提供類構(gòu)造函數(shù),則為您自動生成默認(rèn)構(gòu)造函數(shù)。該默認(rèn)構(gòu)造函數(shù)將所有字段初始化為它們的默認(rèn)值。 26.在 C# 中,方法參數(shù)不能有默認(rèn)值。如果要獲得同樣的效果,需使用方法重載。
C++、Java和C#的語法比較
染色體 1:純對象導(dǎo)向語言 C# 和 Java 都是純對象導(dǎo)向語言,C++ 非純對象導(dǎo)向語言。
染色體 2:強制型態(tài)檢查 C# 和 Java 都強制進行型態(tài)檢查,C++ 則較寬松。
染色體 3:宏 C# 和 Java 都不支持宏,C++ 支持宏。
染色體 4:Template C# 和 Java 都不支持 template,C++ 支持 template。
染色體 5:多重繼承 C# 和 Java 都不支持多重繼承,且都支持 interface,C++ 支持多重繼承。
染色體 6:指針 C# 和 Java 都不支持指針,C++ 支持指針。(不過,C# 允許在 unsafe code 內(nèi)使用指針)
染色體 7:內(nèi)存管理 C# 和 Java 都支持垃圾收集。C++ 不支持垃圾收集。
染色體 8:虛擬機器 C# 和 Java 都需要虛擬機器,C++ 不需要虛擬機器。Java 的執(zhí)行檔是中間碼,叫做 bytecode,透過 Java Runtime Environment(即 JRE)來執(zhí)行;C# 的執(zhí)行檔也是中間碼,叫做 managed code,透過 NGWS Runtime 來執(zhí)行。除了 Java,你也可以用其它程序語言(例如 Ada、Python)來作出 bytecode。除了 C#,你也可以用其它程序語言(例如 Visual Basic、C++)來作出 managed code。
染色體 9:Namespace C# 和 Java 都支持階層式的 namespace,但 C++ 只支持單層的 namespace。Java 的 namespace 稱為 package,C# 的 namespace 就稱為 namespace。Java 和 C# 都使用「.」當(dāng)作 namespace 的符號,而 C++ 使用「::」。
染色體 10:Platform-Independent Type C# 和 Java 都使用 Platform-Independent Type,C++ 的 type 會受到平臺的影響。
染色體 11:使用 Wrapper 包裝基本型態(tài) C# 和 Java 都支持將基本型態(tài)包裝成對象,在 Java 叫做 wrapper,在 C# 則是叫做 box。
染色體 12:boolean != integer C# 和 Java 都不允許把整數(shù)當(dāng)布爾值用,C++ 則允許。
染色體 13:access modifier C# 和 Java 都支持四種等級的 access modifier,包括 public、protected、private、default/internal;C++ 只支持 public、protected、private。Java 的 default(不寫)指的就是只針對同一個 package 開放,正好就是 C# 的 internal。
染色體 14:變量初始化 C# 和 Java 都規(guī)定不可使用未初始化的變量,C++ 則完全沒有這方面的限制。Java 和 C# 的編譯器都會主動幫未初始化的 field/data member 設(shè)定初始值,C++ 則不然。
染色體 15:轉(zhuǎn)型 C# 和 Java 都規(guī)定基本型態(tài)和 reference 型態(tài)不能互轉(zhuǎn)。
染色體 16:數(shù)組邊界檢查 C# 和 Java 都會主動進行數(shù)組邊界檢查,C++ 則不然
染色體 17:呼叫 Native Code C# 和 Java 都支持呼叫 native code。Java 透過 JNI(Java Native Interface);C# 透過 PInvoke(Platform Invocation Service)
染色體 18:Metadata C# 和 Java 的中間碼都包含有類別的 metadata,而 C 語言則是獨立在 header file。
染色體 19:中間碼指令 C# 的 IL 中間碼指令和 Java 的 bytecode 指令非常類似,有的甚至一樣。
染色體 20:例外處理 C# 和 Java 都支持 try/catch/finally,但 C++ 只支持 try/catch。
|