广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++中的const_cast用法总结
  • 693
分享到

c++中的const_cast用法总结

2023-06-20 18:06:54 693人浏览 薄情痞子
摘要

本篇内容介绍了“c++中的const_cast用法总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!const_cast是一种C++运算符,

本篇内容介绍了“c++中的const_cast用法总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。

const_cast:作用:

指针或引用的转换符,用来移除变量的const或volatile限定符。

先来看c中不严谨的地方:

const int ca = 30;
 int* q = &ca;//C中是可以编译的,最多会得到一个warning,随后就可以对ca里的数据进行操作了。
疑问:那const几乎是失效的。

在c++编译中就会报错:

error: invalid conversion from ‘const int*' to ‘int*' [-fpermissive]//无效的转换,把const int交给int.从这个提示,也可看出针对的是指针。int* q = &ca;

const_cast应用场景?? 不具实际意义的用法:

const int ca=30;const int* p=&ca;int* q=const_cast<int*>p;*q=10;//打印一下ca/p/q的地址可以看到地址是一样的,但ca的值仍是30,其他两个值都变为了10

虽然没有实际应用的意义,但可以看到const_case的意义,确实如c一样,可以将地址给另外一个指针,同时修改另外指针所指空间里面值,确实是可以修改里面的值。但原const声明的变量的值也没有变。指向地址是一个地址,但值确有两种,是不是不太对呢???如何来正确理解呢?

当使用const声明一个常量时,在C++中,就是作为一个常量写到ROM(单片机里面的概念,对于PC来说,可以理解为写到了磁盘中),并且这个ROM地址映射到内存,指向的地址不变。

当使用const_cast,去除掉const限定后,将地址赋给另外的变量指针,改变变量指针的值,确实是改变了内存地址中存的数据,但并没有改变在外存中的数据。所以此时读取变量指针的值,其实是取的内存中的数据,看到的就是改变的值。

const_cast实际编程应用:

需要使用const声明的常量的值,尤其是调用了一个参数不是const的函数,而我们要传进去的实际参数确实const的情形。
使用带const指针指向一个变量时,需要修改变量的值。如下代码:

int a = 10;
const int* p = &a;
int* q=const_cast<int*>p;
*q=24;//可以得到a,q,p都指向同一地址,同时值也被同时修改了。

整体测试代码如下:

#include <iOStream>using namespace std;int main(int arGC, const char** argv) {    int a = 10;    const int* p = &a;      const int ca = 30;    int* q;        cout << "a adress is:\t" << &a << "\ta is:\t" << a << endl;    cout << "p adress is \t" << p << "\t*p is \t" << *p << endl;    q = const_cast<int*>(p);    *q = 24;    cout << "a adress is:\t" << &a << "\ta is:\t" << a << endl;    cout << "p adress is \t" << p << "\t*p is \t" << *p << endl;    cout << "q adress is \t" << q << "\t *q is\t" << *q << endl;    cout << "=======================" << endl;    p = &ca;    q = const_cast<int*>(p);    *q = 50;       cout << "ca adress is:\t" << &ca << "\tca is:\t" << ca << endl;     cout << "p adress is \t" << p << "\t*p is \t" << *p << endl;    cout << "q adress is \t" << q << "\t *q is\t" << *q << endl;    return 0;}

扩展:

其他三种指针转换运算符:

static_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
dynamic_cast <new_type> (expression)//以后遇到再说吧,先放到这里作下对比!

“c++中的const_cast用法总结”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: c++中的const_cast用法总结

