c++中的const_cast用法大全
const_cast是一種C++運(yùn)算符,主要是用來去除復(fù)合類型中const和volatile屬性(沒有真正去除)。
const_cast:作用:
指針或引用的轉(zhuǎn)換符,用來移除變量的const或volatile限定符。
先來看c中不嚴(yán)謹(jǐn)?shù)牡胤剑?/p>
const int ca = 30;
int* q = &ca;//C中是可以編譯的,最多會得到一個warning,隨后就可以對ca里的數(shù)據(jù)進(jìn)行操作了。
疑問:那const幾乎是失效的。
在c++編譯中就會報錯:
error: invalid conversion from ‘const int*' to ‘int*' [-fpermissive]//無效的轉(zhuǎn)換,把const int交給int.從這個提示,也可看出針對的是指針。int* q = &ca;
const_cast應(yīng)用場景?? 不具實際意義的用法:
const int ca=30; const int* p=&ca; int* q=const_cast<int*>p; *q=10;//打印一下ca/p/q的地址可以看到地址是一樣的,但ca的值仍是30,其他兩個值都變?yōu)榱?0
雖然沒有實際應(yīng)用的意義,但可以看到const_case的意義,確實如c一樣,可以將地址給另外一個指針,同時修改另外指針?biāo)缚臻g里面值,確實是可以修改里面的值。但原const聲明的變量的值也沒有變。指向地址是一個地址,但值確有兩種,是不是不太對呢???如何來正確理解呢?
當(dāng)使用const聲明一個常量時,在C++中,就是作為一個常量寫到ROM(單片機(jī)里面的概念,對于PC來說,可以理解為寫到了磁盤中),并且這個ROM地址映射到內(nèi)存,指向的地址不變。
當(dāng)使用const_cast,去除掉const限定后,將地址賦給另外的變量指針,改變變量指針的值,確實是改變了內(nèi)存地址中存的數(shù)據(jù),但并沒有改變在外存中的數(shù)據(jù)。所以此時讀取變量指針的值,其實是取的內(nèi)存中的數(shù)據(jù),看到的就是改變的值。
const_cast實際編程應(yīng)用:
需要使用const聲明的常量的值,尤其是調(diào)用了一個參數(shù)不是const的函數(shù),而我們要傳進(jìn)去的實際參數(shù)確實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; }
擴(kuò)展:
其他三種指針轉(zhuǎn)換運(yùn)算符:
static_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
dynamic_cast <new_type> (expression)//以后遇到再說吧,先放到這里作下對比!
到此這篇關(guān)于c++中的const_cast用法大全的文章就介紹到這了,更多相關(guān)c++ const_cast用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++學(xué)習(xí)之算術(shù)運(yùn)算符使用詳解
運(yùn)算符是計算機(jī)語言提供的能對數(shù)據(jù)進(jìn)行基本運(yùn)算操作的功能體。而算術(shù)運(yùn)算符用來對數(shù)字型數(shù)據(jù)進(jìn)行數(shù)學(xué)語義上的加、減、乘、除。本文通過講解清楚算術(shù)運(yùn)算符,讓大家了解使用C++運(yùn)算符時應(yīng)該注意的事項2022-06-06淺析C++標(biāo)準(zhǔn)庫元組(tuple)源碼
這篇文章主要介紹了C++標(biāo)準(zhǔn)庫元組(tuple)源碼,介紹了什么是元組以及用法,并進(jìn)行了源碼分析,需要的朋友可以參考下2015-08-08C++詳細(xì)講解內(nèi)存管理工具primitives
文章向大家介紹C++內(nèi)存管理primitives,主要包括primitives使用實例、應(yīng)用技巧、基本知識點總結(jié)和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下2022-06-06