c++ 11 新特性 不同数据类型之间转换函数之const_cast

一.不同数据类型之间转换函数const_cast介绍

const_cast是C++11中引入的一种类型转换操作符,用于修改类型的constvolatile属性const_cast的主要用途是移除对象的常量性,它是唯一具有此能力的C++风格的转型操作符。在C++11中,const_cast可以完成以下类型转换:

  • 常量指针转非常量指针:当有一个指向常量的指针时,可以使用const_cast将其转换为指向非常量的指针,这样就能够修改原来被指向的常量对象的值。
  • 常量引用转非常量引用:与指针类似,如果有一个指向常量的引用,可以使用const_cast将其转换为非常量的引用。
  • 多级指针的转换:两个可能指向同一类型的多级指针可以相互转换,而不考虑每一层上的cv性质(即constvolatile)。
  • 空指针值的转换:空指针值可以转换为新类型的空指针值。

需要注意的是,const_cast不是用于去除变量的常量性,而是用于去除指向常数对象的指针或引用的常量性。其去除常量性的对象必须为指针或引用。在使用const_cast时,需要特别小心,因为虽然它可以去除const属性,但这并不意味着原来的常量对象可以被修改,除非该对象本身并不是const此外,如果尝试修改一个真正的常量对象,将会导致未定义行为。

二. const_cast 使用示例

1.常量指针转非常量指针

#include <iostream>int main() {const int a = 10;int* p = const_cast<int*>(&a);*p = 20;std::cout << "a: " << a << std::endl;std::cout << "*p: " << *p << std::endl;return 0;
}

 运行结果:

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

#include <iostream>int main() {const int a = 10;const int& r = a;int& nr = const_cast<int&>(r);nr = 20;std::cout << "a: " << a << std::endl;std::cout << "r: " << r << std::endl;std::cout << "nr: " << nr << std::endl;return 0;
}

运行结果:

 

3. 空指针值的转换

#include <iostream>int main() {int* p = nullptr;int** pp = const_cast<int**>(reinterpret_cast<const int**>(p));std::cout << "pp: " << pp << std::endl;return 0;
}

运行结果:

 

         可以看到,通过const_cast将空指针值转换为新类型的空指针值后,得到的是一个空指针。需要注意的是,这里的转换使用了reinterpret_cast进行类型转换,这是因为const_cast不能直接将空指针值转换为非空指针类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/520280.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YoloV8改进策略:Block改进|自研Block,涨点超猛|代码详解|附结构图

涨点效果 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.993,mAP50-95由0.737涨到0.757,涨点明显! 参考模型 参考的Block,如下图: 我对Block做了修改,修改后的结构图如下: 代码详解 from timm.models.layers import DropPathfrom torch import Tensor def …

黑马java-JavaWeb-MySQL基本操作

1.JavaWeb&#xff1a; 用java技术来解决相关web互联网领域的技术栈 2.数据库&#xff1a; 存储数据的仓库&#xff0c;数据是有组织的进行存储 英文&#xff1a;DataBase&#xff0c;简称DB 3.数据库管理系统&#xff1a; 管理数据库的大型软件 英文&#xff1a;DataBase Mana…

链表|707.设计链表

力扣题目链接 typedef struct MyLinkedList {int val;struct MyLinkedList* next; }MyLinkedList;/** Initialize your data structure here. */MyLinkedList* myLinkedListCreate() {//这个题必须用虚拟头指针,参数都是一级指针,头节点确定后没法改指向了!!!MyLinkedList* he…

力扣大厂热门面试算法题 - 矩阵

解数独&#xff0c;单词搜索&#xff0c;被围绕的区域。每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.07 可通过leetcode所有测试用例。 目录 37. 解数独 解题思路 完整代码 Python Java 79. 单词搜索 解题思路 完整代码 Python…

.Net6使用JWT认证和授权

文章目录 目的实现案例一.项目所需包&#xff1a;二.配置项目 appsettings.json 文件&#xff1a;三.创建Model文件夹&#xff0c;添加AppConfig类和UserRole类1.AppConfig类获取appsettings.json文件中的值2.UserRole类用于区分用户信息和权限 四.主体代码案例&#xff1a;1.L…

软考66-上午题-【面向对象技术】-小结+杂题

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a; 二、面向对象设计-总结 2-1、考题分析 选择题&#xff1a;11道&#xff08;11分&#xff09; 综合分析题&#xff1a;2道&#xff08;30分&#xff09; java程序设计…

MySQL 存储过程(超详细)

一、什么是存储过程&#xff1f; 存储过程可称为过程化SQL语言&#xff0c;是在普通SQL语句的基础上增加了编程语言的特点&#xff0c;把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中&#xff0c;通过逻辑判断、循环等操作实现复杂计算的程序语言。换句话说&#xff0c…

足球俱乐部管理系统:Java与SpringBoot的管理系统实践

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

字符串函数和内存函数

文章目录 字符串函数strlen函数模拟实现 strcpy函数模拟实现 strcat函数使用模拟实现 strcmp函数使用模拟实现 strncpy函数使用模拟实现 strstr函数使用模拟实现 strtok函数使用 strerror函数使用 内存函数memset函数使用memcmp函数memcpy函数使用模拟实现 memmove函数使用模拟…

计算机二级 第2套

一、选择题 二、编程题

工作纪实46-关于微服务的上线发布姿势

蓝绿部署 在部署时&#xff0c;不需要将旧版本的服务停掉&#xff0c;而是将新版本与旧版本同时运行&#xff0c;新版本测试无误之后再将旧版本停掉。这样可以避免再升级的过程中如果失败服务不可用的问题&#xff0c;因为同时部署了两个版本的程序&#xff0c;使得硬件资源是…

如何在Linux系统Docker部署Dashy并远程访问内网服务界面

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…