日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )

發布時間:2025/6/17 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 char* str_const = "Hello";
  • ② 將常量轉為變量 : 格式為 " const_cast < 要轉換的目標類型 > ( 常量或變量名稱 ) " ;
char* str = const_cast<char*> (str_const);
  • ③ 完整代碼示例 :
//新式轉換 : //轉換操作符 : //const_cast : 主要用來修改類型的 const 與 volatile 屬性 , // 將不可修改屬性 const 轉為 可修改的屬性// volatile 屬性作用 : 保證獲取一個變量值時 , 重新從內存讀取該屬性 ; //將 const char* 類型變量 轉為 char* 類型的變量 // 可以理解成將常量轉為變量 , 這里也可以將變量轉為常量const char* str_const = "Hello";char* str = const_cast<char*> (str_const);

此處將 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 類型 , 那么其調用的方法就是父類的方法 ;

  • ③ 代碼示例 :

Parent* parent = new Parent();Child* child = static_cast<Child*>(parent);//調用子類 Child 的 function 方法// 這里的 function 方法時普通方法 , 其聲明的是什么類型的變量 , // 那么調用的就是哪個類的方法 , 該對象聲明的是 Child 對象 , // 那么調用的就是 子類的方法child->function();//調用父類 Parent 的 function 方法// 同理 , parent 對象聲明為 Parent 類型 , // 那么其調用的方法就是父類的方法parent->function();
  • ④ 執行結果 :
子類方法父類方法

6. 分別調用子類和父類的虛函數 : 虛函數方法調用子類還是父類的 , 是運行時決定的 , parent 對象使用 new Parent() 進行創建 , 那么無論何時 , 其虛函數都是調用父類的方法 ;

  • ① 代碼示例 :
Parent* parent = new Parent();Child* child = static_cast<Child*>(parent);//這里測試調用子類和父類虛函數方法 , // 與上面的結果不同 , 虛函數方法調用子類還是父類的 , 是運行時決定的 , // parent 對象使用 new Parent() 進行創建 , // 那么無論何時 , 其虛函數都是調用父類的方法 ; // 即使將其類型轉為 Child 類型 , 其實際運行時的類型還是 Parent 類型// 調用的虛函數方法始終是父類的方法 ; parent->function_viurtual();child->function_viurtual();
  • ② 執行結果 :
父類虛函數父類虛函數

即使將其類型轉為 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 轉換操作符轉換失敗示例 :

  • ① 代碼示例 :
//定義父類對象 , 然后將父類對象強轉為子類對象Parent* parent1 = new Parent();Child* child1 = dynamic_cast<Child*>(parent1);//根據轉換結果打印不同的信息if (!child1) {//如果 child1 變量是 0 , 說明其轉換結果為 null , !child1 結果大于 0 cout << " 父類 Parent 指針變量 轉為 子類 Child 指針變量 轉換失敗 " << endl;}else {//轉換結果不為 nullchild1->function_viurtual();}
  • ② 執行結果 :
父類 Parent 指針變量 轉為 子類 Child 指針變量 轉換失敗

4. 轉換成功的情況 : 轉換成功的前提是 , 子類可以轉成父類 , 但是父類不能轉換成子類 ; 開始時要創建子類對象 , 將其賦值給父類變量 , 之后還可以將該變量再次轉為子類對象 , 反之則不可行 , 轉換會失敗 ;

  • ① 代碼示例 :
//定義子類對象 , 然后將父類對象強轉為子類對象Parent* parent2 = new Child();Child* child2 = dynamic_cast<Child*>(parent2);//根據轉換結果打印不同的信息if (!child2) {//如果 child1 變量是 0 , 說明其轉換結果為 null , !child1 結果大于 0 cout << " 父類 Parent 指針變量 轉為 子類 Child 指針變量 轉換失敗 " << endl;}else {//轉換結果不為 nullchild2->function_viurtual();}
  • ② 執行結果 :
子類虛函數

IV . reinterpret_cast 轉換操作符



reinterpret_cast 轉換操作符作用 : 對指針變量 , 引用變量進行原始的轉換 , 即將地址值轉成對應的類型 ;

  • ① 代碼示例 :
// 4. reinterpret_cast 轉換操作符//作用 : 對指針變量 , 引用變量進行原始的轉換 ; char* hello = "Hello";//獲取 hello 字符串地址 , 將其轉為 int 類型int hello_address = reinterpret_cast<int> (&hello);//打印 hello 的地址 , 并以 16 進制形式打印出來cout << hex << &hello << endl;//打印 hello_address , 并以 16 進制形式打印出來cout << hex << hello_address << endl;
  • ② 執行結果 :
000000B6B62FE898 b62fe898

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* 轉換代碼示例 :

  • ① 代碼示例 :
