1. 程式人生 > >C++筆記 第十一課 新型的型別轉換---狄泰學院

C++筆記 第十一課 新型的型別轉換---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux

第十一課 新型的型別轉換

1.強制型別轉換
C方式的強制型別轉換
(Type)(Expression)
Type (Expression)—老式型別
在這裡插入圖片描述

11-1 粗暴的型別轉換

#include <stdio.h>
typedef void(PF)(int);
struct Point
{
    int x;
    int y;
};
int main()
{
    int v = 0x12345;
    PF* pf = (PF*)v;
    char c = char(v);
    Point* p = (Point*)v;
    
    pf(5);
    
    printf("p->x = %d\n", p->x);
    printf("p->y = %d\n", p->y);
    return 0;
}
執行結果:
段錯誤

C方式強制型別轉換存在的問題
過於粗暴:任意型別之間都可以進行轉換,編譯器很難判斷其正確性
難於定位:在原始碼中無法快速定位所有使用輕質型別轉換的語句
問題:強制型別轉換在實際工程中是很難完全避免的!如何進行更加安全可靠的轉換
優化C的方法;新式型別轉換

2.新式型別轉換

C++將強制型別轉換分為 4種 不同的型別
強制型別轉換(牢記場合)
static_cast const_cast
dynamic_cast reinterpret_cast
用法:xxx_cast(Expression)

  1. static_cast強制型別轉換
    用於基本型別間的轉換
    不能用於基本型別指標間的轉換
    用於有繼承關係類物件之間的轉換和類指標之間的轉換
  2. const_cast強制型別轉換
    用於去除變數的只讀屬性
    強制轉換的目標型別必須是指標或引用
  3. reinterpret_cast強制型別轉換(重解釋)
    用於指標型別間的強制轉換
    用於整數和指標型別間的強制轉換
  4. dynamic_cast強制型別轉換(用於類指標)
    用於有繼承關係的類指標間的轉換
    用於有交叉關係的類指標間的轉換
    具有型別檢查的功能
    需要虛擬函式的支援

11-2 新式型別轉化初探

#include <stdio.h>
void static_cast_demo()
{
    int i = 0x12345;
    char c = 'c';
    int* pi = &i;
    char* pc = &c;
    
    c = static_cast<char>(i);
   // pc = static_cast<char*>(pi);//Error
}
void const_cast_demo()
{
    const int& j = 1;
    int& k = const_cast<int&>(j);
    
    const int x = 2;
    int& y = const_cast<int&>(x);
    
   // int z = const_cast<int>(x);//Error
    
    k = 5;
    
    printf("k = %d\n", k);
    printf("j = %d\n", j);
    
    y = 8;
    
    printf("x = %d\n", x);
    printf("y = %d\n", y);
    printf("&x = %p\n", &x);
    printf("&y = %p\n", &y);
}
void reinterpret_cast_demo()
{
    int i = 0;
    char c = 'c';
    int* pi = &i;
    char* pc = &c;
    
    pc = reinterpret_cast<char*>(pi);
    pi = reinterpret_cast<int*>(pc);
    pi = reinterpret_cast<int*>(i);
    //c = reinterpret_cast<char>(i); //Error
}
void dynamic_cast_demo()
{
    int i = 0;
    int* pi = &i;
    //char* pc = dynamic_cast<char*>(pi); //Error
}
int main()
{
    static_cast_demo();
    const_cast_demo();
    reinterpret_cast_demo();
    dynamic_cast_demo();
    
    return 0;
}
執行結果
[email protected]
:~/c++$ g++ 11-2.cpp [email protected]:~/c++$ ./a.out k = 5 j = 5 x = 2 y = 8 &x = 0x7ffd82c92188 &y = 0x7ffd82c92188

小結
C方式的強制型別轉換
過於粗暴
潛在的問題不易被發現
不易在程式碼中定位
新式型別轉換以C++關鍵字的方式出現
編譯器能夠幫助檢查潛在的問題
非常方便的在程式碼中定位
支援動態型別識別(dynamic_cast)