簡(jiǎn)介
Visual C++開(kāi)發(fā)小組花了大量的時(shí)間用于聽(tīng)取用戶的意見(jiàn),在對(duì) .NET和C++經(jīng)過(guò)仔細(xì)考量之后,決定在Visual C++ 2005中重新設(shè)計(jì)對(duì)通用語(yǔ)言運(yùn)行時(shí)庫(kù)(CLR)的支持,此項(xiàng)重新的設(shè)計(jì)被稱為"C++/CLI",它將為使用及編寫(xiě)CLR類型提供更自然的語(yǔ)法。在本文中,主要探討了新的語(yǔ)法,并將之與C#和托管C++這兩個(gè)CLR平臺(tái)上極其相近的語(yǔ)言進(jìn)行比較,在文中也會(huì)適當(dāng)?shù)匾詧D表給出其與本地C++的相似之處。
通用語(yǔ)言運(yùn)行時(shí)庫(kù)(CLR)包括了一組規(guī)范,其是Microsoft .NET的基礎(chǔ),也是CLI的Microsoft版本實(shí)現(xiàn)。C++/CLI語(yǔ)言設(shè)計(jì)的目標(biāo)是為了對(duì)CLI提供更自然的C++支持,而Visual C++ 2005的編譯器則在CLR上實(shí)現(xiàn)了C++/CLI。
當(dāng)在仔細(xì)研究了Visual C++ 2005編譯器和C++/CLI語(yǔ)言設(shè)計(jì)之后,就會(huì)發(fā)現(xiàn)它們傳達(dá)了兩條重要的訊息;首先,Visual C++把自己定位于在CLR平臺(tái)上的最低級(jí)編程語(yǔ)言,(看起來(lái)似乎沒(méi)有必要使用其他語(yǔ)言了--包括MSIL);其次,.NET編程應(yīng)與本地C++編程一樣自然。
本文針對(duì)C++程序員,但并不想說(shuō)服你放棄C#或者Visual Basic .NET。如果你非常喜歡C++,并想繼續(xù)使用傳統(tǒng)C++提供的全部功能,而又想要C#般的編程效率,那本文正適合你。另外,本文并不是CLR或 .NET Framework的簡(jiǎn)介,而把重點(diǎn)放在Visual C++ 2005是怎樣使你可以編寫(xiě) .NET Framework上更優(yōu)雅和高效的代碼。
對(duì)象構(gòu)造
CLR定義了兩種類型:值類型和引用類型。值類型被設(shè)計(jì)用于可進(jìn)行高效地分配和訪問(wèn),它們與C++的內(nèi)置類型大體相似,你也能創(chuàng)建屬于你自己的類型,這就是Bjarne Stroustrup所稱的具體類型;另一方面,引用類型被設(shè)計(jì)用于提供面向?qū)ο缶幊趟璧奶匦?,可用于?chuàng)建有著層次結(jié)構(gòu)的類:例如派生類和虛擬函數(shù)。另外在CLR中,引用類型自始至終都提供了額外的運(yùn)行時(shí)特性,如自動(dòng)內(nèi)存管理--通常稱為垃圾回收。同時(shí),對(duì)引用類型和值類型,CLR也提供了精確的運(yùn)行時(shí)類信息,這種特性通常被稱為反射。
值類型分配在堆棧上;而引用類型通常分配在托管堆中--這是由CLR垃圾回收機(jī)制所管理的堆。如果你在C++中編寫(xiě)匯編代碼,如平時(shí)那樣,可在CRT堆中分配本地C++類型,在將來(lái),Visual C++開(kāi)發(fā)小組甚至允許你在托管堆中分配本地C++類型,畢竟,垃圾回收對(duì)本地類型來(lái)說(shuō),也是一個(gè)極具吸引力的主題。
本地C++允許選擇在何處創(chuàng)建一個(gè)特定的對(duì)象,任何類型都可分配在堆?;駽RT堆中。
// 分配在堆棧上
std::wstring stackObject;
// 分配在CRT堆中
std::wstring* heapObject = new std::wstring;
如上所示,在何處分配對(duì)象是獨(dú)立于類型的,主動(dòng)權(quán)完全掌握在程序員的手中。另外,堆棧與堆的分配語(yǔ)法也是易于區(qū)別的。
Visual C++開(kāi)發(fā)小組花了大量的時(shí)間用于聽(tīng)取用戶的意見(jiàn),在對(duì) .NET和C++經(jīng)過(guò)仔細(xì)考量之后,決定在Visual C++ 2005中重新設(shè)計(jì)對(duì)通用語(yǔ)言運(yùn)行時(shí)庫(kù)(CLR)的支持,此項(xiàng)重新的設(shè)計(jì)被稱為"C++/CLI",它將為使用及編寫(xiě)CLR類型提供更自然的語(yǔ)法。在本文中,主要探討了新的語(yǔ)法,并將之與C#和托管C++這兩個(gè)CLR平臺(tái)上極其相近的語(yǔ)言進(jìn)行比較,在文中也會(huì)適當(dāng)?shù)匾詧D表給出其與本地C++的相似之處。
通用語(yǔ)言運(yùn)行時(shí)庫(kù)(CLR)包括了一組規(guī)范,其是Microsoft .NET的基礎(chǔ),也是CLI的Microsoft版本實(shí)現(xiàn)。C++/CLI語(yǔ)言設(shè)計(jì)的目標(biāo)是為了對(duì)CLI提供更自然的C++支持,而Visual C++ 2005的編譯器則在CLR上實(shí)現(xiàn)了C++/CLI。
當(dāng)在仔細(xì)研究了Visual C++ 2005編譯器和C++/CLI語(yǔ)言設(shè)計(jì)之后,就會(huì)發(fā)現(xiàn)它們傳達(dá)了兩條重要的訊息;首先,Visual C++把自己定位于在CLR平臺(tái)上的最低級(jí)編程語(yǔ)言,(看起來(lái)似乎沒(méi)有必要使用其他語(yǔ)言了--包括MSIL);其次,.NET編程應(yīng)與本地C++編程一樣自然。
本文針對(duì)C++程序員,但并不想說(shuō)服你放棄C#或者Visual Basic .NET。如果你非常喜歡C++,并想繼續(xù)使用傳統(tǒng)C++提供的全部功能,而又想要C#般的編程效率,那本文正適合你。另外,本文并不是CLR或 .NET Framework的簡(jiǎn)介,而把重點(diǎn)放在Visual C++ 2005是怎樣使你可以編寫(xiě) .NET Framework上更優(yōu)雅和高效的代碼。
對(duì)象構(gòu)造
CLR定義了兩種類型:值類型和引用類型。值類型被設(shè)計(jì)用于可進(jìn)行高效地分配和訪問(wèn),它們與C++的內(nèi)置類型大體相似,你也能創(chuàng)建屬于你自己的類型,這就是Bjarne Stroustrup所稱的具體類型;另一方面,引用類型被設(shè)計(jì)用于提供面向?qū)ο缶幊趟璧奶匦?,可用于?chuàng)建有著層次結(jié)構(gòu)的類:例如派生類和虛擬函數(shù)。另外在CLR中,引用類型自始至終都提供了額外的運(yùn)行時(shí)特性,如自動(dòng)內(nèi)存管理--通常稱為垃圾回收。同時(shí),對(duì)引用類型和值類型,CLR也提供了精確的運(yùn)行時(shí)類信息,這種特性通常被稱為反射。
值類型分配在堆棧上;而引用類型通常分配在托管堆中--這是由CLR垃圾回收機(jī)制所管理的堆。如果你在C++中編寫(xiě)匯編代碼,如平時(shí)那樣,可在CRT堆中分配本地C++類型,在將來(lái),Visual C++開(kāi)發(fā)小組甚至允許你在托管堆中分配本地C++類型,畢竟,垃圾回收對(duì)本地類型來(lái)說(shuō),也是一個(gè)極具吸引力的主題。
本地C++允許選擇在何處創(chuàng)建一個(gè)特定的對(duì)象,任何類型都可分配在堆?;駽RT堆中。
// 分配在堆棧上
std::wstring stackObject;
// 分配在CRT堆中
std::wstring* heapObject = new std::wstring;
如上所示,在何處分配對(duì)象是獨(dú)立于類型的,主動(dòng)權(quán)完全掌握在程序員的手中。另外,堆棧與堆的分配語(yǔ)法也是易于區(qū)別的。

