(转)去掉c++的变量的const类型

const_cast (expression)

const_cast转换符是用来移除变量的const或volatile限定符。对于后者,我不是太清楚,因为它涉及到了多线程的设计,而我在这方面没有什么了解。所以我只来说const方面的内容。

 

用const_cast来去除const限定

 

对于const变量,我们不能修改它的值,这是这个限定符最直接的表现。但是我们就是想违背它的限定希望修改其内容怎么办呢?

下边的代码显然是达不到目的的: const int constant = 10;
int modifier = constant;

因为对modifier的修改并不会影响到constant,这暗示了一点:const_cast转换符也不该用在对象数据上,因为这样的转换得到的两个变量/对象并没有相关性。

只有用指针或者引用,让变量指向同一个地址才是解决方案,可惜下边的代码在C++中也是编译不过的: const int constant = 21;
int* modifier = &constant
// Error: invalid conversion from 'const int*' to 'int*'

(上边的代码在C中是可以编译的,最多会得到一个warning,所在在C中上一步就可以开始对constant里面的数据胡作非为了)

把constant交给非const的引用也是不行的。 const int constant = 21;
int& modifier = constant;
// Error: invalid initialization of reference of type 'int&' from expression of type 'const int'

于是const_cast就出来消灭const,以求引起程序世界的混乱。

下边的代码就顺利编译功过了: const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
*modifier = 7;

传统转换方式实现const_cast运算符

 

我说过标:准转换运算符是可以用传统转换方式实现的。const_cast实现原因就在于C++对于指针的转换是任意的,它不会检查类型,任何指针之间都可以进行互相转换,因此const_cast就可以直接使用显示转换(int*)来代替: const int constant = 21;
const int* const_p = &constant;
int* modifier = (int*)(const_p);

或者我们还可以把他们合成一个语句,跳过中间变量,用 const int constant = 21;
int* modifier = (int*)(&constant);

替代 const int constant = 21;
int* modifier = const_cast<int*>(&constant);

为何要去除const限定

 

从前面代码中已经看到,我们不能对constant进行修改,但是我们可以对modifier进行重新赋值。

但是但是,程序世界真的混乱了吗?我们真的通过modifier修改了constatn的值了吗?修改const变量的数据真的是C++去const的目的吗?

如果我们把结果打印出来: cout << "constant: "<< constant <<endl;
cout << "const_p: "<< *const_p <<endl;
cout << "modifier: "<< *modifier <<endl;
/**
constant: 21
const_p: 7
modifier: 7
**/

constant还是保留了它原来的值。

可是它们的确指向了同一个地址呀:
cout << "constant: "<< &constant <<endl;
cout << "const_p: "<< const_p <<endl;
cout << "modifier: "<< modifier <<endl;

/**
constant: 0x7fff5fbff72c
const_p: 0x7fff5fbff72c
modifier: 0x7fff5fbff72c
**/

这真是一件奇怪的事情,但是这是件好事:说明C++里是const,就是const,外界千变万变,我就不变。不然真的会乱套了,const也没有存在的意义了。

C++ 语法 const限定符 const限定符是常用且容易混淆的概念,很多书中讲解不清晰,甚至《C++ primer》中都有一些错误的论断或者不明确的区分,本文对const限定符做归纳总结。 一、在类型中 顶层const和底层const是一个非常容易让人遗忘和混淆的概念,这里包括常量词性(即使名词常量,也是形容词常量的)和C++类型定义从右向左的释义顺序与日常语言从左向右理解的顺序差异造成的混淆。 首先将常量指针和指向常... 阅读详情

相关推荐

C++ 添加和移除 const 属性

C++ 可以通过 const_cast 添加和移除 const 属性,可以通过 std::as_const 返回一个 reference-to-const 变量,具体例子如下: #include <iostream> #include <string> #include <format> #include <typeinfo> int main() { const char* name_const{ "Tom" }; std::cout &l

木偶不哭不笑的博客 8463

C++删除目标类型const属性(const_cast)

C++删除目标类型const属性可以采用const_cast方式进行实现。使用const_cast进行类型换时,应确保换后的对象确实是可修改的,否则将导致未定义行为。在使用const_cast时,应谨慎考虑是否真正需要改变const属性,避免对程序的正确性产生影响。其中,new_type表示要换的新类型,expression表示要进行换的表达式。是C++中的一种类型换操作符,用于删除目标类型const或volatile属性。

板栗的学习日常 1539

C++ 去掉const

通过模板实现去const类型

CodeHouse的博客 2766

c++新经典模板与泛型编程:const修饰符的移除与增加

让你来写移除const修饰符,你会怎么样来写?😂😂trait类模板,如下。

the growth of Nick 1551

c++中的四种类型

坚持✊ 在语言里边的类型: int main() { int *ptr; char *qtr; qtr = (char*)ptr; return 0; } c++里边有四种强制类型换: caonst_cast: 去掉变量const属性 static_cast: 编译器认为可以支持的强,安全性较高 reinterpret_cast: 和c的强...

