5.12 型別轉換
c++並不是把兩個不同型別的值直接加在一起,而是提供了一組轉換規則,以便在執行算術操作之前,將兩個運算元轉換為同一資料型別。這些轉換規則由編譯器自動執行,無需程式設計師介入——有時甚至不需要程式設計師了解。因此,它們被稱為隱式型別轉換(implicit type conversion).
隱式型別轉換中,左運算元的型別佔主導地位。如果賦值操作的左右操作型別不相同,則右運算元會被轉換為左邊的型別。
5.12.1 何時發生隱式型別抓換
5.12.2 算術轉換
5.12.3 其他隱式轉換
1. 指標轉換
在使用陣列時,大多數情況下陣列都會自動轉換為指向第乙個元素的指標。
c++還提供了另外兩種指標轉換:指向任意資料型別的指標都可以轉換為void*型別;整型值數值常量0可轉換為任意指標型別。
2. 轉換為bool型別
算術值和指標值都可以轉換為bool型別。如果指標或算術值為0,則其bool值為false,而其他值為true。
3. 算術型別與bool型別的轉換
將算術型別那個轉換為bool型時,零轉換為false,而其他值則轉換為true。將bool物件轉換為算術型別時,true變成1,而false則為0.
4. 轉換與列舉型別
c++自動將列舉型別的物件或列舉成員轉換為整型,其轉換結果可用於任何要求使用整數值的地方。
5. 轉換為const物件
5.12.4 顯式轉換
顯式轉換也成為強制型別轉換(cast),包含以下列名字命名的強制型別轉換操作符:static_cast、dynamic_cast、const_cast和reinterpret_cast。
5.12.5 何時需要強制型別轉換
int i = 10;
int m = 10;
double j = 10.6;
i *= j; //106
m *= static_cast(j); //100
cout << i << endl;
cout << m << endl;
5.12.6 命名的強制型別轉換
1. dynamic_cast
dynamic_cast支援執行時識別指標或引用所指向的物件。
2. const_cast
const_cast將轉換掉表示式的const性質。
string m = "10";
const string *i = &m;
string *j = const_cast(i);
除了刪除或新增const特性,用const_cast符來執行其他任何型別轉換,都會引起編譯錯誤。
3. static_cast
編譯器隱式執行的任何型別都可以由static_cast顯式完成。
可通過static_cast將存放在void*中的指標值強制轉換為原來的指標型別,此時我們應該確保指標值。也就是說強制轉換的結果應與原來的位址值相等。
int m = 10;
int *n = &m;
void *i = n;
int *j = static_cast(i);
cout << *j << endl;
cout << *n << endl;
4. reinterpret_cast
reinterpret_cast通常為運算元的位模式提供較低層次的重新解釋。
強制型別轉換關閉或掛起了正常的型別檢查,強烈建議程式設計師避免使用強制型別轉換。
5.12.7 舊式強制型別轉換
舊式強制型別轉換符號有下列兩種形式:
type(expr); 以及 (type)expr;
第4章 表示式
解引用運算子生成左值,所以decltype p 的結果是 int 取位址運算子生成右值,所以decltype p 的結果是 int cin v1 v2 先讀入v1,再讀入v2如果表示式指向並修改了同乙個物件,將會引發錯誤並產生未定義的行為。cout v1 v1 cout 42 10 的優先順序較高,...
第4章 表示式
左值和右值 當乙個物件被用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 求值順序 四種明確規定了運算物件的求值順序的運算子 1 處理復合表示式時 拿不準時用括號強制表示式組合關係復合程式邏輯的要求 如果改變了某個運算物件的值,在表示式其他的地方不要再...
第5章 表示式
不想從第一章開始看起,看目錄覺得對第五章中的bitset和sizeof有點興趣,嗯,研究一下。1 if ival ival作為乙個條件表示式,非0時,if條件成立。表示式結果是右值,可讀取結果,不能對它進行賦值。2 短路求值 邏輯與和邏輯或總先計算左運算元。且只在左運算元無法確定結果時,才會求解右運...