- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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应用场景?? 不具实际意义的用法:
1
2
3
4
|
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都指向同一地址,同时值也被同时修改了.
整体测试代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#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用法内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/guangod/article/details/119204479 。
最后此篇关于c++中的const_cast用法大全的文章就讲到这里了,如果你想了解更多关于c++中的const_cast用法大全的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在阅读 C++ Primer,我发现了一些非常奇怪且难以理解的东西: Record lookup(Account&); //Record and Account are two unrelate
我的问题是,为什么代码的第一部分不起作用而第二部分有效。非常量指针应该修改之前使用 const_cast 的 const 值,但是对于整数这个技巧不起作用。您能解释一下为什么会这样吗? const i
我已经阅读了很多关于 C++ 中的 const_cast 被认为是错误和危险的讨论,除了向后兼容 C 代码之外,不应将其用于任何其他用途。我大体上同意。 但是最近我遇到了以下用例,这让我感到好奇。 我
C++ Primer 一书的第 6.4 章陈述如下: In § 4.11.3 (p. 163) we noted that const_casts are more useful in the con
我看到这个 post这解释了const_cast<>并说使用指针/引用是有益的。但是,请考虑以下代码: 1- const_cast(xadj) 我得到 invalid const_cast from
我正在阅读有关 c++ 中的 const_cast 运算符 1.我无法理解的第一件奇怪的事情是 const_cast 运算符语法即 -const_cast----(--expression--)---
这个问题在这里已经有了答案: const_cast doesn't work c++? [duplicate] (3 个答案) 关闭 6 年前。 在const_cast之后,main函数中的值没有变
这个问题在这里已经有了答案: Two different values at the same memory address (7 个答案) 关闭 5 年前。 我有以下代码: int main(){
这个问题在这里已经有了答案: Two different values at the same memory address (7 个答案) 关闭 5 年前。 #include using nam
我想使用 C++ 格式进行此转换,它以 C 方式工作。但是当我尝试使用 C++ 格式时它失败了。 有效! void req_password(const void *data, size_t data
我有一个管理输入的类。要显示和更改键绑定(bind),重要的是在完成后将其提交给管理器之前,为调用者提供它可以拥有和更改的绑定(bind)的映射。但是,这个映射中可以插入/删除什么的具体规则只有管理者
我对 const_cast 的返回类型有点困惑?尖括号内的类型是否 <>是返回类型吗? const int i = 5; int b = const_cast(i); 是const_cast返回 in
我有一个函数 static bool Validate(const char& letter, string& aWord) 我需要调用它 Validate(letter, aWord); // wh
这个问题在这里已经有了答案: Two different values at the same memory address (7 个答案) 关闭 5 年前。 考虑以下代码: 我声明了一个新的引用端
我有一个大型库,它实现了一些不可变的数据结构。可以想象,其中几乎所有内容都是 const合格的。有一些选择部分不是 const,例如引用计数器。为了处理嵌入结构中的引用计数器,这些引用计数器只能通过
长话短说是否适用于: mapm; m.insert( make_pair( 1, 40 ) ); for( map::iterator it = m.begin(); it !
据我所知,在类中创建常量函数对于读/写编译器优化很有用。 类中的常量函数意味着类成员在函数执行期间将保持不变。但是,您可以通过 const 强制转换隐式参数来绕过此问题(当然,这是一种非常糟糕的做法)
这个问题在这里已经有了答案: Two different values at the same memory address (7 个答案) 关闭 5 年前。 考虑以下代码: 我声明了一个新的引用端
考虑以下 C++03 程序: #include struct T { mutable int x; T() : x(0) {} }; void bar(int& x) { x
我正在查看我即将开始使用的 API 的一些示例代码。以下模式让我有点困惑: char* str; str = const_cast("Hello World"); printf("%s ", str)
我是一名优秀的程序员,十分优秀!