NULL_NULL的博客 660

C++const变量的修改与赋值

title: C++const变量的修改与赋值 date: 2021-02-25 20:26:16 description: C++const变量的修改与赋值  出于避免对数据的无意修改的需求,C及C++语言引入了const关键字。与C语言中的const相比,C++中的const具有更丰富的用法。C++中的const除了可用于修饰变量,指针,函数及函数参数,还可用于修饰类对象,类成员,类成员函数等。由于其丰富的用途,往往容易对其产生误解,尤其是与指针用法结合在一起时。下面以一些实例来说明这个问题。 .

qq_38877888的博客 2万+

C++中的const_c++ const变量

C++ 中的 const 变量虽然也会占用内存,也能使用获取得它的地址,但是在使用时却更像编译时期的#define;#define也是值替换,可见范围也仅限于当前文件。很多C++教程在对比 const 和 #define 的优缺点时提到,#define 定义的常量仅仅是字符串的替换,不会进行类型检查,而 const 定义的常量是有类型的,编译器会进行类型检查,相对来说比 #define 更安全,所以鼓励大家使用 const 代替 #define。

2401_84240431的博客 963

C++中如何修改const变量

一、结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的constC++ const 修饰符,表示常量,即如果以后保证不会修改则声明为const,否则若要修改,那一开始为什么还要声明为const呢? 根据C++标准,对于修改const变量,属于:未定义行为(指行为不可预测的计算机代码),这样一来此行为取决于各种编译器的具体实现

heyabo 2万+

const_cast的使用:添加或去掉const、常量折叠

避免未定义行为 一个变量在使用const_cast去掉指针或者引用的const限定符后,“如果常量本身不是常量,获得的权限是合法的, 如果本身是常量,使用const_cast再写的后果是未定义的。” int main(){ const int a = 1; int & b = const_cast<int&>(a); b = 2; cout << a...

anlian523的博客 1万+

C和C++const变量内存分配问题详解

一、const变量的内存分配 1.const全局变量,或者static,extern 关键字 此时该常量是存放在.rodata段的—Read Only Data也就是常量区,是无法通过取地址方式去修改的,修改内容会报段错误(gcc++编译器:Segmentation fault(core dumped))。   例如extern const int i=10,   static const int i=10。 2.const局部变量 在C语言中,const局部变量在栈分配内存,不能通过赋值,自

u014157109的博客 7992

C++数据类型变量常量

C++数据类型变量常量详解!关注主播不迷路耶!

PingdiGuo_guo的博客 1692

C++ 中的 const 类型变量

之前总感觉C/C++中有const 限定的变量是个非常头痛的问题,一会儿可以变,一会儿不可以变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了。今天刚好把《C++ primer》中的相关部分又读了一遍,所以就把相关的内容写出来总结一下啦!          首先,我们可以想想为什么要设计const变量这种东西,不过就是想有个常量嘛!所以对cons

姚灯灯的专栏 1160

C++const 修饰普通类型,修饰指针变量

Test t(8);Cmf(t);return 0;// 返回一个 const 自定义类型对象// 获取 const 自定义类型对象// 可以访问成员,但不能修改// 以下代码会报错,因为 obj 是 const 对象,不能修改return 0;

down_and_out的博客 970

C++如何修改const变量()

本文自:https://blog.csdn.net/heyabo/article/details/8745942 一、结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的constC++ const 修饰符,表示常量,即如果以后保证不会修改则声明为const,否则若要修改,那一开始为什么还要声明为const呢? 根据C++...

Primeprime的专栏 1491

C++Primer const限定符

专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!

专注于C/C++编程语言的博客,如果读者对C/C++语言有任何需要咨询的可以私信联系! 1024

c++ const const

#include <iostream> #include <stdio.h> using namespace std; struct DexHeader{ int off; }; int main() { struct DexHeader dexHeader; dexHeader.off = 3; const DexHeader* lpDexHeader = &...

zhangmiaoping23的专栏 5263

C++ const以及它们的初始化(

原文链接: https://blog.csdn.net/qq_40416052/article/details/82655736?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 参考链接: https://blog.csdn.net/...

weixin_42525096的博客 3055

【CPP】const放在不同位置的作用

const & constexpr

记忆超差的本人的博客 1852

C++const

C++编程中,`const`关键字是保证程序安全性和稳定性的重要工具。它可以用来定义不可修改的变量、限定指针行为,甚至控制类成员函数的权限。通过合理使用`const`,开发者可以避免不必要的数据修改,提升代码的可读性和维护性。本文将深入探讨`const`在C++中的各种应用场景,帮助你充分理解并掌握这一关键特性。

weixin_44259499的博客 1281
上一篇: silverlight 5开发【vb版】(8)-checkbox和combobox
下一篇: silverlight 5开发【vb版】(9)- RadioButton和ListBox
deepfuture
博客等级 码龄17年 209粉丝 1288原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值