C++筆記 第十一課 新型的型別轉換---狄泰學院
阿新 • • 發佈:2018-11-06
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第十一課 新型的型別轉換
1.強制型別轉換
C方式的強制型別轉換
(Type)(Expression)
Type (Expression)—老式型別
11-1 粗暴的型別轉換
#include <stdio.h> typedef void(PF)(int); struct Point { int x; int y; }; int main() { int v = 0x12345; PF* pf = (PF*)v; char c = char(v); Point* p = (Point*)v; pf(5); printf("p->x = %d\n", p->x); printf("p->y = %d\n", p->y); return 0; } 執行結果: 段錯誤
C方式強制型別轉換存在的問題
過於粗暴:任意型別之間都可以進行轉換,編譯器很難判斷其正確性
難於定位:在原始碼中無法快速定位所有使用輕質型別轉換的語句
問題:強制型別轉換在實際工程中是很難完全避免的!如何進行更加安全可靠的轉換
優化C的方法;新式型別轉換
2.新式型別轉換
C++將強制型別轉換分為 4種 不同的型別
強制型別轉換(牢記場合)
static_cast const_cast
dynamic_cast reinterpret_cast
用法:xxx_cast(Expression)
- static_cast強制型別轉換
用於基本型別間的轉換
不能用於基本型別指標間的轉換
用於有繼承關係類物件之間的轉換和類指標之間的轉換 - const_cast強制型別轉換
用於去除變數的只讀屬性
強制轉換的目標型別必須是指標或引用 - reinterpret_cast強制型別轉換(重解釋)
用於指標型別間的強制轉換
用於整數和指標型別間的強制轉換 - dynamic_cast強制型別轉換(用於類指標)
用於有繼承關係的類指標間的轉換
用於有交叉關係的類指標間的轉換
具有型別檢查的功能
需要虛擬函式的支援
11-2 新式型別轉化初探
#include <stdio.h>
void static_cast_demo()
{
int i = 0x12345;
char c = 'c';
int* pi = &i;
char* pc = &c;
c = static_cast<char>(i);
// pc = static_cast<char*>(pi);//Error
}
void const_cast_demo()
{
const int& j = 1;
int& k = const_cast<int&>(j);
const int x = 2;
int& y = const_cast<int&>(x);
// int z = const_cast<int>(x);//Error
k = 5;
printf("k = %d\n", k);
printf("j = %d\n", j);
y = 8;
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("&x = %p\n", &x);
printf("&y = %p\n", &y);
}
void reinterpret_cast_demo()
{
int i = 0;
char c = 'c';
int* pi = &i;
char* pc = &c;
pc = reinterpret_cast<char*>(pi);
pi = reinterpret_cast<int*>(pc);
pi = reinterpret_cast<int*>(i);
//c = reinterpret_cast<char>(i); //Error
}
void dynamic_cast_demo()
{
int i = 0;
int* pi = &i;
//char* pc = dynamic_cast<char*>(pi); //Error
}
int main()
{
static_cast_demo();
const_cast_demo();
reinterpret_cast_demo();
dynamic_cast_demo();
return 0;
}
執行結果
[email protected]:~/c++$ g++ 11-2.cpp
[email protected]:~/c++$ ./a.out
k = 5
j = 5
x = 2
y = 8
&x = 0x7ffd82c92188
&y = 0x7ffd82c92188
小結
C方式的強制型別轉換
過於粗暴
潛在的問題不易被發現
不易在程式碼中定位
新式型別轉換以C++關鍵字的方式出現
編譯器能夠幫助檢查潛在的問題
非常方便的在程式碼中定位
支援動態型別識別(dynamic_cast)