c++标准转化函数const_cast

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

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

用法:

c++标准转化函数const_cast

 

 

 

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

c++标准转化函数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_cast

 

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

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

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

c++标准转化函数const_cast

 

 

 

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

c++标准转化函数const_cast

 

 

 

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

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

const_cast中的未定义行为

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

c++标准转化函数const_cast

 

 c++标准转化函数const_cast

 

 

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

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

c++标准转化函数const_cast

 

 c++标准转化函数const_cast

 

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

原文链接: https://www.cnblogs.com/wang-1962918321/p/12144440.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    c++标准转化函数const_cast

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/323997

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午12:50
下一篇 2023年3月1日 下午12:51

相关推荐