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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

【C++】 类型转换

發布時間:2024/9/15 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】 类型转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

類型轉換

(type) expression / type (expression)

  • C++中有四個類型轉換符

    • static_cast
    • dynamic_cast
    • reinterpret_cast
    • const_cast
  • 使用格式:xx_cast <type> (expression)

    比如:

    int a = 10; double d = static_cast<double> (a);

const_cast

  • 一般用于去除const屬性,將const轉換成非const

    const Person *p1 = new Person(); // const對象不能給別的對象賦值 // 如果要將p1賦值給p2 Person *p2 = const_cast<Person *>(p1); // 騙一下編譯器,讓編譯器以為p1是非const // 結果p2和p1是一樣的

    但也可以這樣做

    Person *p3 = (Person *) p1;

    那p2和p3的做本質上有區別嗎?

    看匯編沒有區別,只是p2是C++騙法,p3是C語言騙法。

    p3看起來比較簡潔

Dynamic_cast

  • 一般用于多態類型的轉換,有運行時安全檢測

    class Person {} class Student: public Person {}int main() {Person *p1 = new Person();Person *p2 = new Student();cout << "p1 = " << p1 << endl; // 打印p1地址值cout << "p2 = " << p2 << endl; // 打印p2地址值Student *stu1 = dynamic_cast<Student *>(p1); // 并不安全,相當于子類對象指向父類對象Student *stu2 = dynamic_cast<Student *>(p2); // 安全cout << "stu1 = " << stu1 << endl; // 打印stu1地址值cout << "stu2 = " << stu2 << endl; // 打印stu2地址值return 0; }

stu2是安全的賦值,所以stu2和p2的地址是一樣的

但stu1是不安全的賦值,所以stu1的地址為空,相當于NULL

因為dynamic_cast檢測到這是不安全的賦值。

  • 如果使用C語言的賦值方法

    Student *stu1 = (Student *)p1; Student *stu2 = (Student *)p2;


就沒有安全檢測,直接賦值。

reinterpret_cast

  • 屬于比較底層的強制轉換,沒有任何類型檢查和格式轉換,僅僅是簡單的二進制數據拷貝。
// 0000 1010 0000 0000 0000 0000 0000 0000 小端模式 // 0A 00 00 00 int a = 10; // 相當于: // 0000 0000 0000 0000 0000 0000 0000 1010 = 10// double d 并不是 0A 00 00 00 00 00 00 00 // 而是 00 00 00 00 00 00 24 40 // 浮點數存儲模式 // double和int存儲的模式是不一樣的 double d = a;cout << "a = " << a << endl; cout << "b = " << b << endl;

如果使用reinterpret_cast,就把int a的二進制數據直接拷貝到double d中

double d本身是8字節數據,初始化全是cc(cc cc cc cc cc cc cc cc)

double d = reinterpret_cast<double&>(a); // 這里要加引用(語法糖)

double d : 0A 00 00 00 CC CC CC CC

  • 可以交叉轉換
  • 可以將指針和整數互相轉換

總結

以上是生活随笔為你收集整理的【C++】 类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。

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