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)

可以转换为三种:

  1. int * i;
  2. int* cosnt;
  3. 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-详解一篇就够了的主要内容,如果未能解决你的问题,请参考以下文章

图文详解CDC技术,看这一篇就够了!

Matplot pyplot绘制单图,多子图不同样式详解,这一篇就够了

Java中Thread详解(一篇就够了)

图文详解CDC技术,看这一篇就够了!

GitGitHub详解,看这一篇就够了!(持续更新中)

微服务常见面试题:答案+源码+图文详解,一篇就够了