C++primer1-7章知識點總結——顯示轉換

TinnCHEN發表於2019-02-18

warning:雖然有時候不得不使用強制型別轉換,但這種方法本質上是非常危險的!

命名的強制型別轉換:

形式:

cast-name<type>(expressopn)
//type是expression要轉換的值。如果type是引用型別,則結果是左值。
static_cast

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

//進行強制型別轉換以便執行浮點數除法
double slope = static_cast<double>(j) / i;

當需要把一個較大的算術型別賦值給較小的型別時,static_cast非常有用。(可以遮蔽編譯器的警告資訊,因為我們明確告知編譯器不在乎損失潛在的精度)

對於編譯器無法自動執行的型別轉換也非常有用。
eg:

//使用static_cast找回存在於void*指標中的值
void* p = &d;
double *dp = static_cast<double*>(p) ;

這樣操作時要注意確保指標的值保持不變。
也就是說強制轉換的結果將與原始的地址值相等,因此我們必須確保轉換後所得的型別就是指標所指的型別。型別一旦不符,將產生未定義的後果。

const_cast

只能改變運算物件的底層const,不能用其改變表示式的型別。

const char *pc;
char *p = const_cast<char*>(pc);//正確,但通過p寫值是未定義的行為
//上述行為我們一般稱其為“去掉const性質“
reinterpret_cast

使用該轉換是非常危險的,其本質上依賴於機器。

為運算物件的為模式提供較低層次上的重新解釋。

eg:

int *ip;
char *pc = reinterpret_cast<char*>(ip)
//pc所指的真實物件是一個int而非字元!
string str(pc);//錯誤,會產生導致異常執行的行為!

相關文章