C 中4個與型別轉換相關的關鍵詞分析

2021-09-03 02:24:38 字數 3259 閱讀 2174

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 中,某些型別之間存在相關的依賴關係。若兩種型別相關,則可在需要某種型別的運算元位置上,使用該型別的相關型別物件或...