const char * 类型的实参与 char * 类型的形参不兼容_4 种 C++ 强制类型转换,你都清楚吗?...
我們先來回憶以下,C 語言的強制類型轉換形式:
(type) expr;這種舊式強制類型轉換從表現形式上來說不夠清晰明了,容易看漏,一旦轉換過程出現問題,追蹤起來也就更加困難。
為了解決以上問題,C++不僅兼容了C的強制轉換,來引入了新的轉換方法。
強制類型轉換的形式:
cast-name<type>(exper);其中,type是轉換的目標類型,exper是要轉換的值,cast-name 有以下四種:
static_cast
dynamic_cast
const_cast
reinterpret_cast
接下來,我們逐個進行分析。
1、static_cast
這里先介紹下頂層const和底層const的概念:
(1)頂層const,表示指針本身是常量,例如:
int?*const?p1?=?&i;p1?=?&j;???????//編譯報錯,不能修改p1指向++(*p1); //可以,可以修改p1所指向的值的內容(2)底層const,表示指針所指的對象是一個常量,例如:
const?int?*p2?=?&i;p2?=?&j;???????//可以,可以修改p2的指向++(*p2); //編譯報錯,不能修改p2所指向的值的內容那么再來說說static_cast:任何具有明確定義的類型轉換,除了不包含底層const,都可以使用 static_cast。例如:
double?d?=?0.1;void*?p?=?&d;?double *dp = static_cast<double*>(p);static_cast本質上是傳統c語言強制轉換的替代品。
通常,該操作符用于非多態類型的轉換,任何標準轉換都可以使用它。
2、dynamic_cast
用于將基類指針或引用安全的轉換成派生類的指針或引用(運行時類型識別)。
dynamic_cast運算符的使用形式如下:
dynamic_cast(e)dynamic_cast(e)dynamic_cast(e)其中,type必須是一個類類型,并且通常情況下該類型應該含有虛函數,在第一種形式中,e必須是有效指針;在第二種形式中,e必須是一個左值,在第三種形式中,e不能是左值。
如果轉換目標是指針并且轉換失敗,則結果是0,如果轉換目標是引用并且轉換失敗的,則會拋出異常。
因此,dynamic_cast操作符一次執行兩個操作。首先驗證被請求的轉換是否有效,只有轉換有效,操作符才實際進行轉換。
3、const_cast
只能用于改變運算對象的底層const(去掉const屬性)
例:
const?char?*p1;char* p2 = const_cast<char*>(p1);注意,我們去掉了const屬性,編譯器不會再阻止我們對該對象進行寫操作,但要注意,通過p2寫值是未定義行為。
4、reinterpret_cast
該操作符用于將一種類型轉換為另一種不同的類型,
比如可以把一個指針類型轉換為一個整數,再把整數轉換為指針類型,并且還是原來那個指針。
“通常為運算對象的位模式提供較低層次上的重新解釋“,即是將變量以二進制形式被重新解釋為新的類型,這個操作本質是依賴于機器的,也就是說,還需要考慮移植性。要想安全的使用reinterpret_cast,必須對涉及的類型和編譯器實現轉換的過程都非常了解。
reinterpret_casts 的最普通的用途,就是在函數指針類型之間進行轉換。
簡單總結
基本類型(非多態)的轉換用static_cast。
多態類之間的類型轉換用dynamic_cast。
去掉const屬性用const_cast。
不同類型的指針類型轉換用reinterpreter_cast。(慎用)
- EOF -
推薦閱讀??點擊標題可跳轉1、C++ 初始化的坑,你也遇到過嗎?
2、NVIDIA 開源 C++ 標準庫 Libcu++
3、TIOBE 9月編程語言排行榜發布,C++增速最快,C++20 的功勞?
看完本文有幫助?請分享給更多人
關注「CPP開發者」加星標,提升C/C++技能
點贊和在看就是最大的支持??
總結
以上是生活随笔為你收集整理的const char * 类型的实参与 char * 类型的形参不兼容_4 种 C++ 强制类型转换,你都清楚吗?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓三国杀单机版2021(安卓三国杀单机
- 下一篇: 16进制数组转成10进制 qt_QT 十