舊式的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個新型轉型操作符,分別為:
語法為: ***_cast(expression).static_cast, const_cast, dynamic_cast, reinterpret_cast
下面著重解釋四個新型操作符的用途:
static_cast: 基本與擁有與c舊式轉型相同的威力與意義,以及相同的限制。如:
const_cast: 用來改變表示式中的常量性(constness)或易變性(volatileness)。如://計算兩個int型數相除,結果為double型int firstnum, secondnum;double res = (double)firstnum / secondnum; //舊式c語法double res = static_cast(firstnum) / secondnum; //新式c++轉型符
dynamic_cast: 用來執行繼承體系中「安全的向下轉型或跨系轉型動作」。如:int num;constint *cpnum = #
int *pnum = cpnum; //error:cannot convert from 'const int *' to 'int *'int *pnum = (int *)cpnum; //舊式cint *pnum = const_cast(cpnum); //新式c++ const_cast移除常量性
reinterpret_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將指向繼承類的引用轉化為指向基類的引用
typedefvoid (*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...