static cast的詳細介紹

2021-06-20 02:13:05 字數 2214 閱讀 4317

static_cast一般用來將列舉型別轉換成整型,或者整型轉換成浮點型。也可以用來將指向父類的指標轉換成指向子類的指標。做這些轉換前,你必須確定要轉換的資料確實是目標型別的資料,因為static_cast不做執行時的型別檢查以保證轉換的安全性。也因此,static_cast不如dynamic_cast安全。對含有二義性的指標,dynamic_cast會轉換失敗,而static_cast卻直接且粗暴地進行轉換。這是非常危險的。

比如:

class b {};

class d : public b {};

void f(b* pb, d* pd)

上面的第乙個型別轉換是不安全的。比如,一旦使用pd2呼叫了乙個子類d有而父類b沒有的方法,則程式就會因越界訪問而崩潰。

static_cast和dynamic_cast都可以用於類層次結構中基類和子類之間指標或引用的轉換。所不同的是,static_cast僅僅是依靠型別轉換語句中提供的資訊(尖括號中的型別)來進行轉換;而dynamic_cast則會遍歷整個類的繼承體系進行型別檢查。比如:

class b 

};class d : public b {};

void f(b* pb)

如果pb確實是指向乙個d型別的物件,那pd1和pd2的值是相同的,即使pb為null。

如果pb實際指向的是乙個b型別的物件,那dynamic_cast就會轉換失敗,並返回null(此時pd1為null);而static_cast卻依據程式設計師指定的型別簡單地返回乙個指標指向假定的d型別的物件(此時pd2不為null),這當然是錯誤的。

static_cast還可以在兩個類物件之間進行轉換,比如把型別為a的物件a,轉換為型別為b的物件。如下:

class a;

class b;

a a;

b b;

b = static_cast(a);

此過程可以看做是以a為引數構造乙個b型別的臨時物件,然後再把這個臨時物件賦值給b。如下:

class a;

class b;

a a;

b b;

b c(a);

b = c;

所以,如果讓以上**通過編譯,那麼b類必須含有以a類的物件(或物件的引用)為引數的建構函式。如下:

b(a& a)

這實際上是把轉換的工作交給建構函式去做了。

static_cast最常用的是基本型別直接的轉換,比如char與int、int與float、enum與int之間的轉換。在把int轉換為char時,如果char沒有足夠的位元位來存放int的值(int>127或int<-127時),那麼static_cast所做的只是簡單的截斷,及簡單地把int的低8位複製到char的8位中,並直接拋棄高位。在把int轉換為enum時,如果int的值沒有落進enum的範圍內,則enum的值將是「未定義」的。比如,定義乙個列舉型別week,它包含周一到週日七天:

enum week

;

此時如果把值為8的int轉換為week型別,那麼這個week變數不會是周一到週日的任何一天。

week noday = static_cast(8);

如果你用「%d」格式把它列印出來,你會發現,它的值確實是8。但這已經超出周一到週日了。世界上沒有「星期八」,不是嗎?

static_cast甚至可以把任何乙個表示式轉換為void型別。

再次提醒,static_cast完全靠程式設計師自己去保證轉換的正確性。

static_cast轉換的目標型別可以帶const、volatile或__unaligned屬性。但static_cast不能把源型別的這些熟悉移除。如果想強制移除乙個變數的const、volatile或__unaligned屬性,請參考const_cast操作符。

小結一下:

static_cast常用來進行基本型別直接的轉換,如char與int、int與float、enum與int之間;

static_cast也可以轉換使用者自定義型別,但目標型別必須含有相應的建構函式;

static_cast還可以轉換物件的指標型別,但它不進行執行時型別檢查,所以是不安全的;

static_cast甚至可以把任何表示式都轉換成void型別;

satic_cast不能移除變數的const屬性,請參考const_cast操作符;

static_cast進行的是簡單粗暴的轉換,所以其正確性完全由程式設計師自己保證。

AsyncTast的詳細介紹

package com.sequel.text import android.os.asynctask import android.widget.textview 執行順序 onpreexecute doinbackground onpostexecute 三個引數的的解釋 第乙個是指 doinb...

iframe的詳細介紹

src aa.jsp width 750 height 30 frameborder no border 0 marginwidth 0 marginheight 0 scrolling no allowtransparency yes iframe runat server 這個最好加上ifram...

多型的詳細介紹

多型 定義 某一類事物的多種存在形態 列 動物中 貓 狗 貓這這個物件對應的型別是貓型別 貓 a new 貓 同時貓也是動物中的一種,也可以把貓稱為動物 動物 b new 貓 動物是貓和狗具體事物中抽取出來的父型別 父型別引用指向子型別物件。物件的多型性 class 動物 class 狗 exten...