您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++中四種類型轉換的方法是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++中四種類型轉換的方法是什么文章都會有所收獲,下面我們一起來看看吧。
當等號兩邊的類型不同的時候、形參與實參類型不匹配的時候、返回值類型與接收返回值類型不一致時,就需要發生類型轉化。
而類型轉換又分為隱式類型轉換和顯示類型轉換。
int main() { // 隱式類型轉換 int Ival = 1; double Dval = Ival; // 顯示類型轉換 int* p = &Ival; int pi = p;// error int pi = (int)p; return 0; }
隱式類型轉換是編譯器在編譯階段自動進行,能轉就轉,不能轉就編譯失敗。
而顯示類型轉換就要我們自己處理。
上面的兩種類型轉換是C語言風格的,存在一些缺點。
隱式類型轉換會造成精度的丟失。
而顯示類型轉換則會導致轉換不清晰(不知道誰轉化過來)。
所以C++提供了規范的四種類型轉換
如果想要進行相似類型的轉換,編譯器隱式執行的任何類型轉換都可用。
但是如果是兩個不相關的類型就不能轉換。
int main() { int i = 0; double d = static_cast<int>(i); int* p = nullptr; int pi = static_cast<int>(p);// error return 0; }
上面我們用指針類型轉化成整型出現錯誤,而這種不同類型的轉換要用reinterpret_cast
。
int main() { int i = 0; double d = static_cast<int>(i); int* p = nullptr; int pi = static_cast<int>(p);// error int pi = reinterpret_cast<int>(p);// correct return 0; }
使用const_cast
的主要目的是為了去除一個const變量的const,方便賦值。
int main() { const int i = 1; int* p = const_cast<int*>(&i); *p = 3; cout << i << endl; return 0; }
這里的結果需要注意一下:
這里是因為編譯器把這個變量放到了寄存器中,我們修改的是內存中的數據,不影響寄存器,我們可以加上volatile
關鍵字(每次都去內存中取)來看看:
int main() { volatile const int i = 1; int* p = const_cast<int*>(&i); *p = 3; cout << i << endl; return 0; }
dynamic_cast
用于將一個父類對象的指針/引用轉換為子類對象的指針或引用(動態轉換)
在前面的文章【C++】繼承中講過,子類對象賦值給父類 對象/指針/引用,這里有個形象的說法叫切片或者切割,寓意把派生類中父類那部分切來賦值過去。
但是如果我們直接把父類類傳遞給子類,會不安全,因為父類轉給子類會多開一份空間,可能會越界訪問。
class A { public: virtual void f() {} public: int _a = 0; }; class B : public A { public: int _b = 0; }; void fun(A* pa) { B* pb = (B*)pa; pb->_a++; pb->_b++; } int main() { A a; B b; fun(&a); fun(&b); return 0; }
而加上dynamic_cast
后如果轉化失敗就會返回空指針,讓我們檢查:
class A { public: virtual void f() {} public: int _a = 0; }; class B : public A { public: int _b = 0; }; void fun(A* pa) { B* pb = dynamic_cast<B*>(pa); cout << pb << endl; if (pb) { pb->_a++; pb->_b++; } } int main() { A a; B b; fun(&a); fun(&b); return 0; }
但是這里要注意dynamic_cast
只能用于父類含有虛函數的類
關于“C++中四種類型轉換的方法是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++中四種類型轉換的方法是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。