char*轉int
char *numstr = “12”;
int val = atoi(numstr);
C++中四種類型轉化
我們都知道:
C中的強制類型轉換(Type Cast)很簡單,不管什么類型的轉換都是:
Type b = (Type)a
而C++中有四種轉換類型如下:
static_cast ,const_cast ,dynamic_cast,reinterpret_cast
我們來詳細了解一下:
1.static_cast靜態轉換(在編譯期間處理)
類似於C風格的強制轉換最常用的類型轉換符,在正常狀況下的類型轉換。主要用於C++中內置的基本數據類型之間的轉換。但是沒有運行時類型的檢測來保證轉換的安全性。
如把int轉換為float,
int i;
float f;
f=(float)i; //c中的類型強制轉換
//或者
f=static_cast(i);
1
2
3
4
5
6
static_cast類型的轉換還有什么用處呢?
用於基類和子類之間的指針或引用的轉換。這種轉換把子類的指針或引用轉換為基類表示是安全的;進行下行轉換,把基類的指針或引用轉換為子類表示時,由於沒有進行動態類型檢測,所以是不安全的;
簡言之:子轉父,安全;父轉子,不安全。
把void類型的指針轉換成目標類型的指針(不安全)
用於內置的基本的數據類型之間的轉換
把任何類型的表達式轉換成void類型的
注意:static_cast不會轉換掉const,volatile,__unaligned屬性
const_cast去常轉換(編譯時執行)
它主要作用於同一個類型之間的去常和添加常屬性之間的轉換。
不能用做不同的類型之間的轉換。它可以把一個不是常屬性的轉換成常屬性的,同時它也可以去掉常屬性
通常用於取出const屬性,把const類型的指針變為非const類型的指針,
如:
const int *fun(int x,int y){}
int *ptr=const_cast<int *>(fun(2,3))
1
2
3
該運算符用來修改類型的const或volatile屬性。但是需要注意的是,
const_cast <type_id> (expression)
1
除了const 或volatile修飾之外, type_id和expression的類型是一樣的。
主要作用如下:
- 常量指針被轉化成非常量指針,並且仍然指向原來的對象;
- 常量引用被轉換成非常量引用,並且仍然指向原來的對象;
- 常量對象被轉換成非常量對象。
dynamic_cast動態類型轉換/向下安全轉型(運行時執行)
通常用於基類和派生類之間的轉換.。運行時檢查該轉換是否類型安全。但只在多態類型時合法。
注意:
不能用於內置的基本數據類型之間的轉換.
dynamic_cast轉換成功的話返回的是類的指針或引用,失敗返回null。相同基類不同子類之間的交叉轉換,結果是NULL。
dynamic_cast進行的轉換的時候基類中一定要有虛函數,因為只有類中有了虛函數,才說明它希望讓基類指針或引用指向其派生類對象的情況,這樣才有意義。這是由於運行時類型檢查需要運行時類型的信息,而這些信息存儲在虛函數表中.
在類的轉換時,類層次間進行轉換的時候,dynamic_cast和static_cast進行上行轉換的時候效果是一樣的;但是在進行下行轉換的時候,dynamic_cast會進行類型檢查所以它更安全。它可以讓指向基類的指針轉換為指向其子類的指針或是其兄弟類的指針
reinterpret_cast重解釋類型轉換
reinterpret為重新解釋,此標識符的意思即為數據的二進制形式重新解釋,但是不改變其值。
它有着和C風格強制類型轉換同樣的功能:
- 它可以轉化任何的內置數據類型為其它的類型
- 可以把任何類型的指針轉化為其它的類型
它的機理是對二進制數據進行重新的解釋,不會改變原來的格式,而static_cast會改變原來的格式。最普通的用途就是在函數指針類型之間進行轉換。