情有獨鍾C++:Visual C++ .NET編譯器的新特性(轉)
情有獨鍾C++:Visual C++ .NET編譯器的新特性(轉)[@more@]摘要老資格的 C++ 程式設計師們都想知道:他們賴以生存的 C++ 語言在 C# 和微軟的 .NET 的衝擊下何去何從?本文將對 .NET 世界中的 C++ 進行簡要描述。在 .NET 中,C++ 分裂為兩大陣營:受管程式碼 (Managed Code) 和非受管程式碼 (Unmanaged Code)。非受管程式碼不使用通用語言執行時環境 (CLR) ,而受管程式碼則用到了 Managed Extensions for C++ 。本文將對兩者分別討論。C++ 社群給人的感覺就象一個大家庭:初生的小寶寶總是倍受呵護,而年長的孩子卻是無人關心。如此被忽視,又怎能教人不心痛?事實上,技術領域的情況比這更糟:技術的革新實在太快,人們疲於奔命卻無可奈何,否則連飯碗都保不住了。如今,微軟公司的新產品 .NET 框架被炒得沸沸揚揚——的確很不錯;眾人還對所謂的 C# 語言連聲喝彩。作為 C++ 的程式設計師,心裡卻很不是滋味:我是不是也要改行學 C# 了?因為人們只有在比較 C# 與 C++ 才會偶爾提及 C++ 了。C++ 程式設計師要過時了嗎?絕不!本文先簡要描述 Visual Studio .NET 為 C++ 引入的新特性,然後再介紹微軟公司對新版 C++ 的計劃。首先從兩個方面來談談 Visual Studio .NET 裡的 C++ :標準的 C++ 和 Managed Extensions for C++ 。對標準 C++ 的擴充主要是為了保持相容性;也就是說,為了保持國際標準化組織 (ISO) 所規定的 C++ 語言特性。而 Managed Extensions for C++ 則是為了把 C++ 納入 .NET 框架之中。Visual Studio .NET 下的標準 C++為了保持對 ISO 標準的相容性,標準 C++ 作了如下改進:(1) 虛擬函式的返回值現在支援共變 (covariant) 型別了,這是類層次體系上的一個重大改進;(2) 支援對靜態整數型別常量( static const integer )成員的顯式初始化;(3) 主函式的返回值預設為 0 。現在我來逐一介紹它們。第一項是增加 covariant 返回型別,它已經由標準委員會核准。也就是說,如果基類的某個虛擬函式返回值是該類本身的例項,那麼它在派生類中被過載後也能返回此派生類本身的例項。在類層次體系中,這是一種很重要的設計模式;在 Visual Studio .NET 中,它也大受歡迎。例如,對於抽象基類 Query :class Query {public:virtual Query *clone() = 0;// ...};如果想要其派生類例項 NotQuery 的 clone 函式返回一個 NotQuery 物件,即:class NotQuery {public:virtual Query *clone(){ return new NotQuery( this ); }// ...public:Query *operand;};當沒有 covariant 返回型別支援時,clone 的返回型別必然是 Query* :// without covariant return type supportvirtual Query* clone(){ return new NotQuery( this ); }此時如果把 clone 的返回值分配給 Query* 型別的指標,那麼一切工作正常:NotQuery::NotQuery( const NotQuery &rhs ){ operand = rhs.operand->clone(); }但是如果要分配給 NotQuery* 型別的指標呢?NotQuery nq( new NameQuery( "Shakespeare" );這樣就不行了:// oops: illegal assignment ...NotQuery *pnq0 = nq->clone();只能這樣:// ok: required explicit cast ...NotQuery *pnq1 = static_cast(nq->clone());現在有了 covariant 返回型別,你就可以顯式返回 NotQuery* 型別了:// with covariant return type supportvirtual NotQuery* clone(){ return new NotQuery( this ); }於是,clone 的返回型別變得更直觀,不再需要強制型別轉換了:這樣是對的:// ok: implicit conversion ... ;Query *pq = nq->clone();這樣也沒問題:// ok: no conversion necessary ... ;NotQuery *pnq = nq->clone();第二項是靜態整數常量型別成員的顯式初始化,它對 C++ 的影響就沒有 covariant 返回型別那麼大了。它僅僅給使用常量表示式(如:定長陣列)的類的設計帶來了方便。例如:class Buffer {static const int ms_buf_size = 1024;char m_buffer[ ms_buf_size ];};static const int 型別成員被初始化以後,就可以為本類的其它成員所用,例如設定 m_buffer 的大小,而不用象以前那樣,使用列舉變數了。第三項是主函式的預設返回值為 0 。主函式的返回值代表程式的退出狀態。習慣上,返回 0 代表程式正常結束。在標準 C++ 裡,如果沒有顯性指定返回值,編譯器就會自動地在主函式末尾插入一行:return 0;進入 Visual Studio .NET 時代,Visual C++ 終於支援它了!Visual Studio .NET 下的受管 C++ Visual Studio .NET 的 Managed Extensions for C++ 提供了三種基本的應用策略:(1) 為原有的 API 提供 .NET“包裝”,把 C++ 類統統移植到 .NET 平臺中。(2) 混用 C++ 類與微軟 .NET 的三種框架類:核心語言支援,例如:收集類和系統輸入/輸出;基礎程式類, 例如:執行緒支援,網路套接字和正規表示式;應用領域支援,例如:XML、ASP.NET、Web 服務、Windows 窗體、ADO.NET,等等。(3) 象 C# 和 Visual Basic 那樣直接操作 .NET 環境。然而,目前尚無相應的快速開發工具(RAD)用於 Windows 窗體和 Web 表單的視覺化程式設計。先來看看第一種方案:用 .NET 包裝原有的程式碼。在我的 C++ Primer 一書 (Addison-Wesley,1998) 中,我示範了一個相當大的文字查詢系統,其中大量使用了 STL 容器類用於解析文字檔案和建立資料結構。它的引用檔案內容如下:#include #include #include #include #include
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-946142/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RJMetrics:Pinterest上使用者對食物情有獨鍾REST
- C++的新特性C++
- C++編譯器優化C++編譯優化
- C++新特性C++
- Visual C++ 6.0 編 程 經 驗 (轉)C++
- 將編譯過的C++庫迅速部署在Visual Studio新專案中編譯C++
- C++ 2.0新特性C++
- 為什麼C++編譯器不能支援對模板的分離式編譯 (轉)C++編譯
- 呼叫Visual Studio的cl.exe編譯C/C++程式編譯C++
- 在Visual C++中使用內聯彙編 (轉)C++
- 在Visual C++中使用內聯彙編(轉)C++
- 安裝c, c++編譯器 on AIXC++編譯AI
- C/C++—— C++編譯器是如何實現多型C++編譯多型
- 用Visual Studio將Objective-C編譯為C++Object編譯C++
- 怎樣使用 Visual C++ 編譯出只有 1536 位元組的視窗程式 (轉)C++編譯
- Visual C++ 2015 引入更新的 C++ 特性到 Windows APIC++WindowsAPI
- C++各版本引入的新特性C++
- 用Visual C++編寫電子郵件程式 (轉)C++
- 編譯原理——C++版桌面計算器編譯原理C++
- windows 下c++編譯WindowsC++編譯
- C++ 編譯過程C++編譯
- C++ 11 新特性之ClassC++
- C++ 14 新特性總結C++
- C++編譯器怎麼實現異常處理1 (轉)C++編譯
- C++編譯器怎麼實現異常處理3 (轉)C++編譯
- C++編譯器怎麼實現異常處理2 (轉)C++編譯
- protobuf 的交叉編譯使用(C++)編譯C++
- 編譯C++ 程式的過程編譯C++
- Visual C++中的圖形特技 (轉)C++
- 一文搞懂C/C++常用編譯器C++編譯
- Answers to your MFC/ATL questions from the Visual C++ .NET Product Manager (轉)C++
- C++ 11 新特性之容器相關特性C++
- 過去十年,遊戲界大佬們對哪款遊戲最情有獨鍾?【上篇】遊戲
- 過去十年,遊戲界大佬們對哪款遊戲最情有獨鍾?【下篇】遊戲
- 牛x的大甲方資訊系統為啥對自動化巡檢情有獨鍾
- C++物件模型:編譯分析C++物件模型編譯
- C++ 11 新特性 nullptr 學習C++Null
- 理解 Visual C++ Extensions for ADO(轉)C++