c++中的const_cast用法大全
const_cast是一種C++運(yùn)算符,主要是用來(lái)去除復(fù)合類(lèi)型中const和volatile屬性(沒(méi)有真正去除)。
const_cast:作用:
指針或引用的轉(zhuǎn)換符,用來(lái)移除變量的const或volatile限定符。
先來(lái)看c中不嚴(yán)謹(jǐn)?shù)牡胤剑?/p>
const int ca = 30;
int* q = &ca;//C中是可以編譯的,最多會(huì)得到一個(gè)warning,隨后就可以對(duì)ca里的數(shù)據(jù)進(jìn)行操作了。
疑問(wèn):那const幾乎是失效的。
在c++編譯中就會(huì)報(bào)錯(cuò):
error: invalid conversion from ‘const int*' to ‘int*' [-fpermissive]//無(wú)效的轉(zhuǎn)換,把const int交給int.從這個(gè)提示,也可看出針對(duì)的是指針。int* q = &ca;
const_cast應(yīng)用場(chǎng)景?? 不具實(shí)際意義的用法:
const int ca=30; const int* p=&ca; int* q=const_cast<int*>p; *q=10;//打印一下ca/p/q的地址可以看到地址是一樣的,但ca的值仍是30,其他兩個(gè)值都變?yōu)榱?0
雖然沒(méi)有實(shí)際應(yīng)用的意義,但可以看到const_case的意義,確實(shí)如c一樣,可以將地址給另外一個(gè)指針,同時(shí)修改另外指針?biāo)缚臻g里面值,確實(shí)是可以修改里面的值。但原const聲明的變量的值也沒(méi)有變。指向地址是一個(gè)地址,但值確有兩種,是不是不太對(duì)呢???如何來(lái)正確理解呢?
當(dāng)使用const聲明一個(gè)常量時(shí),在C++中,就是作為一個(gè)常量寫(xiě)到ROM(單片機(jī)里面的概念,對(duì)于PC來(lái)說(shuō),可以理解為寫(xiě)到了磁盤(pán)中),并且這個(gè)ROM地址映射到內(nèi)存,指向的地址不變。
當(dāng)使用const_cast,去除掉const限定后,將地址賦給另外的變量指針,改變變量指針的值,確實(shí)是改變了內(nèi)存地址中存的數(shù)據(jù),但并沒(méi)有改變?cè)谕獯嬷械臄?shù)據(jù)。所以此時(shí)讀取變量指針的值,其實(shí)是取的內(nèi)存中的數(shù)據(jù),看到的就是改變的值。
const_cast實(shí)際編程應(yīng)用:
需要使用const聲明的常量的值,尤其是調(diào)用了一個(gè)參數(shù)不是const的函數(shù),而我們要傳進(jìn)去的實(shí)際參數(shù)確實(shí)const的情形。
使用帶const指針指向一個(gè)變量時(shí),需要修改變量的值。如下代碼:
int a = 10;
const int* p = &a;
int* q=const_cast<int*>p;
*q=24;//可以得到a,q,p都指向同一地址,同時(shí)值也被同時(shí)修改了。
整體測(cè)試代碼如下:
#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;
}
擴(kuò)展:
其他三種指針轉(zhuǎn)換運(yùn)算符:
static_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
dynamic_cast <new_type> (expression)//以后遇到再說(shuō)吧,先放到這里作下對(duì)比!
到此這篇關(guān)于c++中的const_cast用法大全的文章就介紹到這了,更多相關(guān)c++ const_cast用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言深度解剖篇之關(guān)鍵字以及補(bǔ)充內(nèi)容
C語(yǔ)言的關(guān)鍵字共有32個(gè),根據(jù)關(guān)鍵字的作用,可分其為數(shù)據(jù)類(lèi)型關(guān)鍵字、控制語(yǔ)句關(guān)鍵字、存儲(chǔ)類(lèi)型關(guān)鍵字和其它關(guān)鍵字四類(lèi),這篇文章主要給大家介紹了關(guān)于C語(yǔ)言深度解剖篇之關(guān)鍵字以及補(bǔ)充內(nèi)容的相關(guān)資料,需要的朋友可以參考下2022-06-06
C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲(命令行)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言命令行實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
C語(yǔ)言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼,包括memcpy、memmove、memset和memcmp的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
利用Qt實(shí)現(xiàn)FTP服務(wù)器并支持多客戶(hù)端登錄
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)FTP服務(wù)器并支持多客戶(hù)端登錄,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
C語(yǔ)言實(shí)現(xiàn)銀行管理系統(tǒng)(文件操作)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
OpenCV圖像算法實(shí)現(xiàn)圖像切分圖像合并示例
這篇文章主要為大家介紹了python圖像算法OpenCV實(shí)現(xiàn)圖像切分圖像合并操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
C++中SetConsoleCursorPosition()移動(dòng)光標(biāo)函數(shù)的用法大全
這篇文章主要介紹了C++中SetConsoleCursorPosition()移動(dòng)光標(biāo)函數(shù)的用法大全,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
QT+Quick實(shí)現(xiàn)自定義組件的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用QT+Quick實(shí)現(xiàn)自定義組件(按鈕、下拉菜單等),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-11-11

