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

 

posted @ 2023-06-14 22:21  imxiangzi  阅读(124)  评论(0编辑  收藏  举报