c++裡,物件型別轉化問題是需要嚴加注意的乙個問題,包括隱式轉換,強制轉化,舊式轉化等種類,需要加以總結。本篇文章概括總結型別轉化問題,並側重於型別的隱式轉換問題。關於強制轉換的詳細的內容放在下篇文章中總結。
一。型別相關:如果兩個型別可以相互轉換,則稱這兩個型別相關。只用相關型別之間才可能發生隱式型別或顯示型別轉換。
1.算術型別之間的轉換:算術型別指不包括void的內建型別,算術型別之間可以相互轉換。
轉換規則根據不同的轉換條件而不同
2.算術型別和bool型別之間的轉換:可將算術物件轉換為bool型別,bool物件也可以轉換為int型
3.整型和列舉型別:自動將列舉型別的物件或者成員轉換為整型
4.指標轉換:(1)大部分情況下陣列名會自動轉換為指向第乙個元素的指標(但不完全是這樣)
(2)指向任意資料型別的指標都可以轉為void*型別(指向const任意型別物件的指標只能都可以轉為const void * 而不能轉為void *)
(3)整數0可以轉換為任意型別指標
(4)指標可以轉化為bool型別
5.轉為const物件:可以用非const物件或其引用初始化化或賦值給const物件;
可以用非const物件或其引用初始化化const的引用;
可以用非const物件的位址或其非const指標初始化或賦值給指向const物件的指標;
可以用const物件或其引用初始化或賦值給非const物件;(如:const指標和非const指標可以相互賦給或初始化)
不可以用const物件或其引用初始化非const引用;
不可以用const物件的位址或指向其指標初始化或賦值給非指向const物件的指標;
6.由標準庫型別定義的轉換:如可將iosteam物件轉為bool型
7.到類型別的轉換:如果在存在乙個非explicit的且只有乙個其他型別的引數或其引用的建構函式,則存在從該引數型別到該類型別的轉換
8.從類型別的轉換:必須定義乙個特殊的成員函式:轉換操作符
通用形式是:operator type (){}
9.從派生類到基類的轉換:(1)非物件轉換:可以用派生類物件或其引用初始化基類型別的引用
也可以用派生類物件的位址對基類型別指標進行賦值或初始化
這兩種情況下基類型別的指標或引用只能訪問派生類物件的基類部分和虛函式(見c++ primer p498)
(2)物件轉換:用派生類物件對基類物件進行初始化或賦值
這種情況下基類物件只擁有派生類物件的基類部分
10.從基類到派生類的轉換:一般是不行的
二。隱式型別轉換條件和規則:
1.初始化或賦值:規則是右運算元轉換為左運算元型別
2.函式呼叫:實參型別轉換為形參型別
3.混合型別的表示式:
(1)如果操作符是算術操作符且運算元都是算術型別(或從類型別轉換到算術型別):這按算術轉換規則進行,
即將每個運算元轉為表示式中最寬的型別
(2)如果操作符是關係操作符且運算元都是算術型別(或從類型別轉換到算術型別):這按算術轉換規則進行,
即將每個運算元轉為表示式中最寬的型別
(3)其他情況的規則:看情況而定
4.條件表示式:用作判斷條件的表示式:出現在if,while,for語句中的條件表示式;條件操作符(?:)第乙個運算元;
邏輯操作符的運算元等。
轉換規則:將表示式結果轉換為bool類
三.顯式(或說強制)型別轉換和規則:
1.轉換條件:(1)覆蓋或修改通常的隱式轉換
(2)存在多種轉換時,需要選擇一種特定的型別轉換
2.轉換規則:
轉換表示式為 cast-name(expression)
其中cast-name是static_cast,dynamic_cast,const_cast,reinterpret_cast中的乙個
各個命令的轉換規則可查書
四.舊式強制型別轉換(略)
例子:int * ip;
char* cp=(char*) ip;
C 型別轉換總結
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 型別轉換總結
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。看似問題複雜化了,其實不然。c風格的型別轉換在程式語句中難以識 c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換...
C 型別轉換總結
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...