C CLI學習筆記1 新的託管型別

2021-06-20 03:06:10 字數 3430 閱讀 2589

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 位,字元型...