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的目的是修改一些指针/引用的权限,如果我们原本无法通过这些指针/引用修改某块内存的值,现在你可以了。
上一篇:
IDEA上Java项目控制台中文乱码