C 顯式型別轉換

2022-10-11 14:06:17 字數 1936 閱讀 7770

c++ 的隱式型別轉換不在此文章講述範圍。

c++ 的顯式型別轉換有 4 種:static_cast、 dynamic_cast、const_cast、reinterpret_cast。

語法:cast-name(expression);

type 是轉換的目標型別,expression 是要轉換的值。cast-name 是 static_cast、 dynamic_cast、const_cast、reinterpret_cast 中的一種。

任何具有明確定義的型別轉換,只要不包含底層 const,都可以使用 static_cast。

例如:

double dpi = 3.1415926;

int num = static_cast(dpi);  //num的值為3

double d = 1.1;

void *p = &d;

double *dp = static_cast(p);

支援執行時型別識別 (run-time type identification,rtti)。

適用於以下情況:我們想使用基類物件的指標或引用執行某個派生類操作並且該操作不是虛函式。一般來說,只要有可能我們應該盡量使用虛函式,使用 rtti 運算子有潛在風險,程式設計師必須清楚知道轉換的目標型別並且必須檢查型別轉換是否被成功執行。

舉例:

//假定base類至少含有乙個虛函式,derived是base的公有派生類。

//如果有乙個指向base的指標bp,則我們可以在執行時將它轉換成指向derived的指標。

if (derived *dp = dynamic_castbp)

else

用於改變運算物件的底層 const。常用於有函式過載的上下文中。

舉例:

const string &shorterstring(const string &s1, const string &s2)

//上面函式返回的是常量string引用,當需要返回乙個非常量string引用時,可以增加下面這個函式

string &shorterstring(string &s1, string &s2) //函式過載

通常為運算物件的位模式提供較低層次上的重新解釋。危險,不推薦。

假設有下面轉換:

int *ip;

char *pc = reinterpret_cast(ip);

頂層 const:表示物件是常量。舉例 int *const p1 = &i;  // 指標 p1 本身是乙個常量,不能改變 p1 的值,p1 是頂層 const。

底層 const:與指標和引用等復合型別部分有關。舉例:const int *p2 = &ci; // 指標所指的物件是乙個常量,允許改變 p2 的值,但不允許通過 p2 改變 ci 的值,p2 是底層 const

qt 是用 c++ 寫的,所以可以使用上述 4 種顯式型別轉換,qt 框架提供的顯式型別轉換:qobject_cast

語法:qobject_cast(qobject *p);

功能:將 p 轉換為 desttype 型別,若轉換失敗,則返回 0。

該函式類似於 c++ 中的 dynamic_cast,不過不需要 c++ 的 rtti 的支援。 qobject_cast 僅適用於 qobject 及其派生類

使用條件:目標型別 desttype 必須繼承 (直接或間接) 自 qobject,並使用 q_object 巨集。

舉例:

qobject *obj = new qtimer;

qtimer *timer = qobject_cast(obj); //timer == (qobject *)obj

qabstractbutton *button = qobject_cast(obj); // button == 0

C 顯式型別轉換

對於型別轉換,我在查資料的時候看到了一種很有意思的解釋,我們可以這樣理解型別轉換 某塊記憶體中的資料是不變的,而型別就是我們戴上的眼鏡,當我們戴上一種眼鏡後,我們就會用對應的型別來解釋記憶體中的資料,這樣不同的解釋就得到了不同的資訊。所謂強制型別轉換實際上就是換上另一副眼鏡後再來看同樣的那塊記憶體資...

c 顯式型別轉換

乙個命名的強制型別轉換具有以下形式 cast name expression 其中,type是轉換的目標型別,而expression是要轉換的值。如果type是引用型別,則結果是左值。cast name是static cast dynamic cast const cast reinterpret ...

C 的顯式型別轉換

c 的顯式型別轉換 顯式型別轉換意味著告訴編譯器 別管我,我已確定要這麼做!編譯器就會相信你,不再做任何其他檢查。所以要小心使用轉換。強制型別轉換容易引發錯誤,所以被認為是一種醜陋的語法。c 中有乙個觀念 醜陋的語法就應該用醜陋的方式表達。所以,c 的轉換操作符使用 x cast 這種一種繁瑣的形式...