該博客用於記錄自己在閱讀過程中不懂的知識點,很少用到但比較重要的知識點以及模棱兩可的知識點
賦值運算符滿足右結合律
移位運算符滿足左結合律
sizeofp; //指針所佔空間大小
sizeof*p; //指針所指對象類型所佔空間大小
sizeof返回一個常量表達式(可以用來聲明數組維度)
隱式轉換
宏觀理解:隱式轉換往更寬或更大的類型轉換,賦值運算右邊的 會往左邊轉換
bool,short,char等比int小的類型會先提升爲int再運算
無符號和帶符號運算,如果兩類型相同則會轉換爲無符號,如 果不相同,則依賴於及其兩運算對象存在包含與被包含關係,如 果其中無符號的所有值都被帶符號的包含,則轉換爲帶符號數, 否則轉換爲無符號的如:usignedint 和long都是4個字節,所以 轉換爲usignedint;
3.14L+ 'a'; //'a'先提升爲int,再轉換爲double
其他類型隱式轉換
大多使用數組的表達式中數組轉換爲指向首元素的指針
常量整數值0和nullptr可以轉換爲任意指針
指向任意非常量的指針都能轉換爲void*
指向任意對象的指針都能轉換成constvoid*
轉換成bool型
允許將非常量的指針和引用轉換成相應常量類型的指針和引用
類類型的轉換,如:
string s = “aaa”; //字面值轉換爲string類型
while(cin >> a) //cin轉換爲bool值
強制類型轉換:
static_cast:
通常情況下使用該方式,例如
1.強制轉換爲double類型執行浮點除法
2.較大的算術類型轉換爲較小的算術類型(精度損失)
3.用於一些編譯器無法自動執行的類型轉換
void*p = &d;
double*rp = static_cast<double*>(p);
const_cast:
改變運算對象的底層const,只有它能改變表達式的const屬性
constchar *p1;
char*p2 = const_cast<char *> (p1);
如果p1所指對象爲一個常量,通過p2寫值是不行的
reinterpret_cast
無關類型之間的轉換,重新解釋(IBM的C++指南、C++之父BjarneStroustrup的FAQ網頁和MSDN的VisualC++也都指出:錯誤的使用reinterpret_cast很容 易導致程序的不安全,只有將轉換後的類型值轉換回到其原始類型,這樣纔是正確使用 reinterpret_cast方式。IBM的C++指南、C++之父BjarneStroustrup的FAQ網頁和MSDN 的VisualC++也都指出:錯誤的使用reinterpret_cast很容易導致程序的不安全,只有將轉換 後的類型值轉換回到其原始類型,這樣纔是正確使用reinterpret_cast方式。)所以該轉換 常和hash配合使用