一些關鍵字或模板

2021-09-29 02:51:58 字數 2128 閱讀 8290

一、dynamic_cast

使用dynamic_cast乙個繼承層次內進行轉化的指標/引用。dynamic_cast依賴於rtti資訊,在轉換時,dynamic_cast會檢查轉換的source物件是否真的可以轉換成target型別,這種檢查不是語法上的,而是真實情況的檢查。被轉換的型別必須是多型(即有虛函式)。使用這個會影響執行效率,一般情況下也是不使用的。能在編譯時解決掉的問題沒必要留到執行時、能用多型搞定的事情也沒必要使用 dynamic_cast 和 typeid 等。

classb

;

classd:publicb

;

voidfunc(b* pb)

在上面的**段中,如果 pb 指向乙個 d 型別的物件,pd1 和 pd2 是一樣的,並且對這兩個指標執行 d 型別的任何操作都是安全的;但是,如果 pb 指向的是乙個 b 型別的物件,那麼 pd1 將是乙個指向該物件的指標,對它進行 d 型別的操作將是不安全的(如訪問 m_szname),而 pd2 將是乙個空指標。

另外要注意:b 要有虛函式,否則會編譯出錯;static_cast則沒有這個限制。

二、static_cast

使用static_cast普通型別轉換。

①用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。

進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。

②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。這種不加static_cast進行轉換,一般編譯器會提示告警,加static_cast可以消除告警提示。

③把空指標轉換成目標型別的空指標。

④把任何型別的表示式轉換成void型別。

三、reinterpret_cast

使用reinterpret_cast的位模式的低級別重讀。使用時要格外小心。reinterpret_cast與編譯器平台相關,因此不具有移植性,使用範圍也有限。

四、const_cast

使用const_cast鑄造遠const/volatile。除非你使用const不正確的api,否則請避免這種情況。一般就是別人的庫api裡,但我們要傳入的引數是const型別,而庫的api要的引數沒要求const,這裡編譯器就會報錯,並且我們知道庫api那個函式不會修改我們代入的引數,這裡就可以用const_cast來處理,避免編譯器編譯不過。

五、typeid 列印物件名稱

basea* pa;

basea  basea;

pa = &basea;

cout << 「basea」 << "    " << typeid(basea).name() << endl;

cout << 「pa」 << "    " << typeid(pa).name() << endl;

六、typeof

typeof()關鍵字常見用法一共有以下幾種。

不用知道函式返回什麼型別,可以使用typeof()定義乙個用於接收該函式返回值的變數

typeof(fun()) r1;//定義乙個變數r1,用於接收函式fun()返回的值,假如我們不知道fun()返回型別也可以這樣用

2.在巨集定義中動態獲取相關結構體成員的型別

#define swap(x,y) \

{ typeof(x)  temp; \   -->根據型別定義乙個臨時變數temp 

temp = x;\

x = y;\

y = temp;\

3. 做型別轉換時的物件型別宣告

const protocol_format::spackethead * phead = (typeof(phead)) rpackrecv.getheaddata();

參考:

關鍵字 一些關鍵字用法總結

register 用register宣告的變數稱暫存器變數,在可能的情況下會直接存放在機器的暫存器中 但對32位編譯器不起作用,當global optimizations 全域性優化 開的時候,它會做出選擇是否放在自己的暫存器中 不過其它與register關鍵字有關的其它符號都對32位編譯器有效。c...

MySql一些關鍵字

使用distinct關鍵字,只返回不同的值 distinct關鍵字,它必須直接放在列名的前面 eg select distinct id from stu 注意 不能部分使用distinct distinct關鍵字應用於所有列而不僅是前置它的列。如果給出select distinct id,name...

python一些常用關鍵字(一)

1 break 終止當前迴圈 2 contime 跳過本次迴圈 3 pass 忽略4 函式名.doc 檢視函式幫助文件 5 global 設定全域性變數 6 nonlocal 不是區域性變數,往上一層找 7 lambda 簡潔的函式表示式 方式1.宣告乙個簡單的lambda表示式 mylamb la...