如:
int val;
val = 3.14 + 3; //val = 6
上面稱為 隱式類型轉(zhuǎn)換沙廉。
1、發(fā)生隱式轉(zhuǎn)換
-
混合表達(dá)式中臼节,操作數(shù)被轉(zhuǎn)化為相同類型
int iv; double dv; iv += dv; //iv會被轉(zhuǎn)換為double
-
作為條件表達(dá)式轉(zhuǎn)換為bool
int val; if(val) //int to bool while(cin) //cin to bool
-
用表達(dá)式初始化某變量撬陵,該表達(dá)式結(jié)果被轉(zhuǎn)換為該變量的類型
int iv = 3.14; //3.14 to int
2、算術(shù)轉(zhuǎn)換
signed 與 unsigned 類型間的轉(zhuǎn)換
如果包含 short 和 int 類型的表達(dá)式网缝,short 轉(zhuǎn)換為int巨税。如果 int 足夠表示所有 unsigned short ,則將 unsigned short 轉(zhuǎn)換為 int粉臊。
long 和 unsigned int 轉(zhuǎn)換也一樣草添,如果 long 足夠表示所有 unsigned int ,則將 unsigned int 轉(zhuǎn)換為 long扼仲。
在32機(jī)器中远寸,long和int通常使用一個字長表示,因此包含 unsigned int 和 long 類型的表達(dá)式屠凶,都應(yīng)該轉(zhuǎn)換為 unsigned long
- signed 和 unsigned int驰后,signed轉(zhuǎn)換成 unsigned int。
舉例
bool bv;
char cv;
short siv;
unsigned short usiv;
int iv;
unsigned int uiv;
long lv;
unsigned long ulv;
float fv;
double dv;
3.14L + 'a'; //'a' 先轉(zhuǎn)換成 int矗愧,再轉(zhuǎn)換成double
dv + iv; //iv to double
dv + fv; //fv to double
iv = dv; //dv to(截斷) int
bv = dv; //if dv=0, bv = false, else bv = true
cv + fv; //cv to int, then, int to float
siv + cv; //siv and cv to int
cv + lv; //cv to long
iv + ulv; //iv to unsigned long
usiv + iv; //依賴于 unsigned short 和 int 的大小
uiv + lv; //依賴于 unsigned int 和 long 的大小
3灶芝、其他隱式轉(zhuǎn)換
指針轉(zhuǎn)換
使用數(shù)組時,大多數(shù)情況下數(shù)組都會自動轉(zhuǎn)化為指向第一個元素的指針
int ia[10]; //數(shù)組
int *ip = ia; //轉(zhuǎn)化成指向第一個元素的指針
還有另外兩種指針轉(zhuǎn)換:
- 指向任意數(shù)據(jù)類型的指針都能夠轉(zhuǎn)化成 void*類型;
- 整型字面常量值 0 可以轉(zhuǎn)換為任意指針類型夜涕;
轉(zhuǎn)換為bool類型
算術(shù)值和指針紙都可以轉(zhuǎn)為bool類型犯犁。如果指針或算術(shù)值為0,則其bool值為false女器,其他則為true:
if (cp) /*...*/ //true if not zero
while(*cp) /*...*/ //convert char to bool
while 語句對 cp
解引用酸役,如果結(jié)果為 null ,則轉(zhuǎn)化成false晓避,否則轉(zhuǎn)化成true
算術(shù)類型與bool類型的轉(zhuǎn)換
可將算術(shù)類型轉(zhuǎn)換成bool型簇捍,也可將bool型轉(zhuǎn)換成int型。算術(shù)類型轉(zhuǎn)bool時俏拱,0轉(zhuǎn)換成false暑塑,其他轉(zhuǎn)換成true;bool轉(zhuǎn)int時锅必,true轉(zhuǎn)成1事格,false轉(zhuǎn)成0。
bool b = true;
int ival = b; //ival == 1
double pi = 3.14;
bool b2 = pi; //b2 is true
pi = false; //pi == 0
轉(zhuǎn)化與枚舉
//p3 = 3; p4 = 4
enum points {p1 = 2, p3, p3 = 3, p4};
轉(zhuǎn)化為const類型
使用非const對象初始化const對象的引用時搞隐,系統(tǒng)將非const對象轉(zhuǎn)化成const對象驹愚。
int i;
const int ci = 0;
const int &j = i; //ok: 將非const對象轉(zhuǎn)化成const對象
const int *p = &ci; //ok: 將非const對象的地址轉(zhuǎn)化為指向const類型的指針
由標(biāo)準(zhǔn)庫類型定義的轉(zhuǎn)換
典型的例子就是
string s;
while(cin >> s)
該表達(dá)式 cin>>s
的結(jié)果 cin
對象,為istream對象劣纲,所以此時會將其轉(zhuǎn)化成bool類型逢捺。
4、顯式轉(zhuǎn)換
顯式轉(zhuǎn)換也稱為強(qiáng)制類型轉(zhuǎn)換(cast)癞季,有以下操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast劫瞳。
何時需要強(qiáng)制轉(zhuǎn)換
例如
double dval;
int ival;
ival *= dval;
上述程序首先會將 ival 轉(zhuǎn)換為 double 型,乘法操作后又將double型的結(jié)果轉(zhuǎn)成int型绷柒。為了避免不必要的轉(zhuǎn)換志于,可以如下操作
ival *= static_cast<int>(dval);
命名的強(qiáng)制類型轉(zhuǎn)換
形式如下
cast-name<type>(expression);
cast-name的選擇有
- static_cast: 編譯器隱式執(zhí)行的任何類型轉(zhuǎn)換都可以通過 static_cast 顯式完成
double d = 1.5;
char ch = static_cast<char>(d);
void *p = &d;
double *dp = static_cast<double*>(p); //可以找回存在void*中的值
- dynamic_cast: 支持運行時識別指針或引用所指的對象。
- const_cast: 去掉表達(dá)式的const性質(zhì)
const char *ccp;
char *cp = string_copy(const_cast<char*>(ccp));
//使string_copy接受const char*類型的參數(shù)
- reinterpret_cast: 通常為操作數(shù)的位模式提供較低層次的重新解釋
int *ip;
char *cp = reinterpret_cast<char*>(ip);
cp 所指的真實對象時 int 類型废睦,所以不能用來初始化 string 對象伺绽。
type表示目標(biāo)類型,expression表示被轉(zhuǎn)換的表達(dá)式嗜湃。
避免使用強(qiáng)制類型轉(zhuǎn)換
舊式的強(qiáng)制轉(zhuǎn)換
char *cp = (char*) ip;
這種方式不容易錯誤跟蹤奈应,可視性差。
C++仍舊支持舊式強(qiáng)制轉(zhuǎn)換购披,但不推薦這樣做钥组。除非在C語言下,或舊式編譯器上才使用今瀑。
END.