Cpp:type cast

如:

    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.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子橘荠,更是在濱河造成了極大的恐慌屿附,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥童,死亡現(xiàn)場離奇詭異挺份,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贮懈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門匀泊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朵你,你說我怎么就攤上這事各聘。” “怎么了抡医?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵躲因,是天一觀的道長。 經(jīng)常有香客問我忌傻,道長大脉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任水孩,我火速辦了婚禮镰矿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俘种。我一直安慰自己秤标,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布安疗。 她就那樣靜靜地躺著抛杨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荐类。 梳的紋絲不亂的頭發(fā)上怖现,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音玉罐,去河邊找鬼屈嗤。 笑死,一個胖子當(dāng)著我的面吹牛吊输,可吹牛的內(nèi)容都是我干的饶号。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼季蚂,長吁一口氣:“原來是場噩夢啊……” “哼茫船!你這毒婦竟也來了琅束?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤算谈,失蹤者是張志新(化名)和其女友劉穎涩禀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體然眼,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡艾船,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了高每。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屿岂。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鲸匿,靈堂內(nèi)的尸體忽然破棺而出爷怀,到底是詐尸還是另有隱情,我是刑警寧澤晒骇,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布霉撵,位于F島的核電站,受9級特大地震影響洪囤,放射性物質(zhì)發(fā)生泄漏徒坡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一瘤缩、第九天 我趴在偏房一處隱蔽的房頂上張望喇完。 院中可真熱鬧,春花似錦剥啤、人聲如沸锦溪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刻诊。三九已至,卻和暖如春牺丙,著一層夾襖步出監(jiān)牢的瞬間则涯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工冲簿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留粟判,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓峦剔,卻偏偏與公主長得像档礁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吝沫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容