C++編程語言從發展至今已經歷經20年之久,我們在下面首先介紹了這一編程語言的基本概念以及構成。在大家了解完這些內容後,我們會進入近體那的主題,那就是為大家介紹什麼事C++托管?
C++這個詞在中國大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是一種使用非常廣泛的計算機編程語言。C++是一種靜態數據類型檢查的,支持多重編程范式的通用程序設計語言。它支持過程化程序設計、數據抽象、面向對象程序設計、制作圖標等等泛型程序設計等多種程序設計風格。
根據Effective C++第三版第一條款的描述,現在C++由以下四個“子語言”組成:
1、C子語言。C++支持C語言的幾乎全部功能,在語法上與C語言僅有極微妙的差別(如括號表達式的左右值性,具體請參考C++標准文獻)。
2、面向對象的C++。C++首先作為一門面向對象的語言而聞名,這個特點在這裡不再詳述。
3、泛型編程語言。C++強大但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運行期效率。
4、STLC++標准模板庫)。隨著STL的不斷發展,它已經逐漸成為C++程序設計中不可或缺的部分,其效率可能比一般的naive代碼低些,但是其安全性與規范性使它大受歡迎。
在回答這個問題,首先要搞清楚什麼是“托管”(Managed)。托管是.NET的一個專門概念,它是融於通用語言運行時(CLR)中的一種新的編程理念,因此我們完全可以把“托管”視為“.NET”。那麼什麼是“通用語言運行時”?通用語言運行時是.NET 框架應用程序的執行引摯。它提供了許多服務,其中包括:代碼管理(裝入和執行)、類型安全性驗證、元數據(高級類型信息)訪問、為管理對象管理內存、管理代碼,COM對象和預生成的DLLs(非管理代碼和數據)的交互操作性、對開發人員服務的支持等等。
也就是說,使用C++托管意味著,我們的代碼可以被CLR所管理,並能開發出具有最新特性如垃圾自動收集、程序間相互訪問等的.NET框架應用程序。
由托管概念所引發的C++應用程序包括托管代碼、托管數據和托管類三個組成部分。
(1) 托管代碼:.Net環境提供了許多核心的運行(RUNTIME)服務,比如異常處理和安全策略。為了能使用這些服務,必須要給運行環境提供一些信息代碼(元數據),這種代碼就是托管代碼。所有的C#、VB.NET、JScript.NET默認時都是托管的,但Visual C++默認時不是托管的,必須在編譯器中使用命令行選項(/CLR)才能產生托管代碼。
(2) 托管數據:與托管代碼密切相關的是托管數據。托管數據是由公共語言運行的垃圾回收器進行分配和釋放的數據。默認情況下,C#、Visual Basic 和 JScript.NET 數據是托管數據。不過,通過使用特殊的關鍵字,C# 數據可以被標記為非托管數據。Visual C++數據在默認情況下是非托管數據,即使在使用 /CLR 開關時也不是托管的。
(3) 托管類:盡管Visual C++數據在默認情況下是非托管數據,但是在使用C++托管擴展時,可以使用“__gc”關鍵字將類標記為托管類。就像該名稱所顯示的那樣,它表示類實例的內存由垃圾回收器管理。另外,一個托管類也完全可以成為 .NET 框架的成員,由此可以帶來的好處是,它可以與其他語言編寫的類正確地進行相互操作,如托管的C++類可以從Visual Basic類繼承等。但同時也有一些限制,如托管類只能從一個基類繼承等。需要說明的是,在C++托管應用程序中既可使用托管類也可以使用非托管類。這裡的非托管類不是指標准C++類,而是使用托管C++語言中的__nogc關鍵字的類。