const_cast-详解一篇就够了
Posted 敲代码的Messi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const_cast-详解一篇就够了相关的知识,希望对你有一定的参考价值。
前言
是C++中的关键字,用于类型转换,cons_cast 有两个功能:加上const,去掉const。 在开发中,我们往往用到 后者。 只能用于指针和引用!!。
-去掉const:
type * variable =const_cast< typename* > (expression)
加上const:
const type * variable =const_cast< typename > (expression
去掉const
用于4种场景,常量指针(const int* i), ,指针常量(int *const i) , 常量指针常量(const int *const i),常量引用(const int&)。
一. 指针
1.常量指针(const int* i)
class MSObject;
const MSObject* cst_obj= new MSObject;
MSObject* discst_obj = const_cast < MSObject*> (cst_obj);
2. 指针常量(int *const i)
class MSObject;
MSObject* const cst_obj= new MSObject;
MSObject* discst_obj = const_cast < MSObject*> (cst_obj);
3. 常量指针常量(const int *const i)
可以转换为三种:
- int * i;
- int* cosnt;
- const int *i;
class MSObject;
const MSObject* const cst_obj= new MSObject;
//1.非const指针
MSObject* discst_obj = const_cast < MSObject*> (cst_obj);
//2.const指针
const MSObject* discst_obj = const_cast < MSObject*> (cst_obj);
// 3. 指向常量的指针
MSObject* const discst_obj = const_cast < MSObject*> (cst_obj);
总结: 其实很简单,按照相同的格式,将 目标指针 修改即可。
如果去掉 const的操作不唯一的话,我们的目标指针的声明就是 确定采用哪一种方式,如 常量指针常量。
二. 引用
常量引用转为非常量引用。
class MSObject;
MSObject ms;
const MSObject& cst_obj = ms;
MSObject& discst_obj = const_cast < MSObject&> (cst_obj);
加上const
int a = 0;
int* a_ptr = &a;
*a_ptr = 1; //valid
const int* a_cst = const_cast<const int *> (a_ptr)
*a_cst = 1; //invalid
总结
const_cast的目的并不是为了让你去修改一个本身被定义为const的值。
因为这样做的后果是无法预期的。const_cast的目的是修改一些指针/引用的权限,如果我们原本无法通过这些指针/引用修改某块内存的值,现在你可以了。
以上是关于const_cast-详解一篇就够了的主要内容,如果未能解决你的问题,请参考以下文章