msdnarchive
28 dec 2004 2:32 pm 感謝
stanley b. lippman
為我們提供了一篇非常優秀的關於
c++/cli
的介紹:
translation guide: moving your programs from managed extensions for c++ to c++/cli
儘管我的英文不是很好,有時候沒有辦法理解
lippman
先生的原意,但我還是非常欣賞這篇文章,因為寫得非常深入與詳細。
我很想做些筆記,加深理解,所以就辦抄半簡地寫了這些中文帖子。我覺得自己已經開始喜歡上
c++/cli
了,希望大家也一樣喜歡他。
managed c++
中令人印象深刻的就是
__gc
這樣的形式
—在開始有兩個下滑線。其實,原先這樣設計的目的,也是為了
managed c++
和標準c++
盡量相同
--畢竟標準
c++中可沒有什麼「託管」的概念。但從幾年來的結果來看,似乎效果非常不理想。大家已經忘了
visual studio.net
中還有c++
。所以,在
c++/cli
中,其實是對標準
c++作了乙個擴充套件。儘管多了一些從來沒有看到過的操作符,但沒有了
__gc
c++。其實,這也正是
c++/cli
設計的目的之一吧。
我們來看看
c++/cli
中是怎樣來定義託管型別的:
如果要建立乙個對於在託管堆中物件的應用
(reference class)
ref class
ref struct
其中,struct
意味著預設情況下它的成員的訪問級別為
public
,而class
意味著預設情況下它的成員的訪問級別為
private。
如果要建立值型別
(value class)
value class
value struct
inte***ce class。
所以,我們就可以看到這樣的定義:
public ref class block ;
public value class vector ;
public inte***ce class imyfile ;
如果我們需要指定乙個抽象
(abstract)
的類,那麼語法為:
public ref class shape abstract {};
public ref class shape2d abstract : public shape{};
也可以指定為
sealed
型別,以及
sealed
和abstract
共用:
public ref class string sealed {};
public ref class state abstract sealed{};
建立了託管型別的物件,就要有指向他們的指標。這裡是剛開始學習
c++/cli
的時候,讓人有些不習慣的地方,因為定義了乙個全新的操作符^。
我們可以先來看看原來的
_gc *
和新的^
的一些具體例子,然後再來感覺那個更好一些:
public __gc class form1 : public system::windows::forms::form
};
public ref class form1: public system::windows::forms::form
};
是不是^更加自然呢?
可能會有人問:為什麼不使用
c++中原來的指標符號
*呢?呵呵,因為這是託管**啊!如果物件定義在非託管堆上,當然使用
*了,但如果定義在託管堆上,就不能再簡單地使用
*了。我們可以看看下面的例子:
button^ button1 = gcnew button; // ok: managed heap
int * pi1 = new int; // ok: native heap
interior_ptrpi2 = gcnew int32; // ok: managed heap
這裡說明兩點:
1. 在c++/cli
中,同時使用
gcnew
,來說明物件是建立在託管堆上的。
2. 關於interior_ptr
,留待後面解釋。
同時,在
c++/cli
中,數字
0不再代表空位址,而僅僅代表數字
0nullptr
。所以,下面的**就是把0給
boxing
了,再傳給指標
obj:
object^ obj=0;
而只有下面的語句,才真正把乙個空指標給指標
obj:
object^ obj=nullptr;
順便,談談
boxing
。boxing
就是說,當你想把乙個值
(value)
當作乙個物件
(object)
的時候,發生的事情。例如上面的語句中,就是把乙個值
0變成了乙個
object
物件。具體在後台發生的事情為:
1. 首先,這個值會被壓入堆疊。
2. clr
接著會把這個值彈出堆疊,然後分配一塊空間,來儲存這個值以及物件頭資訊。
3. 接著,乙個新建立的物件的引用,會被壓入堆疊中。
4. 最後,把這個引用物件彈出堆疊,儲存在本地變數中。
可見,代價非常大。所以,一般情況下,不要隨便使用
boxing(
當然還有
unboxing)
,因為對效能影響太大。
cli陣列的定義
c++/cli
中,陣列定於為:
void printvalues( array^ myarr );
void printvalues( array^ myarr );
同時,還可以使用
gcnew
定義的時候,直接賦值:
array^ myarray =
gcnew array(4)
而且,還可以定義返回型別為
cli陣列的函式:
array^ f();
array^ getarray();
c 學習筆記(1)復合型別
復合型別是指基於其他型別定義的型別。接下來介紹c 復合型別中的兩種 應用和指標。通過將宣告符寫成 d的形式來定義應用資料型別,其中d是宣告的變數名。int a 0 宣告基本資料型別 int refa a 宣告引用資料型別,refa指向a,是a的另外乙個名字 int refb 錯誤,引用必須被初始化為...
Numpy學習筆記1 基本型別
numpy的主要物件是同種元素的多維陣列。這是乙個所有的元素都是一種型別 通過乙個正整數元組索引的元素 通常是元素是數字 在numpy中維度 dimensions 叫做軸 axes 軸的個數叫做秩 rank numpy中提供的核心物件 array numpy的陣列類被稱作 ndarray 通常被稱作...
c primer 學習筆記1 基本內建型別
2.1 基本內建型別 2.1.1 算術型別 在c 語言中,算術型別分為兩類,分別為整形和浮點型。整型包括整型,長整型,短整型。浮點型包括單精度浮點型和雙精度浮點型。另外還有字元型和布林型別等。在每種算術型別中都定義了固定型別的尺寸,比如 int整型為 16位,短整型 short 也是16 位,字元型...