const也会变,我们还能相信谁?

 在c++的世界里面,我们经常会见到一个方法的参数上面有个const修饰。通常的说法,也是这个const存在的目的,是为了防止传入的参数被意外改变。毕竟c++里面的指针太NB了,不防不行啊。只是,加了const就真的ok了吗?

让咱们来试试看吧:

 

下面这样的方法声明是非常常见的。
void TestConst(const char* str)
{
    str[0] = 'a';
}

编译一下,报错!提示说“不能给常量赋值”。嗯,到这里,还是很好的,const起到了作用。

 

再来:
void TestConst(const char* str)
{
    //str[0] = 'a';
    //既然不能像上面那样直接修改str,那我就取str的地址,然后用指针去改
    //像下面这行,我取出str的地址,然后再给char**
    char** c = (char**)&str;
   
    //现在可以改了,编译通过
    (*c)[0] = 'a';
}

 

到底起到作用没?让我们来试一下:
 void main(int argc, char* argv[])
 {
    char *t = "old";
    cout<<"t:"<<t<<endl;
    TestConst(t);
    cout<<"t:"<<t<<endl;
 }
 
编译通过,run!!
很不幸,这次程序竟然报错了,错误就在(*c)[0] = 'a'这行。说访问的那个地址发生冲突。
哦,貌似const还是起到作用了哦。
 
可是,真的是这样么?
这回再仔细看看程序,一步一步仔细看。先查t的指针,记下来。然后进入到TestConst函数里面,查str的指针,跟t一样。到这里,还是没有问题的。然后看*c的内容,跟str一样,也没有问题。
既然指针正确,没有出现非法指针的情况,那为什么还无法修改呢?const会有这么大的法力?

不能就这样放弃了,再仔细想想,好好想一想…………好像想起来,字符串是个很特别的东西,很多系统里面,字符串都是只读的,不能修改。如果要修改一个字符串,都是新开一块内存,创建一个新的字符串,然后把指针指向新的地址。
那,既然不让修改,我又非要修改,肯定就会发生冲突了。

 

为了验证这一点,我把TestConst的声明改成下面的样子,其他都不变:
void TestConst(char* str)
就是简单的去掉了const修饰。
按照先前的理解,这回好像可以修改str的内容了。

再次run。还是出现那个访问冲突的异常。

哈哈,这就明确了。无法修改str,是因为它就是个字符串,所以不能修改。

 

继续实验。这回把const修饰重新加回去,但是把main函数里面的第一行改一下,改成:
char t[4] = "old";

呵呵,这回就不是字符串了,应该就可以修改了,除非const能阻止我!

 

run一下,这次,程序没有再出错,我们清楚的看到了t从“old”变成了“ald”,真的被修改了。
const实效了!!!

 

结论:所以说,const,只不过是个假象而已,只要你想改,怎么改都可以。千千万万不要以为在参数上面加了const就可以高枕无忧了,其实,我们都被蒙了很多年……

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值