1.dynamic_cast:處理基類到派生類的轉換
rtti是執行階段型別識別(runtime type identification)的簡稱。這個特性讓程式能夠檢測物件的型別。rtti只適用於包含虛函式的類,即為多型時。
dynamic_cast運算子不能回答「指標指向的時哪類物件」這樣的問題,但是能回答「能否安全地將物件的位址賦給特定的型別指標」這樣的問題。
語法形式:
dynamic_cast
(expression)
//例如:
derived*pd=dynamic_cast>pb;
如果指標pb能夠安全的轉換成derived*,運算子將返回物件的位址,否者返回乙個空指標。
用途:使得能夠在類層次中 進行向上轉換(由於是is-a關係,這樣的轉換是安全的),而不允許其他轉換。(dynamic_cast也可以用於用於引用,但是不同點在於沒有與空指標對應的引用值,因此無法使用特殊的引用值來表示失敗,當請求不正確時將引發型別為bad_cast的異常,這種異常從exception類派生而來)
#include
using namespace std;
class
base
//虛函式
void
func_b()
};class
derived
:public base
void
func_d()
};void
main()
}
2.const_cast:用來移除變數的const或volatile限定符
語法形式:
const_cast
(expression)
注:type_name和expression的型別必須相同。(或者兩者可以隱式的進行轉換,不能是兩個無關的型別。)
用途:用來移除變數的const或volatile限定符。
有時候需要乙個這樣的值,它在大多數時候是常量,而有時候又是可以修改的。這時候可以宣告成const,並在需要修改的時候,使用const_cast。
使用通用轉換:
derived dd;
const derived*ptr1 =
ⅆderived* ptr2 =
(derived*
)ptr1;
//ok
base* ptr3 =
(base*
)ptr1;
//ok
使用const_cast轉換:
derived dd;
const derived*ptr1 =
ⅆderived*ptr2 = const_cast>
(ptr1)
;//ok
ptr2-
>
test()
;//derived
base*ptr3 = const_cast>
(ptr1)
;//ok
ptr3-
>
test()
;//derived
//base*ptr4 = const_cast(ptr1);//error,型別不一樣
const_cast並不是萬能的。它可以修改指向乙個指標的值,但是修改const值的結果是不確定的。
void
change
(const
int*p,
int n)
void
main()
在change()函式中,指標pc刪除了cosnt特徵,因此可以用來修改指向的值,但僅當指向的值不是const時才行。因此pc可用於修改pp1,但不能用於修改pp2。
volatile的作用是: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.
簡單地說就是防止編譯器對**進行優化.比如如下**:
a=1;
a=2;
a=3;
a=4;
對外部硬體而言,上述四條語句分別表示不同的操作,會產生四種不同的動作,但是編譯器卻會對上述四條語句進行優化,認為只有a=4(即忽略前三條語句,只產生一條機器**)。如果鍵入volatile,則編譯器會逐一的進行編譯並產生相應的機器**(產生四條**).
語法形式:
static_cast
(expression)
注:type_name和expression兩者可以隱式地進行轉換,不能是兩個無關的型別。
用途:如在同一類層次結構中的乙個指標型別到另乙個指標型別,整型到列舉型別,或者浮點型到整型等。
base base1;
derived derive;
derived*ppptr1 = static_cast>
(&base1)
;//ok
base*ppptr2 = static_cast>
(&derived1)
;//ok
int m=10;
double n=static_cast <
int> m;
//ok
int* q=static_cast <
int*
>
(malloc
(100))
;//ok
以上**的第二種轉換是從基類指標到派生類指標,在不進行顯示轉換的情況下,將無法進行,使用static_cast轉換是合法的。第一種轉換是合法的,因為向上轉換可以顯式地進行。
2.reinterpret_cast:處理互不相關型別之間的轉換
語法形式:
reinterpret_cast
(expression)
用途:用於天生危險的轉換,如從整型到指標,一種型別的指標到另一種型別的指標等
int a=10;
double
* b=reinterpret_cast<
double
*>
(a);
//b的轉換結果為0x0000000a
reinterpret_cast並不支援所有的型別轉換,比如可以將指標型別轉換成足以儲存指標表示的整形,但是不能將指標轉換成更小的整形或浮點型;不能將函式指標轉換成資料指標,反之亦然。 關鍵詞與關鍵詞之間的相關度計算
在資訊理論中常用互資訊 mi,mutual information 來衡量兩個詞的相關度mi x,y log2p x,y p x p y mi越大,表示兩個詞之間的結合越緊密。當x,y關聯大時,mi x,y 大於0 當x與y關係弱時,mi x,y 等於0 當mi x,y 小於0時,x與y稱為 互補關...
關鍵詞與關鍵詞之間的相關度計算
在資訊理論中常用互資訊 mi,mutual information 來衡量兩個詞的相關度mi x,y log2p x,y p x p y mi越大,表示兩個詞之間的結合越緊密。當x,y關聯大時,mi x,y 大於0 當x與y關係弱時,mi x,y 等於0 當mi x,y 小於0時,x與y稱為 互補關...
C 中4個與型別轉換相關的關鍵字
static cast const cast dynamic cast reinterpret cast 表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。在c 中,某些型別之間存在相關的依賴關係。若兩種型別相關,則可在需要某種型別的運算元位置上,使用該型別的相關型別物件或...