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 关键字 休 ...
随机推荐
- jQuery学习笔记:attr()与prop()的区别
先看看官方文档是如何解释两者之间功能差异的: attr() Get the value of an attribute for the first element in the set of matc ...
- Linux进程空间分布 & 进程控制块 PCB
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Verdana; color: #555555 } span.s1 { } Linux使用两级 ...
- 【Todo】pthread_key_t 和 pthread_once_t学习
这两个函数应该都是和线程局部变量有关的.有时间学习一下. 可以参考如下文章: <Linux线程私有数据pthread_key_t> <posix多线程有感--线程高级编程(pthre ...
- Object Pascal 语法之异常处理
http://www.cnblogs.com/spider518/archive/2010/12/30/1921298.html 3 结构化异常处理 结构化异常处理(SHE)是一种处理错误的手段,使得 ...
- latex输入希腊字母
\alpha产生字符α;\beta产生字符β:\gamma产生字符γ:\delta产生字符δ;\epsilon产生字符ε; \zeta产生字符ζ:\eta产生字符η;\theta产生字符9; \iot ...
- ffmpeg,X264编码结果I帧QP比P帧还大
enc_ctx->profile =FF_PROFILE_H264_MAIN ; enc_ctx->time_base.den = 24; enc_ctx->time_base.nu ...
- git冲突的发生和解决/git workspace关于git的配置
分支之间的冲突时如何产生的,前提是他们之间本来没有冲突,然后一个分支git add commit,另一个分支也git add commit,并且恰好是在同一个文件,于是冲突就产生了,冲突的解决有两种: ...
- 【转】PackageInfo、ResolveInfo 笔记
1.PackageInfo.ResolveInfo PackageItemInfo:包含了一些信息的基类, 它的直接子类有: ApplicationInfo. ComponentInfo.Instru ...
- Android FloatingActionButton(FAB) 悬浮按钮
FloatingActionButton 悬浮按钮 ...
- jsonp跨域原理
Jsonp原理: 首先在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)传给服务器.注意:服务端得到ca ...