【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )
文章目錄
- I . const_cast 轉換操作符
- II . static_cast 轉換操作符
- III . dynamic_cast 轉換操作符
- IV . reinterpret_cast 轉換操作符
- V . int 與 char* 轉換
- VI . 類型轉換代碼示例
I . const_cast 轉換操作符
1. 類型轉換方式 : ① C 語言中的強制類型轉換 , ② 使用轉換操作符進行轉換 ;
2. const_cast 轉換操作符 : 主要用來修改類型的 const 與 volatile 屬性 ;
- ① const 屬性作用 : 修飾常量 ;
- ② volatile 屬性作用 : 保證獲取一個變量值時 , 重新從內存讀取該屬性 ;
3. const 屬性轉換 : 使用 const_cast 轉換 const 屬性 , 就是將常量類型轉為變量類型 , 或者將變量類型轉為常量類型 ;
4. const_cast 轉換操作符代碼示例 :
- ① 聲明一個常量類型 : 聲明一個字符串常量 ;
- ② 將常量轉為變量 : 格式為 " const_cast < 要轉換的目標類型 > ( 常量或變量名稱 ) " ;
- ③ 完整代碼示例 :
此處將 const char* 類型變量 轉為 char* 類型的變量 , 可以理解成將常量轉為變量 , 這里也可以將變量轉為常量 ;
II . static_cast 轉換操作符
1. static_cast 轉換操作符 : 有以下作用 ;
- ① 基礎類型轉換 : int 與 float 之間進行轉換 等 ;
- ② 指針類型轉換 : void* 與 指針類型之間轉換 , 如 void* 與 int* 之間轉換 ;
- ③ 子類與父類之間轉換 : 子類指針與父類指針之間的轉換 , 子類引用與父類引用之間的轉換 ;
2. 定義子類與父類 : 其中父類中定義兩個函數 , 分別是普通函數和虛函數 , 子類重寫這兩個函數 ;
//定義父類 , 其中定義共有虛函數 // 虛函數主要是能根據實際類型調用對應方法 class Parent { public:void function() {cout << " 父類方法 " << endl;}virtual void function_viurtual() {cout << " 父類虛函數 " << endl;} };//定義子類 , 共有繼承父類 , // 將父類的方法和屬性都轉為 public class Child : public Parent { public :void function() {cout << " 子類方法 " << endl;}void function_viurtual() {cout << " 子類虛函數 " << endl;} };子類重寫的普通函數與虛函數區別 :
- 普通函數 : 編譯時確定調用子類的方法還是父類的方法 , 根據聲明確定調用誰的方法 , 類型聲明成子類 , 就調用子類的方法 , 類型聲明成父類 , 就調用父類的方法 ;
- 虛函數 : 運行時確定調用的是子類的方法還是父類的方法 , 運行時調用哪個類的構造方法 , 該對象就是什么類型的 , 其調用對應類型的虛函數或虛函數實現 ;
3. 創建父類指針變量 :
Parent* parent = new Parent();4. 將父類指針變量轉為子類指針 :
Child* child = static_cast<Child*>(parent);5. 分別調用子類和父類的普通函數 : 該函數調用父類還是子類的在編譯時確定 ;
-
① " child->function() " 討論 : 調用子類 Child 的 function 方法 , 這里的 function 方法時普通方法 , 其聲明的是什么類型的變量 , 那么調用的就是哪個類的方法 , 該對象聲明的是 Child 對象 , 那么調用的就是 子類的方法 ;
-
② " parent->function() " 討論 : 調用父類 Parent 的 function 方法 , 同理 , parent 對象聲明為 Parent 類型 , 那么其調用的方法就是父類的方法 ;
-
③ 代碼示例 :
- ④ 執行結果 :
6. 分別調用子類和父類的虛函數 : 虛函數方法調用子類還是父類的 , 是運行時決定的 , parent 對象使用 new Parent() 進行創建 , 那么無論何時 , 其虛函數都是調用父類的方法 ;
- ① 代碼示例 :
- ② 執行結果 :
即使將其類型轉為 Child 類型 , 其實際運行時的類型還是 Parent 類型 , 調用的虛函數方法始終是父類的方法 ;
III . dynamic_cast 轉換操作符
1. dynamic_cast 轉換操作符簡介 :
- ① 轉換對象 : 該轉換只對多態的情況下有效 , 主要是將父類轉為子類或子類轉成父類 ;
- ② 作用 : 將父類 指針類型 變量轉為子類 指針類型 變量 , 將父類 引用類型 變量轉為子類 引用類型 變量 ;
- ③ 安全性 : 這個動態轉換操作是安全的 , 在運行期間對類型轉換操作進行安全檢查 ;
安全檢查內容 1 : 使用 dynamic_cast 轉換操作符, 進行父類與子類強制轉換時 , 父類必須有一個虛函數 , 否則代碼編寫的時候就會報錯 ( 運行時 dynamic_cast 的操作數必須包含多態類型 ) ; 下圖是刪除父類的虛函數后 , IDE 開發環境提示出的錯誤 ;
2. 安全檢查內容 2 : 類型不符合轉換要求 ( 主要是將父類轉為子類或子類轉成父類 ) , 會轉換失敗 , 返回 null ;
- ① 報錯行為 : 在父類中定義虛函數 , 在編寫代碼時沒有報錯 , 但是在運行時報錯 ( 引發了異常 : 讀取訪問權限沖突 ) ;
- ② 轉換失敗 : 這是因為創建的 parent1 對象是 Parent 父類類型的 , 將 Parent 類型動態強轉成 Child 類型 , 該操作會轉換失敗 , 其轉換結果是 null ;
- ② 調用空對象方法 : 此時 child1 指針變量為 null , 調用 null 變量的方法 , 就會拋出上述異常 ;
3. dynamic_cast 轉換操作符轉換失敗示例 :
- ① 代碼示例 :
- ② 執行結果 :
4. 轉換成功的情況 : 轉換成功的前提是 , 子類可以轉成父類 , 但是父類不能轉換成子類 ; 開始時要創建子類對象 , 將其賦值給父類變量 , 之后還可以將該變量再次轉為子類對象 , 反之則不可行 , 轉換會失敗 ;
- ① 代碼示例 :
- ② 執行結果 :
IV . reinterpret_cast 轉換操作符
reinterpret_cast 轉換操作符作用 : 對指針變量 , 引用變量進行原始的轉換 , 即將地址值轉成對應的類型 ;
- ① 代碼示例 :
- ② 執行結果 :
V . int 與 char* 轉換
1. char* 轉 int : 字符串變量轉成整型變量 , 調用 C 函數 atoi(char*) 函數可以將字符串變量轉成 int 類型變量 ;
2. char* 轉 float : 字符串變量轉成浮點型變量 , 調用 atof(char*) 函數可以將字符串變量轉成 float 類型變量 ;
3. int 轉 char* 變量 :
- ① 使用 itoa 函數 : 可以將 int 類型變量轉為字符串 ;
- ② 使用 sprintf 函數 : 也可以將 int 類型變量轉為字符串 ;
4. int 與 char* 轉換代碼示例 :
- ① 代碼示例 :
- ② 執行結果 :
VI . 類型轉換代碼示例
1. 代碼示例 :
- ① 父類子類定義 :
- ② 函數調用 :
2. 執行結果 :
子類方法父類方法父類虛函數父類虛函數父類 Parent 指針變量 轉為 子類 Child 指針變量 轉換失敗子類虛函數 00000033C8AFE698 c8afe698 int_var : 88888 float_var : 88.88 888 8888總結
以上是生活随笔為你收集整理的【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++ 语言】容器 ( queue 队
- 下一篇: 【C++ 语言】异常 ( 抛出字符串异