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用法大全的文章就介绍到这了,更多相关c++ const_cast用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C++中const_cast与reinterpret_cast运算符的用法

    const_cast 运算符 从类中移除 const.volatile 和 __unaligned 特性. 语法 const_cast < type-id > ( expression ) 备注 指向任何对象类型的指针或指向数据成员的指针可显式转换为完全相同的类型(const.volatile 和 __unaligned 限定符除外).对于指针和引用,结果将引用原始对象.对于指向数据成员的指针,结果将引用与指向数据成员的原始(未强制转换)的指针相同的成员.根据引用对象的类型,通过生成的指针.引

  • C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结

    前言 这篇文章总结的是C++中的类型转换,这些小的知识点,有的时候,自己不是很注意,但是在实际开发中确实经常使用的.俗话说的好,不懂自己写的代码的程序员,不是好的程序员:如果一个程序员对于自己写的代码都不懂,只是知道一昧的的去使用,终有一天,你会迷失你自己的. C++中的类型转换分为两种: 1.隐式类型转换: 2.显式类型转换. 而对于隐式变换,就是标准的转换,在很多时候,不经意间就发生了,比如int类型和float类型相加时,int类型就会被隐式的转换位float类型,然后再进行相加运算.而关

  • 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 conve

  • python 中yaml文件用法大全

    yaml简单介绍 YAML是一种标记语言,它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构.各种配置文件.倾印调试内容.文件大纲. 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab,只允许空格 缩进的空格数不重要,只要相同层级的元素左对齐即可 '#'表示注释 yaml数组 yaml语音数组很简单,使用短横线 '-' 作为数组的开始标志. 一维数组 import yaml #三个双引号的作用是字符换行不需要加换行符 y = """ - 111 - 2

  • python中arrow库用法大全

    首先需要安装arrow库: pip install arrow Arrow提供了一个合理的.人性化的方法来创建.操作.格式转换的日期,时间,和时间戳,帮助我们使用较少的导入和更少的代码来处理日期和时间. 获取本地和世界标准时间: 示例代码: import arrow # 获取世界标准时间 utc_time = arrow.utcnow() print(utc_time) # 获取本地时间 local_time = arrow.now() print(local_time) # 获取指定时区的时间

  • C++中SetConsoleCursorPosition()移动光标函数的用法大全

    SetConsoleCursorPosition()来自于文件"windows.h",使用时记得引用此头文件. 首先说一下,这个函数的功能即是字面意思,即移动命令行中光标的位置.这里要注意的是,每次调用这个函数都是默认从左上角开始偏移,而与当前光标停留的位置无关. 然后我们剖析下这个函数,我们查看定义发现,调用这个函数需要传入两个参数,都是自定义类型,分别为 HANDLE 和 COORD. SetConsoleCursorPosition( _In_ HANDLE hConsoleOu

  • python中的import语句用法大全

    import语句有什么用?import语句用来导入其他python文件(称为模块module),使用该模块里定义的类.方法或者变量,从而达到代码复用的目的. import 语句官方文档https://docs.python.org/zh-cn/3/reference/simple_stmts.html#the-import-statement 不太好懂,解读一下: 格式一: import 模块名1 [as 别名1], 模块名2 [as 别名2],- 说明:1)将整个模块导入:2)[as 别名]部

  • SQL语句中EXISTS的详细用法大全

    目录 前言 一.建表 二.在SELECT语句中使用EXISTS 1.在SQL中使用EXISTS 2.在SQL中使用NOT EXISTS 3.在SQL中使用多个NOT EXISTS 4.在SQL中使用多个EXISTS 5.在SQL中使用NOT EXISTS和EXISTS 三.在DELETE语句中使用EXISTS 1.在MySQL中使用 2.在Oracle中使用 四.在UPDATE语句中使用EXISTS 1.在MySQL中使用 2.在Oracle中使用 总结 前言 在业务开展中,会遇到类似需求. 需

  • PHP中set_include_path()函数相关用法分析

    本文实例讲述了PHP中set_include_path()函数相关用法.分享给大家供大家参考,具体如下: 先看如下代码: <?php /** 定义根目录 */ define('__TYPECHO_ROOT_DIR__', dirname(__FILE__)); /** 定义插件目录(相对路径) */ define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins'); /** 设置包含路径 */ @set_include_path(get_include_path(

  • php中this关键字用法分析

    本文实例讲述了php中this关键字用法.分享给大家供大家参考,具体如下: 下面定义了一个Cart类 <?php class Cart { var $items; // 购物车中的项目 // 把 $num 个 $artnr 放入车中 function add_item ($artnr, $num) { $this->items[$artnr] += $num; } // 把 $num 个 $artnr 从车中取出 function remove_item ($artnr, $num) { if

  • php中str_pad()函数用法分析

    本文实例讲述了php中str_pad()函数用法.分享给大家供大家参考,具体如下: str_pad() 函数把字符串填充为新的长度. 语法: str_pad(string,ength,pad_string,pad_type); 参数列表: 参数 描述 string 必需.规定要填充的字符串. length 必需.规定新的字符串长度.如果该值小于字符串的原始长度,则不进行任何操作. pad_string 可选.规定供填充使用的字符串.默认是空白. pad_type 可选.规定填充字符串的哪边.可能

  • PHP中list方法用法示例

    本文实例讲述了PHP中list方法用法.分享给大家供大家参考,具体如下: <?php function small_numbers() { return array (0, 1, 2); } list ($zero, $one, $two) = small_numbers(); var_dump($zero); var_dump($one); var_dump($two); ?> 输出: int(0) int(1) int(2) 改变一下 <?php function small_num

随机推荐