C const cast的簡單理解

2021-10-01 14:23:14 字數 2746 閱讀 8899

前言:const_cast是我比較頭疼的乙個知識點,最近查閱了很多資料,也翻看了很多他人的部落格,故在此將自己目前學習到的有關const_cast知識做乙個簡單的總結

簡單來說,const_cast是c++提供的四種顯示型別轉換的方式之一,其主要作用是移除變數的const限定符從而改變表示式的常量屬性

語法:const_cast(expression);
特別注意:(1) const_cast只能改變運算物件的底層const,也就是說:

•常量指標轉化為非常量的指標,並且仍然指向原來的物件

•常量引用轉化為非常量的引用,並且仍然指向原來的物件

1

const

int value=12;2

int new_value=const_cast(value);//錯誤:const_cast只能改變運算物件的底層const,而對頂層const無能為力(編譯資訊:[error] invalid use of const_cast with type 'int', which is not a pointer, reference, nor a pointer-to-data-member type)

34const

int* value_ptr=&value;

5int *ptr=const_cast(value_ptr);//正確:

將常量指標轉化為非常量指標,並仍然指向原來的物件67

const

int& value_re=value;

8int& re=const_cast(value_re);//正確:

將常量引用轉化為非常量引用,並仍然指向原來的物件

(2) 不能用const_cast改變表示式的型別

1

const

char*cp;

2 const_cast(cp); //錯誤:const_cast不能改變表示式型別,只能改變常量屬性

(3)使用const_cast把乙個原本const的變數轉換為非const是乙個非定義行為未定義行為指的是這個語句在標準c++中沒有的規定,由編譯器來決定如何處理

1

const

int value=21;2

const

int* value_ptr=&value;

3int* ptr=const_cast(value); //通過ptr寫值是未定義行為

由上面這個例子可以看出,在c++中對於新增const關鍵字的變數,其就是常量,不必擔心其他機制(如const_cast)會改變其值。而對於未定義行為,應當盡量避免出現這樣的語句

在c++中,用指向非常量的指標來指向常量物件是非法的

const

int value=21

;int* ptr=&value;//

錯誤: invalid conversion from 'const int*' to 'int*'

同樣,用對非常量的引用繫結常量物件是非法的

1

const

int value=3;2

int &new_value=value; //錯誤:invalid initialization of reference of type 'int&' from expression of type 'const int'

但另一方面,在c++程式設計過程中可能會出現某些變數原本不是const物件,但由於某些特殊的原因,在程式設計者不經意的情況下將其轉換為了const物件,從而引發以上的錯誤,此時就需要cosnt_cast來消除const的影響例如:1.乙個函式的引數不是const物件,並且程式設計者事先已經知道在這個函式中不會對引數進行修改,但需要傳遞的實參卻是已經定義好的const物件。為了成功呼叫這個函式,就需要利用到const_cast在實參傳遞前對其進行處理,從而使函式能夠成功接收這個實參

1 #include2

using

namespace

std;

3void function(int *val)

6int

main()

2.如果我們定義了乙個非const的變數,卻使用了乙個指向const物件的指標來指向它,而在程式的某處希望改變這個變數時發現只有指標可用,此時就可以const_cast進行處理

C const cast 使用上的簡單總結

const cast是一種c 運算子,主要是用來去除復合型別中const和volatile屬性 沒有真正去除 變數本身的const屬性是不能去除的,要想修改變數的值,一般是去除指標 或引用 的const屬性,再進行間接修改。include include using namespace std in...

「!」的簡單理解

今天看了乙個 有這樣一句 plisthead plisthead,ptobedeleted if plisthead ptobedeleted 之前一直不理解,這個!指標的模式表示的是指標沒有初始化,還是指標為空。於是我做了乙個兩個實驗,如下 int p if p 這個是沒有初始化的指標,結果直接顯...

反射的簡單理解

載入類 3個方式 person有2個屬性,name和age,最後會給出person類的資訊 class clazz1 class.forname person class clazz2 person.class person p new person class clazz3 p.getclass ...