2 最好使用C 轉型操作符

2021-06-05 19:04:25 字數 2501 閱讀 5274

舊式的c轉型方式,幾乎允許你將任何型別轉換為任何其它型別,有其自身的缺陷,表現在以下兩方面:

不能更精確地指明其轉型的意圖。

如將乙個pointer-to-base-class-object 轉型為乙個pointer-to-derived-class-object(改變乙個物件的型別)和將乙個pointer-to-const-object轉型為乙個pointer-to-non-const-object(改變物件的常量性),在舊式c語法中並不區分。

難以辨識。

舊式c轉型方式的語法為(type)expression,由一對小括號加上乙個物件名稱組成,而這種語法結構在c++的任何地方都有可能使用,這就無法很直觀地判斷出是否是轉型操作。

為解決上述的缺點,c++引入4個新型轉型操作符,分別為:

static_cast,  const_cast,   dynamic_cast,  reinterpret_cast

語法為:       ***_cast(expression).

下面著重解釋四個新型操作符的用途:

static_cast: 基本與擁有與c舊式轉型相同的威力與意義,以及相同的限制。如:

//計算兩個int型數相除,結果為double型

int firstnum, secondnum;

double res = (double)firstnum / secondnum;                //舊式c語法

double res = static_cast

(firstnum) / secondnum; //新式c++轉型符

const_cast: 用來改變表示式中的常量性(constness)或易變性(volatileness)。如:

int num;

const

int *cpnum = #

int *pnum = cpnum;            //error:cannot convert from 'const int *' to 'int *'

int *pnum = (int *)cpnum;                 //舊式c

int *pnum = const_cast

(cpnum); //新式c++ const_cast移除常量性

dynamic_cast: 用來執行繼承體系中「安全的向下轉型或跨系轉型動作」。如:

//可以利用dynamic_cast將「指向base class object 的pointer或reference」轉型為「指向derived class object的pointer或reference」

//如果轉型失敗,會以乙個null指標或乙個exception 表現出來

class cbase ;                        //基類

class cderived: public cbase  ;      //繼承類

cderived dc;

cderived *dp = &dc;

cbase *bp = dynamic_cast

(dp); //使用dynamic_cast將指向繼承類的指標轉化為指向基類的指標

cbase &br = dynamic_cast

(dc); //使用dynamic_cast將指向繼承類的引用轉化為指向基類的引用

reinterpret_cast: 最常用的用途是轉換"函式指標"型別。如:

typedef

void (*funcptr)(); //funcptr是個無引數返回值為void型的函式指標型別

int ifunc()        //ifunc為乙個無引數返回值為int型的函式

void func(funcptr f){}        //func函式的引數是乙個型別為funcptr型別的函式指標

main()

條款2 最好使用c 轉型操作符

c轉型方式有兩個缺點,一是它幾乎允許將任何型別轉化為任何其他型別,二是它的語法結構難以辨識。為了解決c舊式轉型的缺點,c 匯入4個新的轉型操作符。1.static cast expression static cast基本上擁有與c舊式轉型相同的威力與意義,以及相同的限制。double b 10 i...

M2 最好使用C 轉型操作符

1 c語言中的轉型操作符有兩個問題 a 是個通用的轉換操作符,也就是說,可以從乙個型別轉換到其他型別。通用必定是低效率和冗餘的,因為要考慮很多情況。b 在 中,難以辨認出哪些是型別轉換。2 c 提供了新式的轉換操作符,有static cast,dynamic cast,const cast,rein...

C 轉型操作符

解釋四個新型操作符的用途 static cast 基本與擁有與c舊式轉型相同的威力與意義,以及相同的限制。如 計算兩個int型數相除,結果為double型 int firstnum,secondnum double res double firstnum secondnum 舊式c語法 double...