zoukankan      html  css  js  c++  java
  • 【C/C++学习】之三、const_cast

    用法:const_cast<type_id> (expression)


    此运算符是用来消除类型的const和volatile属性的。


    看到const_cast的你应该知道,他是用来转换掉表达式的const性质的。对也,只有使用我们的const_cast才能将const性质转换掉!

    ok,我们来看一段代码:

    	const char m = 't';
    	const char *cm = &m;
    	char *n = const_cast<char*>(cm);
    	*n = 'a';
    	cout << *n << endl;

    很好,代码编译通过,你应该能看的出来,他的结果不应该是‘t'吧,对的  最后的输出结果是’a',我们给n指针所指向的变量重新变了值了~  很好,这就是我们的const_cast的功劳!


    但是如果是这样:

    	const char m = 't';
    	const char *cm = &m;
    	char *n = cm;
    	*n = 'a';
    	cout << *n << endl;

    很悲剧,无法编译通过!


    看到上面两段代码大家应该稍微有点明白了吧,但是再看下面:

    	const char m = 't';
    	const char *cm = &m;
    	char *n = (char*)cm;
    	*n = 'a';
    	cout << *n << endl;

    oh。。编译也是通过的,而且最后的结果还是a~~,这是为什么呢 ?

    其实,在C++中,指针之间的转换是不检查类型的,他们是任意转换的,什么指针都可以转换!

    就是这样!


    哦 对了,const_cast是不能用来执行任何类型的转换的,这样都会引起编译错误的!

    	const char m = 't';
    	const char *cm = &m;
    	int *n = const_cast<int*>(cm);
    	*n = 'a';
    	cout << *n << endl;

    很不幸,这段代码报错了,看一下错误提示:


    oh~ 确实是这样的!



    说到这里我想说一下,绝对不要去修改const变量的值,  但是这样说的话要const_cast有什么用呢?

    在这里《C++Primer 第四版》中有一个例子,假设有一个函数s,他有一个唯一的参数是char*类型的,我们对他只读,不写! 在访问这个函数的时候,我们最好的选择是修改它让它接受const char*类型的参数!  但是如果不行的话 我们就要用const_cast,用一个const值调用s函数了!

    void s(char *)
    {
    	cout << 'a' << endl;
    }
    
    	char a = 's';
    	const char *ss = &a;
    	s(const_cast<char*> (ss));

    ok,我们编译通过了!



    不过我在写代码的时候const_cast 用的很少!





    -----------2012/8/4

    -----------jofranks 于南昌


  • 相关阅读:
    微信小程序 组件事件传递
    vue 项目引入字体报错
    vue 单文件 样式写了scoped 不能覆盖框架原有样式的解决办法
    react 动态获取数据
    百度地图marker点击任意一个当前的变化,其余的marker不变
    对象字面量中可以使用中括号作为属性,表示属性也能是一个变量
    二维数组转化为一维数组 contact 与apply 的结合
    一个对象如何复制给另一个对象,互不影响
    在-for 循环里面如何利用ref 操作dom
    mac 进程管理
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211438.html
Copyright © 2011-2022 走看看