const_cast用法
顶层const&底层const:
普通变量没有底层顶层的区别;
int const a == const int a
只有对应指针,引用才会有区别:指针常量->顶层const,指针本身不可被修改。
int * const b = &a,a既可以通过a = x来改变,也可以通过*b = x来改变,但不可以把b指向别的地址、别的变量。例如声明
int c = 2;b=c即会报错。
指向常量的指针->底层const,指针本身可修改,但指向的值可修改。
const int* b = &a,a可以通过a = x来改变,但不可以通过*b = x来更改。
可以将b指向别的地址,变量。例如声明int c =2;b = c。
形式上区别二者通过看 * 和const的相对位置,int * const ptr,ptr首先是一个常xx,随后前面的int*修饰了,ptr是一个常指针,并且是一个指向int类型的常指针,常指针即指针常量,即顶层const(本身不可被修改,大概是因为指针比所修饰的对象高一层,所以叫顶层const)。
int const* ptr,首先ptr前面是一个*,则得知ptr是一个指针,前面的int const得知,是一个指向int类型常量的指针,即指向常量的指针,即底层const(指向的对象是常量)。
const_cast:
用来去除变量、表达式的底层const属性。
但要明确const_cast只是C++的一种妥协,当存在某个指向常量的指针(底层cosnt,不允许通过该指针改变其指向的内容),我们需要改变其指向的内容,但缺无法直接获取该变量,这时候使用const_cast可以去掉上述指针的const属性,并将其中地址赋予新指针,这个新指针就可以去更改内容。
如int a = 1;
const int * ptr = a;
int *ptr2 = const_cast<int *>(ptr);//假设a在此处很难获取,即重新定义一个int*指针,来接受ptr中除了const属性之外的东西。
*ptr2 = 2;
这时输出a,即等于2。
这时候如果a是 const int a = 1;那么上述代码就会出错,因为尝试修改常量。
其实也可以用来改变顶层,不过是没有意义的行为:
int b = 1, c = 22;
int* const d = &b;//top const
int* p2 = const_cast<int *>(d);
p2 = &c;
cout << "d: " << *d<<" p2: "<<*p2;
实际上d所指向的内容是不会变的,你只是重新定义了一个int*指针,并用d保存的地址来初始化它,除此之外没有意义。
————————————————
原文链接:https://blog.csdn.net/JosephXQ/article/details/80734567