1--const_cast
const_cast 只能改变运算对象的底层 const (指针的指向可以改变,指针指向的值不能修改,类似于指向常量的指针),对于将常量对象转换成非常量对象的行为,一般称其为 “去掉const性质”;
一旦去掉某个对象的 const 性质,编译器就不会阻止对该对象进行写操作;
#include "iostream"
int main(int argc, char* argv[]){
const int a = 30;
const int *p = &a;
int *q = const_cast<int*>(p);
*q = 10;
std::cout << "a: " << a << std::endl;
std::cout << "*p: " << *p << std::endl;
std::cout << "*q: " << *q << std::endl;
std::cout << "&a: " << &a << std::endl;
std::cout << "p: " << p << std::endl;
std::cout << "q: " << q << std::endl;
return 0;
}
当使用 const 声明一个常量时,在 C++ 中会把这个常量写到 ROM(磁盘)中,并且这个 ROM 地址会映射到内存,指向的地址不变。
当使用 const_cast 去掉 const 限定后,将地址赋给另外的变量指针;当改变变量指针的值时,实际上是改变了内存地址中存的数据,但并没有改变在外存(磁盘)中的数据。因此当读取变量指针的值时,其实是取内存中的数据,当使用原常量名时取的是外存中的数据;
#include "iostream"
int main(int argc, char* argv[]){
int a = 30;
const int *p = &a;
int *q = const_cast<int*>(p);
*q = 10;
std::cout << "a: " << a << std::endl;
std::cout << "*p: " << *p << std::endl;
std::cout << "*q: " << *q << std::endl;
std::cout << "&a: " << &a << std::endl;
std::cout << "p: " << p << std::endl;
std::cout << "q: " << q << std::endl;
return 0;
}
上面两个代码的执行结果表明:
① 在C++中常量的确不能被修改,例如第一个例子中的 a;
② 当使用一个常量指针(const int *p)指向一个非常量值 (a) 时,不能通过解引用 (*p) 来修改这个值,但可以利用 const_cast 来去除 const 限定,通过新指针的解引用 (*q) 来修改这个非常量值;