【C++】 类型转换
生活随笔
收集整理的這篇文章主要介紹了
【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
- 屬于比較底層的強制轉換,沒有任何類型檢查和格式轉換,僅僅是簡單的二進制數據拷貝。
如果使用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++】 类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】运算符重载 Operator
- 下一篇: 【C++】异常 Exception