C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast
Static_cast可以对对象也可以对指针也可以对引用,但是const_cast只可以对指针和引用使用,后者不可以对对象用,如果你要把一个const值转化为非const值只能用隐式执行或通过使用static_cast、C 样式转换或函数样式转换执行。
比如:
const int aa = 10;
//int bb = const_cast<int>(aa);错误
int bb = int(aa);//传统的c转化方式
int bb = static_cast<int>(aa);//static_cast也可以
如果是指针使用就有一个返回的对象要是一个指针,结果指针是指向原指针的,但是不可以认为原来的指针性质已经变化了,依旧不可以直接改变他的值,但是可以通过结果指针改变,引用一样:
int p = 20;
const int *pp = &p;
int *ppp = const_cast<int *>(pp);
*ppp = 30;
//*pp = 40;错误,但是可以通过PPP来改变pp的值
cout << *pp << p <<endl; //3030
对于引用也存在这个问题:
int c = 10;
const int &a = c;
int &b = const_cast<int &>(a);
cout << a << b << c <<endl;//101010
//a = 12;
b = 12;
cout << a << b << c <<endl;//121212
记住一点,就是cast<>的尖括号里面的一定要是对应的如果本身是指针就用指针,是引用就要用引用。
可以看到上面的b可以改变a乃至c的值,但是不能通过a来改变,因为a仍旧常量。
还要注意一个问题就是返回的值不是传给引用,还是可以成功的,相当于转化后的值产生了一个临时中间值,传给了结果值!如下:
int c = 10;
const int &a = c;
int b = const_cast<int &>(a); //临时变量出现
cout << a << b << c <<endl; //101010
//a = 12;
b = 12;
cout << a << b << c <<endl;//101210
C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast的更多相关文章
- C++中const修饰基本数据类型、指针、引用、对象
const修饰基本数据类型 #include <iostream> using namespace std; void main(){ const int a = 1; const cha ...
- C++学习基础二——指针与引用的区别
一.指针: (1)如果对指针进行解引用操作 赋值,改变的是指针所指向对象的值:(2)如果不对指针进行解引用操作 赋值,则改变的是指针本身的值:(3)const指针本身的值不能修改,但是const指针所 ...
- 引用,引用形參,指针形參与指向指针的引用形參,内存泄露及free相关
(另:关于"引用"更具体的讨论.见此.) 由做UVa133引发的一系列问题及讨论 1.引用类型 C++ Primer P51 引用就是对象的还有一个名字,使用多个变量名指向同 ...
- this指针、引用、顶层和底层const关系
1.首先顶层const和底层const是围绕指针*p的说法.底层:const int *p,const不是修饰指针p,指针所指的值不能改变:顶层:int *const p,const修饰指针p,指针本 ...
- c++中为什么可以通过指针或引用实现多态,而不可以通过对象呢?
引言: 在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以. 那为什么?让我们来解开这神秘的暗纱! 1. 类对象的存储方式: 在一个类的实例中,只会存放非静态的成员变量. ...
- [C++]变量存储类别,指针和引用,类与对象,继承与派生的一些摘要
C++中共有四种存储类别标识符:auto/static/register/extern 1.auto 函数或分程序内定义的变量(包括形参)可以定义为auto(自动变量).如果不指定存储类别,则隐式定义 ...
- 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用
先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的 ...
- c/c++不能返回局部对象和局部变量的指针或引用解释
在编写c/c++代码时,调用函数的书写让程序变得整洁易读,但是调用函数的返回值(局部变量的返回值,变量,结构体,数组等)也有注意事项.c/c++严禁返回局部变量的指针或引用. 其实函数的返回值的规则非 ...
- instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例。
http://lavasoft.blog.51cto.com/62575/79864/ 深入Java关键字instanceof 2008-06-02 07:50:43 标签:Java 关键字 休 ...
随机推荐
- PHP 迭代器模式
迭代器:类继承PHP的Iterator接口,批量操作. 1. 迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素.2. 相比传统的编程模式,迭代器模式可以隐藏遍历元素的所需操作.接口 ...
- C++ typedef 四个用途
第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...
- 简单ssh框架整合
Struts2+Spring4 +Hibernate4 首先看看建立项目的框架 第一步 建立web项目 第二步 导入相对应需要的jar包(放在项目WEB-INFO/lib下) 需要导入Spring ...
- stdlib标准库的常用API
iOS 有如下四种随机数方法,下面以产生 [0,100) 的随机数为例: 1. srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % ...
- spring源码深度解析-1核心实现
xml配置文件的读取:1:通过集成字AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件2:通过Docum ...
- 深入理解JVM虚拟机-2垃圾收集器
这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机. 如果两个收集器之间存在连线,说明可以搭配使用.虚拟机所处的区域,则表示它是属于新生代收集器还是年老代收集器.在这里我 ...
- sizeof和strlen()的区别
二者有本质上的区别 从定义可以知道sizeof只是一个operator,而strlen()则是定义一个定义在<string.h>中的函数;所以sizeof(string)是在计算strin ...
- html5中插入视频和音频
<audio src="1.mp3" controls></audio> <video src="1.mp4" controls& ...
- RESEACH PAPER
个,proquest的username和password赫然在目,别急,再看第4个结 果"HB Thompson Subscription Online Databases", ...
- js 判断当前的手机系统类型
<script language="javascript">window.onload = function () {alert("1");var ...