首页 > 编程语言 >C++类型转换详解--const_cast

C++类型转换详解--const_cast

时间:2023-06-14 22:34:56浏览次数:51  
标签:类型转换 const -- cast int iNum 属性 指针

一. 函数描述:
const_cast < type-id > ( expression )
主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。

去掉const属性:const_case<int*> (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。

加上const属性:const int* k = const_case<const int*>(j),一般很少用,因为可以把一个非const变量直接赋给一个const变量,比如:const int* k = j;

 

二. 使用范围:
1. 常量指针被转化成非常量指针,转换后指针指向原来的变量(即转换后的指针地址不变)。

class A
{
public:
A()
{
m_iNum = 0;
}

public:
int m_iNum;
};

void foo()
{
//1. 指针指向类
const A *pca1 = new A;
A *pa2 = const_cast<A*>(pca1); //常量对象转换为非常量对象
pa2->m_iNum = 200; //fine

//转换后指针指向原来的对象
cout<< pca1->m_iNum <<pa2->m_iNum<<endl; //200 200

//2. 指针指向基本类型
const int ica = 100;
int * ia = const_cast<int *>(&ica);
*ia = 200;
cout<< *ia <<ica<<endl; //200 100
}

2. 常量引用转为非常量引用。


class A
{
public:
  A()
  {
m_iNum = 1;
  }

public:
  int m_iNum;
};

void foo()
{

  A a0;
  const A &a1 = a0;
  A a2 = const_cast<A&>(a1); //常量引用转为非常量引用

  a2.m_iNum = 200; //fine

  cout<< a0.m_iNum << a1.m_iNum << a2.m_iNum << endl; //1 1 200
}
2. 常量对象(或基本类型)不可以被转换成非常量对象(或基本类型)。

 

记住这种转换只是开了一个接口,并不是实质上的转换。(其实也算是实质上的转换了,只不过表达上不允许这样写)

3. 添加const属性

 

三. 总结:
1. 使用const_cast去掉const属性,其实并不是真的改变原类类型(或基本类型)的const属性,它只是又提供了一个接口(指针或引用),使你可以通过这个接口来改变类型的值。也许这也是const_case只能转换指针或引用的一个原因吧。


2. 使用const_case添加const属性,也是提供了一个接口,来不让修改其值,不过这个添加const的操作没有什么实际的用途(也许是我认识太浅了)。
————————————————
原文链接:https://blog.csdn.net/lwbeyond/article/details/6213382

 

标签:类型转换,const,--,cast,int,iNum,属性,指针
From: https://www.cnblogs.com/im18620660608/p/17481533.html

相关文章

  • 【论文阅读】MONAI Label:人工智能辅助的 3D 医学图像交互式标注框架
    Abstract缺乏带注释的数据集是训练监督AI算法的主要挑战,因为手动注释既昂贵又耗时。为了解决这个问题,我们提出了MONAILabel,这是一个免费的开源平台,有助于开发基于AI的应用程序,旨在减少注释3D医学图像数据集所需的时间。通过MONAILabel,研究人员可以开发专注于其专业领域的......
  • 浅谈 thinkphp composer 扩展包加载原理
    浅谈thinkphpcomposer扩展包加载原理本文将介绍ThinkPHP中Composer扩展包的加载原理,帮助读者更好地理解和应用该功能。前言如题,今天感觉好久没有更新博客了。最近迷上了物联网开发。一直在研究stm32、51这些东西。想起来前几天群里面有人问到tp扩展包原理。其实这个前......
  • FSL 安装教程
    这节主要介绍如何安装FSL工具。由于我LINUX服务器上早已安装成功,这次在MacOs系统上进行安装演示。其余系统基本一致,按照官方安装说明一步一步来即可。预祝大家顺利安装。FSL下载下载地址下载步骤同意FSLlicence勾选填写个人信息,信息随意填写,不用真实信息选择安装系统可以......
  • C++ 深入理解const_cast转换运算符
    const_cast转换运算符我们在RTTI和类型转换运算符中详细介绍过它的用法和使用场景,今天我们对其进一步了解一下。首先我们回忆一下它的作用和用法。const_cast的基本使用const_cast运算符用于执行只有一种用途的类型转化,即改变const或volatile。用法如下:const_cast<type_name>......
  • 对抗性自动编码器系列--有监督对抗自动编码器SAAE的原理及实现-随机数生成想要的数字
    文章目录前言监督对抗性自动编码器SAAE风格和内容的分离SAAE训练结果AEAAESAAE实验对比结果恢复效果对比从随机数重建图像的效果这部分实验代码前言先来看看实验:我们使用MNIST手写数字,测试通过自动编码器和对抗性自动编码器学习重建恢复效果。原始图像:自动编码器重建效果......
  • 对抗性自动编码器系列--自动编码器AutoEncoder的原理及实现-手写数字的重建
    文章目录前言自动编码器介绍自动编码器重建手写数字关于损失函数重建结果这部分实验代码前言先来看看实验:我们使用MNIST手写数字,测试通过自动编码器和对抗性自动编码器学习重建恢复效果。原始图像:自动编码器重建效果对抗性自动编码器重建效果虽然这里看到,自动编码器和对抗性自......
  • 正确使用C++的const_cast
    C++的四种类型转换之const_cast前言引用《EffectiveC++中文版第三版》中条款27"尽量少做转型动作"中的一段话:C++规则的设计目标之一是,保证“类型错误”绝对不可能发生,理论上如果你的程序很“干净”的通过编译,就表示它并不企图在任何对象上执行任何不安全、无意义、愚蠢......
  • django 更改了modules.py 数据库模型,但是 python3 manage.py makemigrations 提示无
    现象:明明改了modules.py文件。删了appname/migrations/下所有内容。而且也删除了django模型变更记录表django_migrations中appname项目的记录 原因:删多了: appname/migrations/下所有内容。__init__.py不能删,需要重新创建一个,否则识别不了包了  ......
  • 介绍一款 MRI&CT 图像预处理强大工具--FSL
    FSL是什么?全名是:FMRIB’sSoftwareLibraryFMRIB是英国牛津大学脑功能磁共振成像中心,FSL则是他们开发的一个软件库。由StephenSmith教授开发,发布于2000年适用于所有操作系统用于结构MRI、功能MRI(任务、静息)、扩散MRI的分析MRI,CT数据的预处理和分析MRI,CT数据的查看......
  • C++面试八股文:C++中,设计一个类要注意哪些东西?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第9面:面试官:C++中,设计一个类要注意哪些东西?二师兄:设计一个类主要考虑以下几个方面:1.面向对象的封装、继承及多态。2.bigthree或者bigfive。3.运算符和函数重载、静态成员、友元、异常处理等相关问题。面试官:请介绍一下面向......