中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++中的const_cast用法總結

發布時間:2021-07-29 13:41:25 來源:億速云 閱讀:272 作者:chen 欄目:開發技術

本篇內容介紹了“c++中的const_cast用法總結”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

const_cast是一種C++運算符,主要是用來去除復合類型中const和volatile屬性(沒有真正去除)。

const_cast:作用:

指針或引用的轉換符,用來移除變量的const或volatile限定符。

先來看c中不嚴謹的地方:

const int ca = 30;
 int* q = &ca;//C中是可以編譯的,最多會得到一個warning,隨后就可以對ca里的數據進行操作了。
疑問:那const幾乎是失效的。

在c++編譯中就會報錯:

error: invalid conversion from ‘const int*' to ‘int*' [-fpermissive]//無效的轉換,把const int交給int.從這個提示,也可看出針對的是指針。int* q = &ca;

const_cast應用場景?? 不具實際意義的用法:

const int ca=30;
const int* p=&ca;
int* q=const_cast<int*>p;
*q=10;//打印一下ca/p/q的地址可以看到地址是一樣的,但ca的值仍是30,其他兩個值都變為了10

雖然沒有實際應用的意義,但可以看到const_case的意義,確實如c一樣,可以將地址給另外一個指針,同時修改另外指針所指空間里面值,確實是可以修改里面的值。但原const聲明的變量的值也沒有變。指向地址是一個地址,但值確有兩種,是不是不太對呢???如何來正確理解呢?

當使用const聲明一個常量時,在C++中,就是作為一個常量寫到ROM(單片機里面的概念,對于PC來說,可以理解為寫到了磁盤中),并且這個ROM地址映射到內存,指向的地址不變。

當使用const_cast,去除掉const限定后,將地址賦給另外的變量指針,改變變量指針的值,確實是改變了內存地址中存的數據,但并沒有改變在外存中的數據。所以此時讀取變量指針的值,其實是取的內存中的數據,看到的就是改變的值。

const_cast實際編程應用:

需要使用const聲明的常量的值,尤其是調用了一個參數不是const的函數,而我們要傳進去的實際參數確實const的情形。
使用帶const指針指向一個變量時,需要修改變量的值。如下代碼:

int a = 10;
const int* p = &a;
int* q=const_cast<int*>p;
*q=24;//可以得到a,q,p都指向同一地址,同時值也被同時修改了。

整體測試代碼如下:

#include <iostream>
using namespace std;
int main(int argc, const char** argv) {
    int a = 10;
    const int* p = &a;  
    const int ca = 30;
    int* q;
    
    cout << "a adress is:\t" << &a << "\ta is:\t" << a << endl;
    cout << "p adress is \t" << p << "\t*p is \t" << *p << endl;
    q = const_cast<int*>(p);
    *q = 24;
    cout << "a adress is:\t" << &a << "\ta is:\t" << a << endl;
    cout << "p adress is \t" << p << "\t*p is \t" << *p << endl;
    cout << "q adress is \t" << q << "\t *q is\t" << *q << endl;
    cout << "=======================" << endl;
    p = &ca;
    q = const_cast<int*>(p);
    *q = 50;   
    cout << "ca adress is:\t" << &ca << "\tca is:\t" << ca << endl; 
    cout << "p adress is \t" << p << "\t*p is \t" << *p << endl;
    cout << "q adress is \t" << q << "\t *q is\t" << *q << endl;
    return 0;
}

擴展:

其他三種指針轉換運算符:

static_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
dynamic_cast <new_type> (expression)//以后遇到再說吧,先放到這里作下對比!

“c++中的const_cast用法總結”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南岸区| 海盐县| 昭苏县| 黔西| 乐都县| 防城港市| 海阳市| 赣榆县| 措美县| 阿鲁科尔沁旗| 游戏| 奉贤区| 辉县市| 宁明县| 绵阳市| 当雄县| 榆林市| 万荣县| 玉环县| 双鸭山市| 开封县| 长丰县| 扎赉特旗| 定远县| 房山区| 霍林郭勒市| 宁夏| 班玛县| 台江县| 池州市| 阿拉尔市| 漯河市| 密山市| 綦江县| 承德市| 合水县| 启东市| 四会市| 拉孜县| 朝阳区| 华安县|