// 5. char* 與 int 進行轉換//將字符串轉為 int 類型變量int int_var = atoi("88888");//將字符串轉為浮點型變量float float_var = atof("88.88f");//打印轉換結果 : 注意要輸出 十進制數cout << "int_var : " << dec << int_var << " float_var : " << float_var << endl;//int 類型 轉為字符串char c[10];itoa(888, c, 10);//打印轉換后的字符串cout << c << endl;char c1[10];sprintf(c1, "%d", 8888);//打印轉換后的字符串cout << c1 << endl;
  • ② 執行結果 :
int_var : 88888 float_var : 88.88 888 8888

VI . 類型轉換代碼示例



1. 代碼示例 :

  • ① 父類子類定義 :
//定義父類 , 其中定義共有虛函數 // 虛函數主要是能根據實際類型調用對應方法 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;} };
  • ② 函數調用 :
// IX . 類型轉換//新式轉換 : // 1. const_cast 轉換操作符 ://const_cast : 主要用來修改類型的 const 與 volatile 屬性 , // 將不可修改屬性 const 轉為 可修改的屬性// volatile 屬性作用 : 保證獲取一個變量值時 , 重新從內存讀取該屬性 ; //將 const char* 類型變量 轉為 char* 類型的變量 // 可以理解成將常量轉為變量 , 這里也可以將變量轉為常量const char* str_const = "Hello";char* str = const_cast<char*> (str_const);// 2. static_cast 轉換操作符 //定義父類對象 , 然后將父類對象強轉為子類對象Parent* parent = new Parent();Child* child = static_cast<Child*>(parent);//調用子類 Child 的 function 方法// 這里的 function 方法時普通方法 , 其聲明的是什么類型的變量 , // 那么調用的就是哪個類的方法 , 該對象聲明的是 Child 對象 , // 那么調用的就是 子類的方法child->function();//調用父類 Parent 的 function 方法// 同理 , parent 對象聲明為 Parent 類型 , // 那么其調用的方法就是父類的方法parent->function();//這里測試調用子類和父類虛函數方法 , // 與上面的結果不同 , 虛函數方法調用子類還是父類的 , 是運行時決定的 , // parent 對象使用 new Parent() 進行創建 , // 那么無論何時 , 其虛函數都是調用父類的方法 ; // 即使將其類型轉為 Child 類型 , 其實際運行時的類型還是 Parent 類型// 調用的虛函數方法始終是父類的方法 ; parent->function_viurtual();child->function_viurtual();// 3. dynamic_cast 轉換操作符//定義父類對象 , 然后將父類對象強轉為子類對象Parent* parent1 = new Parent();Child* child1 = dynamic_cast<Child*>(parent1);//根據轉換結果打印不同的信息if (!child1) {//如果 child1 變量是 0 , 說明其轉換結果為 null , !child1 結果大于 0 cout << " 父類 Parent 指針變量 轉為 子類 Child 指針變量 轉換失敗 " << endl;}else {//轉換結果不為 nullchild1->function_viurtual();}//定義子類對象 , 然后將父類對象強轉為子類對象Parent* parent2 = new Child();Child* child2 = dynamic_cast<Child*>(parent2);//根據轉換結果打印不同的信息if (!child2) {//如果 child1 變量是 0 , 說明其轉換結果為 null , !child1 結果大于 0 cout << " 父類 Parent 指針變量 轉為 子類 Child 指針變量 轉換失敗 " << endl;}else {//轉換結果不為 nullchild2->function_viurtual();}// 4. reinterpret_cast 轉換操作符//作用 : 對指針變量 , 引用變量進行原始的轉換 ; char* hello = "Hello";//獲取 hello 字符串地址 , 將其轉為 int 類型int hello_address = reinterpret_cast<int> (&hello);//打印 hello 的地址 , 并以 16 進制形式打印出來cout << hex << &hello << endl;//打印 hello_address , 并以 16 進制形式打印出來cout << hex << hello_address << endl;// 5. char* 與 int 進行轉換//將字符串轉為 int 類型變量int int_var = atoi("88888");//將字符串轉為浮點型變量float float_var = atof("88.88f");//打印轉換結果 : 注意要輸出 十進制數cout << "int_var : " << dec << int_var << " float_var : " << float_var << endl;//int 類型 轉為字符串char c[10];itoa(888, c, 10);//打印轉換后的字符串cout << c << endl;char c1[10];sprintf(c1, "%d", 8888);//打印轉換后的字符串cout << c1 << endl;

2. 執行結果 :

子類方法父類方法父類虛函數父類虛函數父類 Parent 指針變量 轉為 子類 Child 指針變量 轉換失敗子類虛函數 00000033C8AFE698 c8afe698 int_var : 88888 float_var : 88.88 888 8888

總結

以上是生活随笔為你收集整理的【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。