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

http://blog.csdn.net/ztz0223/article/details/2589737

C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast的更多相关文章

  1. C++中const修饰基本数据类型、指针、引用、对象

    const修饰基本数据类型 #include <iostream> using namespace std; void main(){ const int a = 1; const cha ...

  2. C++学习基础二——指针与引用的区别

    一.指针: (1)如果对指针进行解引用操作 赋值,改变的是指针所指向对象的值:(2)如果不对指针进行解引用操作 赋值,则改变的是指针本身的值:(3)const指针本身的值不能修改,但是const指针所 ...

  3. 引用,引用形參,指针形參与指向指针的引用形參,内存泄露及free相关

    (另:关于"引用"更具体的讨论.见此.) 由做UVa133引发的一系列问题及讨论 1.引用类型    C++ Primer P51 引用就是对象的还有一个名字,使用多个变量名指向同 ...

  4. this指针、引用、顶层和底层const关系

    1.首先顶层const和底层const是围绕指针*p的说法.底层:const int *p,const不是修饰指针p,指针所指的值不能改变:顶层:int *const p,const修饰指针p,指针本 ...

  5. c++中为什么可以通过指针或引用实现多态,而不可以通过对象呢?

    引言:  在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以.  那为什么?让我们来解开这神秘的暗纱! 1. 类对象的存储方式: 在一个类的实例中,只会存放非静态的成员变量. ...

  6. [C++]变量存储类别,指针和引用,类与对象,继承与派生的一些摘要

    C++中共有四种存储类别标识符:auto/static/register/extern 1.auto 函数或分程序内定义的变量(包括形参)可以定义为auto(自动变量).如果不指定存储类别,则隐式定义 ...

  7. 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用

    先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的 ...

  8. c/c++不能返回局部对象和局部变量的指针或引用解释

    在编写c/c++代码时,调用函数的书写让程序变得整洁易读,但是调用函数的返回值(局部变量的返回值,变量,结构体,数组等)也有注意事项.c/c++严禁返回局部变量的指针或引用. 其实函数的返回值的规则非 ...

  9. instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例。

    http://lavasoft.blog.51cto.com/62575/79864/    深入Java关键字instanceof 2008-06-02 07:50:43 标签:Java 关键字 休 ...

随机推荐

  1. ES6中的const命令

      1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught T ...

  2. Android开发中退出程序几种方法

    参考:http://johncookie.iteye.com/blog/890734 Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗 ...

  3. Handler知识点详解

    Handler是在多线程之间使用的,用于线程之间进行通信. 要想知道为什么需要Handler就首先说明android的主线程和工作线程. 主线程又称为UI线程.正是因为在android中,所有与UI有 ...

  4. 【MRPT】【icp-slam-live】Vs2013+ cmake3.6.1 + mrpt1.4.0+opencv2.9.4+wxWidget3.0.2环境配置

    Win10下Vs2013 + cmake3.6.1 + mrpt1.4.0+opencv2.9.4+wxWidget3.1.0环境配置 所接触过的最令我崩溃的环境配置.之前没有考虑到vs2013 20 ...

  5. requestAnimationFrame兼容性扩展

    /** * requestAnimationFrame兼容性扩展,两方面工作: * 1.把各浏览器前缀进行统一 * 2.在浏览器没有requestAnimationFrame方法时将其指向setTim ...

  6. html list <==> unformatted list

    两者的区别很大不得不擦呢,任何两个东西的差别都很大,不得混淆.---一个有ul/ol的选择,一个没有

  7. win7系统中更新错误怎么解决的方法

    不少安装win7旗舰版系统的网友们都喜欢关注微软发布的一些消息,尤其是关于win7旗舰版系统的更新补丁时都会下载并安装的.可是不少网友在自动更新补丁的时遇到自动更新失败的问题,下面来介绍一下具体操作! ...

  8. 封装jquery时用到的东西

    顺序都是瞎拍的,就是明显分割用 1.将函数封装成$(' ')这种形式 把函数名起成$ $(各种选择器) $(selector) 2.有时候jquery可以继续加点,返回自己本身的元素 创建个构造函数, ...

  9. [saiku] JCR在saiku中的运用原理

    转载自: 什么是JAVA内容仓库(Java Content Repository)(1) 什么是JAVA内容仓库(Java Content Repository)(2) 什么是JAVA内容仓库(Jav ...

  10. Disney English

    项目大体流程是做几个页面的模板,然后后台用html改成phtml 但是后期连模板都要改掉,很多都无法考虑到复用 css很混乱,js已经忘记了