您当前的位置: 首页 >  c++

惊鸿一博

暂无认证

  • 2浏览

    0关注

    535博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

c++_如何将一个const变量转成非const变量_const_cast

惊鸿一博 发布时间:2021-05-23 08:36:05 ,浏览量:2

目录

C++提供了四个转换运算符

const_cast (expression)

用const_cast来去除const限定

传统转换方式实现const_cast运算符

为何要去除const限定

前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述。C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymorphism)”。

要想很好的使用多态性,就免不了要使用指针和引用,也免不了会碰到转换的问题,所以在这一篇,就把导师讲的以及在网上反复查阅了解的知识总结一下。

C++提供了四个转换运算符
  • const_cast (expression)
  • static_cast (expression)
  • reinterpret_cast (expression)
  • dynamic_cast (expression)

它们有着相同的结构,看起来像是模板方法。这些方法就是提供给开发者用来进行指针和引用的转换的。

其实我很早就想写这篇内容的,自己不断地查看导师发来的资料,也在网上不停地看相关的知识,却一直迟迟不能完全理解C++转换运算符的用法,倒是看了那些资料后先写了一篇传统转换方面的内容。虽然从字面上很好理解它们大致是什么作用,但是真正像使用起来,却用不知道他们具体的用途,只会不断的被编译器提醒Error。所以如果出现理解不到位或错误的地方,还希望前人或来者能够指正。

在我看来这些标准运算符的作用就是对传统运算符的代替,以便做到统一。就像我们用std::endl来输出换行,而不是'\n'。我会用代码来说明相应的传统转换可以如何这些标准运算符。当然,这这是大致的理解,在标准运算符上,编译器肯定有做更多的处理,特别是dynamic_cast是不能用传统转换方式来完全实现的。

在这一篇文章里,我会先讲讲我对const_cast运算符的理解。

const_cast (expression)

const_cast转换符是用来移除变量的const或volatile限定符。对于后者,我不是太清楚,因为它涉及到了多线程的设计,而我在这方面没有什么了解。所以我只来说const方面的内容。

用const_cast来去除const限定

对于const变量,我们不能修改它的值,这是这个限定符最直接的表现。但是我们就是想违背它的限定希望修改其内容怎么办呢?

下边的代码显然是达不到目的的: const int constant = 10; int modifier = constant;

因为对modifier的修改并不会影响到constant,这暗示了一点:const_cast转换符也不该用在对象数据上,因为这样的转换得到的两个变量/对象并没有相关性。

只有用指针或者引用,让变量指向同一个地址才是解决方案,可惜下边的代码在C++中也是编译不过的: const int constant = 21; int* modifier = &constant // Error: invalid conversion from 'const int*' to 'int*'

(上边的代码在C中是可以编译的,最多会得到一个warning,所在在C中上一步就可以开始对constant里面的数据胡作非为了)

把constant交给非const的引用也是不行的。 const int constant = 21; int& modifier = constant; // Error: invalid initialization of reference of type 'int&' from expression of type 'const int'

于是const_cast就出来消灭const,以求引起程序世界的混乱。

下边的代码就顺利编译功过了: const int constant = 21; const int* const_p = &constant; int* modifier = const_cast(const_p); *modifier = 7;

传统转换方式实现const_cast运算符

我说过标:准转换运算符是可以用传统转换方式实现的。const_cast实现原因就在于C++对于指针的转换是任意的,它不会检查类型,任何指针之间都可以进行互相转换,因此const_cast就可以直接使用显示转换(int*)来代替: const int constant = 21; const int* const_p = &constant; int* modifier = (int*)(const_p);

或者我们还可以把他们合成一个语句,跳过中间变量,用 const int constant = 21; int* modifier = (int*)(&constant);

替代 const int constant = 21; int* modifier = const_cast(&constant);

为何要去除const限定

从前面代码中已经看到,我们不能对constant进行修改,但是我们可以对modifier进行重新赋值。

但是但是,程序世界真的混乱了吗?我们真的通过modifier修改了constatn的值了吗?修改const变量的数据真的是C++去const的目的吗?

如果我们把结果打印出来: cout 

关注
打赏
1663399408
查看更多评论
0.0370s