條款44 GotW 17 型別轉換(Casts)

2021-09-14 00:47:29 字數 2200 閱讀 9434

【問題】

標準c++中新風格的轉換與舊風格的c轉換相比,具有更強大的功能和安全性。你對它了解多少?本條款中,使用如下的類和全域性變數。

class a /*...*/};

class b : virtual private a;

struct c: a ;

struct d:b,c ;

a a1;b b1;c c1;d d1;

const a a2;

const a& ra1 = a1;

const a& ra2 = a2;

char c;

1.下面哪一些新風格的轉換與c風格的不同?

2.對於如下的c中的型別轉換,寫出相應的新風格型別轉換語句。其中哪乙個語句必須用新風格編寫才正確?

void f()

3.判斷下面每一條c++轉型語句的編寫風格和正確性:

void g()

【解答】

1.只有dynamic_cast不能與c的風格相對應。

2.pa = (a*)&ra1;

這句應該使用const_cast。

pa = (a*)&a2;

這句話無法以新風格的轉型表達,最接近的方案是使用const_cast,但a2是乙個const object,語句未定義。

pb = (b*)&c1;

這句應該使用reinterpret_cast。

pc = (c*)&d1;

這句在c中是錯誤的,而在c++中,並不需要轉型:pc = &d1;

3.首先:我們並不知道本條款給出的類是否擁有虛函式,如果涉及轉換型別並不擁有虛函式,那麼下面所有多dynamic_cast的使用都是錯誤的,下面討論假設類都擁有虛函式,從而使dynamic_cast都合法。

unsigned char* puc = static_cast(&c);

signed char* psc = static_cast(&c);

錯誤:這兩條語句必須使用reinterpret_cast,原因char、signed char和unsigned char是三種截然不同的型別,儘管它們之間存在隱式轉換,但是它們毫無聯絡。

void* pv = static_cast(&b1);

b* pb1 = static_cast(pv);

這兩句都沒錯,但第一句中用static_cast沒有必要,因為本來就可以乙個物件隱式轉換成乙個void*。

b* pb2 = static_cast(&b1);

這句話沒有必要,b1本身就是b型別的。

a* pa1 = const_cast(&ra1);

這句話是正確的,但是去掉乙個const是潛在不良風格的表現。大部分情況下,因為各種原因去掉指標和引用的常量屬性都涉及某些類的成員,並通常使用mutable關鍵字來完成。

a* pa2 = const_cast(&ra2);

錯誤:如果該指標用來對物件進行寫操作,那麼產生未定義的行為。因為a2是乙個const object。試想:如果編譯器了解到a2是乙個const object而建立,出於優化考慮放在唯讀儲存區,很明顯去掉const物件屬性是危險的。

b* pb3 = dynamic_cast(&c1);

錯誤,因為c1不是乙個b,這裡合法的應該是reinterpret_cast,但是使用它不好。

a* pa3 = dynamic_cast(&b1);

錯誤,這句話是非法的。因為b1不是乙個a(因為b不是因public方式派生自a,而是private方式)。

b* pb4 = static_cast(&d1);

這句話是正確的,當目標向下轉型可以是靜態的,但是要注意:你正在告訴編譯器乙個事實——指標所指的真的是同一種型別,如果你錯了,那麼轉換將無法告訴你除了問題(dynamic_cast在轉換失敗返回空指標,導致程式崩潰)。

pa1 = dynamic_cast(pb2);

pa1 = dynamic_cast(pb4);

這兩句看起來很相似,第乙個是錯誤的,第二個是正確的。原因:b不是公有繼承自a,第二句成功,因為d物件是a的間接子類。

c* pc1 = dynamic_cast(pb4);

這句話正確的,dynamic_cast可以遍歷繼承層次結構執行轉換。

c& rc1 = dynamic_cast(*pb2);

這句話是錯誤的,因為*pb2並不是乙個真正成c型別。

C 入門6 15 型別轉換

型別轉換有三種方式 1.int 2.convert.toint32 3.int.parse 區別 1.處理空值null 2.處理數值時 int 強制轉換不進行四捨五入 3.convert.toint32的引數比較多,int.parse只能轉換string型別的。4.parse就是把string轉換成...

c 入門003 型別轉換

自動轉換型別不是改變原本的變數,而是建立乙個臨時的變數。c 允許將 a型別的變數 賦值給 b型別的變數,這樣值將轉換為a型別。long long num short short num long num short num 這樣將short 16位 擴充套件為 long 32位 潛在問題 轉換 潛在...

C 高階 07 型別轉換

型別轉換就目前 get 到的在 c 裡面一共有兩種,隱式轉換跟顯式轉換 也叫強勢轉換 下面咱們乙個乙個的以 例項來介紹。1,隱式轉換 參與運算 算術運算和賦值運算 的運算元和結果型別必須一致,當不一致時,滿足下面條件時系統自動完成型別轉換 隱式轉換 1 兩種型別相容 例如 int 和 double ...