C CLI語言的屬性探索

2021-03-31 21:44:05 字數 2810 閱讀 5461

本文展示了歐洲計算機開發商協會正在發展的c++/cli(一種不同的c++語言,它方便開發人員在微軟的.***框架下更容易地開發程式)語言在c++語言上的擴充套件。寫這篇文章的目的並不是要建議標準c++包括這部分擴充套件,也不是對c++/cli的認可,而只是在**c++/cli語言在這一領域的發展方向。

一、基礎知識

c++/cli中的屬性是類似與各種資料成員(有各種操作限制)的可操作實體,但是這種操作往往被轉化為呼叫訪問函式(這主要是"getter"和"setter"函式)。例如:

struct demo1

void set(int v)

}private:

int value;

static unsigned long access_count;

};int main()

訪問函式的名字必須是get 或者是 set函式,兩者之中的任何乙個都可以被省略,但絕不能兩者全省略。省略乙個訪問函式導致只存在乙個讀屬性或只存在乙個寫屬性。屬性的位址是無法獲取的,然而,訪問函式作 為成員函式理所當然地可以被用來產生指向成員的指標常量(例如:&demo1::val::set)。

屬性可以使用關鍵字"virtual"進行宣告,這意味者訪問操作函式是虛函式,純虛屬性函式也是可能存在的,例如:

二、動機

在標準c++的上下文中,屬性約定成俗地使用"get和set函式"文法,這種文法將暴露的資料和諧地轉換為封閉地狀態資訊。在更精細的實時框架上下文中(具體的說是微軟的.***框架),屬性是可以通過對映實時發覺和修改的元素。例如,現代的gui庫將它的元件引數宣告為屬性,視覺化的介面構築工具裝載這些庫,使用裝載各種元件的屬性列表並將結果展現到使用者面前,當使用者修改了乙個屬性,訪問操作函式將被呼叫,例如這將觸發各種gui更新事件。

三、屬性變數

除了上述**中宣告的簡單的分層屬性,c++/cli還引進了其他幾種型別屬性變數。

(一)靜態分層屬性

靜態分層屬性使用關鍵字"static"來宣告,它們的訪問操作函式是靜態的,靜態屬性的訪問操作與靜態資料成員的訪問操作非常一致。(例如:使用c::p語法來獲取c類的靜態屬性p)

(二)不明顯的分層屬性

乙個屬性的定義(即括號內的訪問操作函式宣告)可以使用分號";"來代替,在這種情況下,get和set訪問函式綜合成乙個簡單的可以訪問操作的屬性值。例如,c++/cli定義的乙個類如下:

struct trivialprop ;

上述**從本質上與下述**相同:

struct trivialprop

void set(int v)

}private:

int __val;

};(三)指定索引屬性

使用運算元組成員的老語法,指定索引可以操作乙個數值集合,下面的例子顯示了一維索引屬性的操作。

struct demo2

void set(int v, std::string s)

}// ...

};int main()

注意,指定索引的屬性不能是靜態變數。

多維的索引屬性也是可以的,它引入的操作語法與c/c++中陣列元素操作方法不太一樣,例如:

struct demo3

void set(double v, std::string s, int n)

}// ...

};int main()

後面的這乙個例子說明了出現在括號內的操作索引屬性的逗號符號是表示式操作符號,而不是乙個逗號操作符。(下面將討論這種規則帶來的後果)。

(四)預設的索引屬性

除了物件被編入偽域外,預設的索引屬性與指定的索引屬性非常相象,物件本身可以索引(彷彿它自身有乙個操作成員函式一樣),以前的**只要稍微改動一下就可以說明這種變化。

struct demo4

void set(double v, std::string s, int n)

}// ...

}; int main()

四、一些技術性問題

歐洲計算機製造商協會(c++/cli標準的制訂者)已經研究並解決了引入屬性所帶來的若干問題,下面這些內容尤其值得關注。

(一)多維索引屬性的操作

p->x[2, 3]表示式擁有不同的意思,這要視成員x是否是屬性(這種情況下逗號分隔兩個索引屬性)或其它成員變數(這種情況下逗號是個操作符號,表示式的意思等同於p->x[3])而定。為了在乙個屬性索引中獲取逗號操作符的效果,開發人員可以使用圓括號(即p->x[(2, 3)])。

(注意,在依賴模版的表示式中,這將產生模糊性,並且直到例項化時問題才能得到解決)

(二)屬性名與型別名衝突

微軟.***框架帶有很多包含屬性

的類(這些類最初並不是使用c++/cli來開發的),這些包含的屬性名與屬性型別的名字相同,例如:

typedef int color;

struct conflict

// ...};}

(三)過載的索引屬性

索引屬性可以被過載,即,幾個指定索引屬性可以使用同乙個名字共存於同乙個類中,假定它們可以根據屬性的型別來區分開來。相似地,預設的索引屬性可以使用其他屬性或操作符來過載。解決兩意性與過載行為的規則已經被建立起來,來處理上述情況。

(四)保留的成員名字

c++/cli屬性通過綜合特定的成員來實現,這些成員的名義由微軟的.***框架來規定,並且必須得到保留。

如果乙個類包含分層的屬性或指定索引屬性x,成員名 get_x 和set_x在類中得到保留(即使屬性僅僅包含乙個操作函式也是這樣)。相似地,如果乙個類包含有乙個預設的索引屬性,類中的成員函式get_item 和set_item也將得到保留。

C CLI複習總結 1 語言

只說重點難點,以及在iso c 上的變化 1.運算子過載 要加static了 2.建構函式間的呼叫 呼叫同class 中的其他建構函式,用 gcnew this c 的形式 呼叫父類的建構函式,如c2 c1 1 呼叫了c1 int a 這個建構函式 3.取代 作為取引用,當然還有 取控制代碼 4.覆...

jquery 屬性框架探索

屬性操作 新增var element p eq 1 element.attr name 神仙 屬性操作 刪除element p eq 1 element.removeattr name 屬性操作 addclasselement p eq 1 element.addclass add hide 屬性操...

C語言scanf的探索

第一次寫帶的,貼上上去的,之後就沒了。我也是醉了。int i,sum 0 char ch printf 輸入多個整數以空格隔開 while scanf d i 0 printf 求和的結果為 d n sum return 0 若是有錯誤的地方請指點。1.下面是我探索的 主要是看看scanf的返回值 ...