阿里面試過去好久了,可惜筆試做的太爛了,gg,不過還是要繼續完善自己的知識體系的。
這個型別轉換的問題,被面試官問到了,然後一臉尼克楊的蒙蔽表情。。
其實早就找到了,這個問題,一直因為忙別的,沒有好好總結一下。。
effective c++條款27 儘量減少轉型動作
c++的設計目標之一是,保證「型別錯誤」絕不可能發生。但是 轉型casts
破壞了型別系統。
型別轉換的含義就是通過改變乙個變數的型別為 別的型別,從而改變變數的表達方式。
為了型別轉換,我們通常會使用傳統的型別轉換符。
// c語言風格
(t)expression
//將 expression 轉型為 t
// 函式風格
t(expression)
舉個在c語言中的例子,我們把乙個變數從 float 強制轉換成 int 型別的時候,我們通常這樣做:
int i;
float f;
// first
i = (float)f;
// second
i = int(f);
這種方式對於已經是標準定義轉換型別做的挺好,但是 對於我們在c++ 中自定義的類和 類的指標來說就不是很好用了。
ansi c++ 定義了四個新的型別轉換符(詳見 effective c++ 第27 條):
那好我們分別介紹一下這幾種型別轉換的特點。
中間又被交叉面了兩次,,又被提到了這個問題,,支支吾吾又沒回答上來。。
顧名思義,通常被用來將物件的常量性移除(cast away the constness)或者傳遞。說人話的就是把乙個物件從常量物件變成可以修改的物件。
注意其他三種不能修改物件的常量性!
eg
class c{};
const c *a = new c;
c *b = const_cast
(a);
指標b 就可以操作了。。
主要用來「向下安全轉型」(safe downcasting),也就是說來決定 某物件 是否歸屬繼承體系中的某個型別。
只用於 物件的指標 和 引用。
當用於多型型別的時候,它允許任意的隱式型別轉換,以及相反過程。
注意,在隱式轉換的相反過程中,dynamic_cast 會檢查操作是否有效,他會檢查轉換是否會返回乙個被請求的完整物件,如果不是乙個有效的物件指標,返回值是null
.
eg
//
class base;
};class derived:public base{};
base* b1 = new derived;
base* b2 = new base;
derived* d1 = dynamic_cast
(b1); // succeeds
derived* d2 = dynamic_cast
(b2); // fails: returns 'null'
// b1 是 父類 型別的指標,指向乙個 子類物件,然後可以轉換成 子類的 指標。。這就是說可以安全向下
// b2 是 父類 型別的指標,指向乙個 父類物件,那麼這個父類物件的指標不能被轉換,返回null
//理解起來可以這麼想,,子類 繼承了 父類,父類有的,子類一定有,但是子類有的父類不一定有。。
//這麼就是說 子類物件的父類指標,可以變成 子類指標
// 父類物件的父類指標,不能變成 子類指標。。因為父類物件不一定是子類物件。
如果乙個引用型別執行了型別轉換並且這個轉換是不可能的,乙個bad_cast的異常型別被丟擲
class base };
class derived : public base ;
base* b1 = new derived;
base* b2 = new base;
derived d1 = dynamic_cast
(b1); // succeeds
derived d2 = dynamic_cast
(b2); // fails: exception thrown
static_cast 允許執行任意的隱式轉換 和 相反轉換 動作。
應用到類指標上,,意思是 它允許 子類型別的指標 轉換為父類型別的 指標,同時,,
它也允許 父類型別的 指標 轉化為 子類型別的指標。。。
被轉換的父類沒有被檢查是否與目的型別相一致。
class base {};
class derived : public base {};
base *a = new base;
derived *b = static_cast
(a);
/// 父類---->子類
/// 如果 提前知道了,可以這麼做。。
『static_cast』除了操作型別指標,也能用於執行型別定義的顯式的轉換,以及基礎型別之間的標準轉換
double d = 3.14159265;
int i = static_cast
(d);
//有點強制的意思。。。
reinterpret_cast
轉換乙個指標為其它型別的指標。它也允許從乙個指標轉換為整數型別。反之亦然。
意思是說,這兩個型別沒有什麼相關性,也可以相互轉化,乙個指標也能轉成乙個整數。
這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。
如果情況是從乙個指標 到 整型 的copy,內容的解釋 是系統相關的,所以任何實現都不方便。
乙個轉換到足夠大的整型能夠包含它的指標是能夠轉換回有效的指標的。
class a {};
class b {};
a * a = new a;
b * b = reinterpret_cast(a);
//'reinterpret_cast'就像傳統的型別轉換一樣對待所有指標的型別轉換。
其實還是沒有理解透徹,先記下來,,以後再回來看看吧
《effective c++》scott meyersc++的四種cast操作符的區別–型別轉換
C 之型別轉換
一 static cast型別轉換 static cast 應用於c 可以隱式轉換的型別之間,包括雙向隱式轉換和單向隱式轉換。例如 雙向隱式轉換 int a char b a static cast b 可以直接通過隱式轉換,轉換型別 a b b static cast a 可以直接通過隱式轉換,轉...
More Effective C 之型別轉換
1.條款之優先考慮c 風格的型別轉換 c 通過引用4種新的型別轉換克服了c風格的型別轉換的缺點。這四種操作符是 static cast,const cast,dynamic cast以及reinterpret cast。大多數情況下,關於這些操作符應該知道的是,我們所習慣的寫法為 type expr...
C 之型別轉換
實現將a類的物件轉換為b類物件的方法有3種 a類物件 方法一 如果a為基類,b為派生類,能夠將派生類的物件轉換基類的物件,如b b a a b 方法二 在a類物件中定義轉換建構函式 單形參建構函式 除掉預設形參 並將b類物件作為形參,同一時候禁止使用explicit關鍵子,形如 a b b,int ...