const int a = 1;
int & ra = a; //錯
int * p = &a; //錯
const int & cra = a; //ok
const int * cpa = &a; //ok
int b = 2; //ok
int & rb = b; //ok
int * pb = &b; //ok
const int & rb = b; //ok
const int * pb = b; //ok
也就是說,從type型別轉換到const_type型別是允許的,意思是,在作為引數傳遞到函式後,具有對引數使用的寫約束作用。
但對原來是const type型別的,拒絕轉換到type。原因也是清楚的,因為常量或者產物件的位址託付給變數或者物件的指標和引用,簡直是拿藝術品給小孩子玩——有很大損壞危險。所以凡是以這樣的形式進行引數傳遞,休想讓編譯通過。
但是,問題是有些函式和類庫產品,設計得太完美了,以至於其返回的表示式由於唯讀而通不過型別檢查,以致無法參加進一步運算。例如:
const char * max(const char * s1, const char * s2)
int fn()
其中的max函式由於返回const char * 而無法作為初值賦給字元指標p,這時使用寫開禁操作是合法的;
char * p = const_cast(max("hello", "world"));
也就是說,使用乙個去常量性的操作const_cast。
然而,要在乙個唯讀實體上解除寫操作禁令,這也無異是出格的行為。而且轉換操作都是過陋無比(關鍵字又長又難記,如dynamic_cast等的,它告誡我們在用之前要三思而行)。
《C primer 讀書筆記》 常量與變數
c 預定義數值資料型別 用來表示整數 浮點數和單個字元 字元型 char 通常用來表示單個字元和小整數,它可以用乙個機器位元組來表示。整型 int 短整型 short 長整型 long,它們分別代表不同長度的整數值。典型情況下,short 以半個字表示,int 以乙個機器字表,而 long 為乙個或...
CLR via C 讀書筆記 常量和字段
常量 constant 字段 field 欄位是一種資料成員,其中容納了乙個值型別的例項或者對乙個引用型別的引用 字段修飾符 clr術語 c 術語 說明 static static 這種欄位是型別狀態的一部分,而不是物件狀態的一部分 instance 預設 這種欄位與型別的乙個例項關聯,而不是與型別...
C 讀書筆記
1.內建函式 inline必須在呼叫前進行完整定義,語 define相同,但是消除了不安全性 例 inline float circle float r 2,函式原型 語法形式 返回型別 函式名 參數列 1 函式原型的參數列中不包含引數的名字,而只包含型別 2 函式定義由函式說明部分和函式體構成 3...