1. 程式人生 > >const指標強轉為非const指標後的賦值問題

const指標強轉為非const指標後的賦值問題

這個 其實 很簡單,你p是const指標,指向的那塊記憶體區域的值是不可改變的,現在將p賦給p_var,p_var是非const指標,也就是說p_var指向的那塊記憶體區域的值是可改變的,a是個常量,其值肯定是不會變的。如果沒有const_cast編譯是不能通過的,那先看看const_cast到底做了什麼

const_cast<T*>(a)
編譯器在編譯期處理
去掉型別中的常量,除了const或不穩定的變址數,T和a必須是相同的型別。
表示式const_cast<T*>(a)被用於從一個類中去除以下這些屬性:const, volatile, 和 __unaligned。
class A { ... };
void f()
{
    const A *pa = new A;//const物件
    A *pb;//非const物件
    //pb = pa; // 這裡將出錯,不能將const物件指標賦值給非const物件
    pb = const_cast<A*>(pa); // 現在OK了
    ...
}
對於本身定義時為const的型別,即使你去掉const性,在你操作這片內容時候也要小心,只能r不能w操作,否則還是會出錯
const char* p = "123"; 
char* c = const_cast<char*>(p); 
c[0] = 1;   //表面上通過編譯去掉了const性,但是操作其地址時系統依然不允許這麼做。
const_cast操作不能在不同的種類間轉換。相反,它僅僅把一個它作用的表示式轉換成常量。它可以使一個本來不是const型別的資料轉換成const型別的,或者把const屬性去掉。

現在應該明白了吧。強制轉換把p的const屬性去掉了,又因為p和p_var又指向新的同一塊記憶體區域,就是文字常量10所在的記憶體區域,所以*p和*p_var的值都是10.
儘量不要使用const_cast,如果發現呼叫自己的函式,竟然使用了const_cast,那就趕緊打住,重新考慮一下設計吧。