【C++】 类型转换
生活随笔
收集整理的這篇文章主要介紹了
【C++】 类型转换
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
類型轉(zhuǎn)換
(type) expression / type (expression)
-
C++中有四個(gè)類型轉(zhuǎn)換符
- 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轉(zhuǎn)換成非const
const Person *p1 = new Person(); // const對(duì)象不能給別的對(duì)象賦值 // 如果要將p1賦值給p2 Person *p2 = const_cast<Person *>(p1); // 騙一下編譯器,讓編譯器以為p1是非const // 結(jié)果p2和p1是一樣的但也可以這樣做
Person *p3 = (Person *) p1;那p2和p3的做本質(zhì)上有區(qū)別嗎?
看匯編沒有區(qū)別,只是p2是C++騙法,p3是C語言騙法。
p3看起來比較簡潔
Dynamic_cast
-
一般用于多態(tài)類型的轉(zhuǎn)換,有運(yùn)行時(shí)安全檢測
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); // 并不安全,相當(dāng)于子類對(duì)象指向父類對(duì)象Student *stu2 = dynamic_cast<Student *>(p2); // 安全cout << "stu1 = " << stu1 << endl; // 打印stu1地址值cout << "stu2 = " << stu2 << endl; // 打印stu2地址值return 0; }
stu2是安全的賦值,所以stu2和p2的地址是一樣的
但stu1是不安全的賦值,所以stu1的地址為空,相當(dāng)于NULL
因?yàn)閐ynamic_cast檢測到這是不安全的賦值。
-
如果使用C語言的賦值方法
Student *stu1 = (Student *)p1; Student *stu2 = (Student *)p2;
就沒有安全檢測,直接賦值。
reinterpret_cast
- 屬于比較底層的強(qiáng)制轉(zhuǎn)換,沒有任何類型檢查和格式轉(zhuǎn)換,僅僅是簡單的二進(jìn)制數(shù)據(jù)拷貝。
如果使用reinterpret_cast,就把int a的二進(jìn)制數(shù)據(jù)直接拷貝到double d中
double d本身是8字節(jié)數(shù)據(jù),初始化全是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
- 可以交叉轉(zhuǎn)換
- 可以將指針和整數(shù)互相轉(zhuǎn)換
總結(jié)
以上是生活随笔為你收集整理的【C++】 类型转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】运算符重载 Operator
- 下一篇: 【C++】异常 Exception