C 強制轉換之static cast

2021-07-11 07:44:03 字數 2956 閱讀 2191

static_cast

用法:static_cast(expression)

簡介:該運算子把expression轉換為type_id型別,但沒有執行時型別檢查來保證轉換的安全性。

主要有以下幾種用法:

1. 用於類層次結構中基類和派生類之間指標或引用的轉換:進行上行轉換是安全的,進行下行轉換時是不安全的

2. 用於基本資料型別之間的轉換

3. 把空指標轉換成目標型別的空指標

4. 把任何型別的表達斯轉化成void型

下面給出一些具體的示例

例子1

#include #include using namespace std;

class a

void print()

private:

int m_a;

};class b : public a

virtual ~b() {}

virtual void test()

};int main(int argc, char** argv)

執行結果如下:

m_a: 1

分析:b繼承自a,b型別可以上行轉換為a型別

例子2

a a = a(1);

b b = static_cast(a); //錯誤,error c2440: 「static_cast」: 無法從「a」轉換為「b」,無建構函式可以接受源型別,或建構函式過載決策不明確

分析:b雖然繼承自a,但a不能強轉為b

例子3

#include #include using namespace std;

class a

void print()

a(const a& a)

~a() {}

private:

int m_a;

};class b : public a

virtual ~b() {}

virtual void test()

};int main(int argc, char** argv)

結果如下:

m_a: 1

分析:理所當然,指標的上行轉換不會出錯

例子4

#include #include using namespace std;

class a

void print()

a(const a& a)

~a() {}

private:

int m_a;

};class b : public a

virtual ~b() {}

virtual void test()

};int main(int argc, char** argv)

結果:可以執行,但是執行執行到test時會崩潰

分析:本例中指標pb會有乙個vptr,但指向的位置並不是類b的虛表(pb中的vptr並不指向任何虛表,如果a中有虛函式的話,vptr會指向a的虛表),找不到對應虛函式,所以自然會崩潰

例子5

#include #include using namespace std;

class a

void print()

a(const a& a)

~a() {}

private:

int m_a;

};class b : public a

virtual ~b() {}

virtual void test()

};int main(int argc, char** argv)

執行結果如下:

pa: 0051b434, pb: 0051b430

pa: 0051b434, pb: 0051b430

test

分析:轉化不會出錯,具體原因跟類的物件的記憶體模型有關,這裡不做解釋,另外,如果在類a中加個隨便加個虛函式,pa和pb將會相同,另外,無論怎麼轉換,vptr永遠指向類b的虛表。

例子6

class c

;class d: public c

;int main(int argc, char** argv)

結果,編譯通過執行成功

class c

;class d: protected c

;int main(int argc, char** argv)

結果,編譯出錯,error c2243: 「static_cast」: 從「d *」到「c *」的轉換存在,但無法訪問

class c

;class d: private c

;int main(int argc, char** argv)

結果,編譯出錯,error c2243: 「static_cast」: 從「d *」到「c *」的轉換存在,但無法訪問

如果有兩個類a和b,兩者不存在繼承關係,它們之間無法通過static_cast進行轉換,**就不上了

例子7

#include #include using namespace std;

class a

~a()

private:

int m_a;

};int main(int argc, char** argv)

編譯通過執行成功,static_cast可以將void*型轉換為任意型別,dynamic_cast則不行,void*型別不能作為括號中的引數

C 基礎之強制轉換

目錄 c風格型別轉換 c 型別轉換 1.static cast 型別轉換 2.const cast 修改const屬性 例 3.dynamic cast 基類和派生類間的轉換 4.reinterpret cast 任意指標 引用型別轉換 不安全 型別轉換有c風格的,當然還有c 風格的。c風格的轉換的...

C 強制轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...

c 強制轉換

隱式轉換 char int 顯示轉換 c風格轉換 base b new test test t test b c 風格 static cast 編譯時檢查,如果不是派生關係,則編譯錯誤 dynamic cast 執行時檢查,如果不是派生關係,則返回null rtti reinterpret cast...