本文链接: https://www.lsjlt.com/news/299020.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中的const_cast用法总结
    本篇内容介绍了“c++中的const_cast用法总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!const_cast是一种C++运算符,...
    99+
    2023-06-20
  • c++中的const_cast用法大全
    const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。 const_cast:作用: 指针或引用的转换符,用来移除变量的c...
    99+
    2022-11-12
  • C#中ManualResetEvent用法总结
    ManualResetEvent是C#中的一个线程同步原语,用于在多线程环境下进行线程间的同步与通信。以下是对ManualReset...
    99+
    2023-09-13
    C#
  • C#中BackgroundWorker类用法总结
    目录1、属性:WorkerReportsProgress WorkerSupportsCancellation CancellationPending IsBusy 2、方法:Run...
    99+
    2022-11-12
  • C#中缓存System.Web.Caching用法总结
    System.Web.Caching.Cache Insert和Add方法的区别 Add() object Add(string key, object value, CacheDe...
    99+
    2022-11-13
  • C++中引用的使用总结
    1引用的定义 引用时C++对C的一个重要的扩充,引用的作用是给变量起一个别名。 例如: int a; int &b=a;//声明b是a的引用 经过以上的声明,b就成为了a的别...
    99+
    2022-11-15
    引用 C++
  • C/C++ assert()函数用法案例总结
    1. 简介 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。 原型定义: #include <a...
    99+
    2022-11-12
  • C语言指针用法总结
    1、先谈谈内存与地址 引例: 计算机的内存看成大街上的一排房屋,每个房屋都要有门牌号,这个就相当于计算机的内存地址,而房屋里面住的人、家具等等就相当于需要存放的各种各样的数据,所以要...
    99+
    2022-11-12
  • C++中string类的常用方法实例总结
    目录引言C++string类常用方法总结引言 C++中提供了一种新的数据类型——字符串类型(string)。实际上string并不是C++的基本类型,它是在C...
    99+
    2022-11-13
  • operator new在C++中的各种写法总结
    乍一看,在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单。然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次。这也许对简单的程序并不重要,但对你在代码中控...
    99+
    2022-11-15
    operator_new
  • C#中各种泛型集合的使用方法总结
    本篇体验除Queue<T>和Stack<T>之外的其它泛型集合。 SortedList<TKey, TValue> SortedList<T...
    99+
    2022-11-13
    C# 泛型集合
  • Python和C/C++交互的几种方法总结
    前言 python作为一门脚本语言,其好处是语法简单,很多东西都已经封装好了,直接拿过来用就行,所以实现同样一个功能,用Python写要比用C/C++代码量会少得多。但是优点也必然也伴随着缺点(这是肯定的,...
    99+
    2022-06-04
    几种方法 Python
  • node.js中的console用法总结
    //建立app.js页面 // 一:页面代码 console.log("log信息"); //在页面中执行(node app.js)这个文件会在控制台中看到log信息:"log信息" //换个方式...
    99+
    2022-06-04
    node js console
  • 一文总结C++运算符的使用方法
    目录1. 算术运算符2. 关系运算符3. 逻辑运算符4. 按位运算符5. 取地址运算符6. 取内容运算符7. 成员选择符8. 作用域运算符1. 算术运算符 算术运...
    99+
    2023-05-20
    C++运算符总结 C++ 运算符
  • 详解C#操作XML的方法总结
    本文的主要模块为: 1.生成xml文件 2.遍历xml文件的节点信息 3.修改xml文件的节点信息 4.向xml文件添加节点信息 5.删除指定xml文件的节点信息 假设我们需要设计出...
    99+
    2022-11-13
    C#操作XML方法 C#操作XML C# XML
  • C语言中#define预处理语法总结
    目录一、使用#define定义标识符常量语法1:语法2:二、#define来定义带有参数的宏三、C语言给我们定义好的一些标识符常量一、使用#define定义标识符常量 语法1: ...
    99+
    2022-11-12
  • C/C++中getline函数案例总结
    getline函数是一个比较常见的函数。根据它的名字我们就可以知道这个函数是来完成读入一行数据的。现在对getline函数进行一个总结。 在标准C语言中,getline函数是不存在的...
    99+
    2022-11-12
  • Java中的Object类用法总结
    目录1.Object类是什么?2.Object类中的equals方法3.Object类中的hashCode方法4.编译器自动生成equals和hashCode总结1.Object类是...
    99+
    2023-05-17
    java的object类型 java中的object类 java object类有哪些方法
  • 在Java中Scanner的用法总结
    最近在做OJ类问题的时候,经常由于Scanner的使用造成一些细节问题导致程序不通过(最惨的就是网易笔试,由于sc死循环了也没发现,导致AC代码也不能通过。。。),因此对Scanne...
    99+
    2022-11-12
  • Oracle中PL/SQL的用法总结
    目录一、PLSQL基本结构1、基本数据类型变量1. 基本数据类型2. 基本数据类型变量的定义方法2、表达式1. 数值表达式2. 字符表达式3. 关系表达式4. 逻辑表达式3、PLSQ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作