當(dāng)前位置:首頁 > IT技術(shù) > 編程語言 > 正文

C++類型轉(zhuǎn)換:const_cast 和reinterpret_cast
2021-12-13 17:48:41

一、Const_cast

const_cast是修改類型的const或者volatile屬性。使用該運(yùn)算方法后可以返回一個(gè)紙箱非常量的指針或者引用,使用該運(yùn)算符后就可以返回一個(gè)紙箱非常量的指針(或者引用)。用法如下:

const_cast<type_if>(expression),type_id和expression的類型是一樣的。

轉(zhuǎn)換為非常量的指針或者引用還是指向原來的對(duì)象,const_cast一般是用來修改底指針。用例如下:

 1 // ConsoleApplication1.cpp : Defines the entry point for the console application.
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <cstdint>
 6 #include<string>
 7 #include<iostream>
 8 using namespace std;
 9 class person
10 {
11 public:
12    int n_num;
13    virtual void doSomething()
14    {
15       cout << "i am a person" << endl;
16    }
17 };
18 class colorPerson :public person
19 {
20 public:
21    char* mName;
22 };
23 void change(person *person)
24 {
25    colorPerson * cp1 = static_cast<colorPerson*>(person);
26    cout << "start to call cp1" << endl;
27    if (cp1 != NULL)
28    {
29       cp1->doSomething();
30    }
31    else 
32    {
33       cout << "cp1 is null" << endl;
34    }
35    colorPerson *cp2 = dynamic_cast<colorPerson*>(person);
36    cout << "start to call cp2" << endl;
37    if (cp2!= NULL)
38    {
39       cp2->doSomething();
40    }
41    else
42    {
43       cout << "cp2 is null" << endl;
44    }
45 }
46 int main()
47 {
48   const person *pconst=new person();
49    //pconst->n_num = 10;
50    person *noConstP = const_cast<person *>(pconst);
51    noConstP->n_num = 100;
52     return 0;
53 }
View Code

const_cast的目的不是為了讓你去修改一個(gè)本身被定義為const的值,因?yàn)檫@樣做的后果是無法預(yù)料的。const_cast的目的是修改一些指針或者引用的權(quán)限,如果我們?cè)瓉頍o法通過這些指針或者引用修改某一些內(nèi)存的值,通過const_cast就可以了。

二、reinterpre_cast

reinterpret_cast操作符是修改了操作數(shù)的類型,重新解釋了給出的對(duì)象的比特模型而沒有進(jìn)行二進(jìn)制的轉(zhuǎn)換??梢岳斫鉃関iew_ashuo或者treat_as的操作。就是把內(nèi)存中的值進(jìn)行重新解釋。在內(nèi)存中都是0和1組成的值。而這些0和1具體代表的是什么值,我們就是要看具體的類型了,比如8位bit的ASCII碼值,16位或者32位的int值。reinterpret_cast復(fù)制二進(jìn)制比特位到目標(biāo)對(duì)象,轉(zhuǎn)換后的值與原始對(duì)象無關(guān)但是比特位是一樣的。

?

本文摘自 :https://www.cnblogs.com/

開通會(huì)員,享受整站包年服務(wù)立即開通 >