c++标准转化函数const_cast

参考博客:https://www.cnblogs.com/QG-whz/p/4513136.html

const_cast是一个基于C语言编程开发的运算方法, 其主要作用是:修改类型的const或volatile属性。使用该运算方法可以返回一个指向非常量的指针(或引用)指向b1,就可以通过该指针(或引用)对它的数据成员任意改变。

用法:

 

 

 

提供该运算符的原因是,有时候可能需要这样一个值,它在大多数时候是常量,而有时又是可以修改的。在这种情况下,可以将这个值声明为const,并在需要修改它的时候,用const_cast。这也可以通过通用类型转换来实现,但通用转换也可能同时改变类型;

 

 

 

由于编译时可能无意间同时改变类型和常量特征,因此使用const_cast运算符更安全。

const_cast不是万能的,它可以修改指向一个值的指针,但修改const值的结果是不确定的。

 

const_cast也是一个强制类型转换操作符。《C++ Primer》中是这样描述它的:

1.将转换掉表达式的const性质。

2.只有使用const_cast才能将const性质性质转化掉。试图使用其他三种形式的强制转换都会导致编译时的错误。(添加const还可以用其他转换符,如static_const

3.除了添加const或删除const特性,使用const_cast符来执行其他任何类型的转换都会引起编译错误。

 

看来C++还是很厚道的,对声明为const的变量来说,常量就是常量,任你各种转化,常量的值就是不会变。这是C++的一个承诺。

那既然const变量的值是肯定不会发生变化的,还需要这个const_cast类型转化有何用?这就引出了const_cast的最常用用法:

如果有一个函数,它的形参是non-const类型变量,而且函数不会对实参的值进行改动,这时我们可以使用类型为const的变量来调用函数,此时const_cast就派上用场了。

 

 

 

除此之外,还有另外一种情况const指针能够派上用场。如果我们定义了一个非const的变量,却使用了一个指向const值的指针来指向它(这不是没事找事嘛),在程序的某处我们想改变这个变量的值了,但手头只持有指针,这是const_cast就可以用到了:

 

 

 

总结一下上文:const_cast绝对不是为了改变const变量的值而设计的!

        在函数参数的传递上const_cast的作用才显现出来。

const_cast中的未定义行为

 下面的第一段程序,输出变量constant与*modefier的地址后....

 

 

 

 

 它们的地址是一样的,值却不同。具体原因我还是不大清除。在另外一些博客中看到, *modifier = 3; 这种操作属于一种“未定义行为”,也即是说操作结果C++并没有明确地定义,结果是怎样的完全由编译器的心情决定。对于未定义的行为,我们只能避免之。

逛了一些网站,大致有如下观点:

 

 

 

 这里附上讨论链接。const_cast是否安全?

posted @ 2020-01-03 15:22  北溟有渔  阅读(450)  评论(0编辑  收藏  举报