一级棒
一级棒,猫哥的个人主页
一级棒 - 编程园地 - 编程感想 - const的使用中的缺陷
发表时间:2005-06-18 00:00:00 关键词:编程,C++,VC,MFC 点击:3792

  C++的const关键字,大家再熟悉不过了。一是用来声明常量,二是用来保护函数传递的参数。“const”这个关键字给我们直观的感觉是“永恒不变”,其实这只是一个假像。
  请看下面的代码:

void t(const int *p)
{
 int *q = (int *)p;//注意:int *q = p;将报错,不允许转换
 (*q) ++;
}

void r(const int &p)
{
 int &q = (int)p;//注意:int &q = p;将报错,不允许转换
 q ++;
}

void main(void)
{
 const int i = 3;
 int j = 3;
 printf("%d,%d\n",i,j);//3,3
 t(&i);
 t(&j);
 printf("%d,%d\n",i,j);//3,4
 r(i);
 r(j);
 printf("%d,%d\n",i,j);//3,5
}

  以上代码告诉我们两个结果:用const声明的常量能得到保护,而在函数参数表中用const声明的保护参数却有可能在函数中被修改。
  在两个函数中的注释说明以下问题:函数参数表中用const声明保护的参数“原则上”不允许改变,当你进行“int *q = p;”或“int &q = p;”时,虽然还没有改变它的值,VC编译器已经作出了报警,不允许出现这样的转换。VC不是不能转,而是不允许转。但是当你加入了显式的转化时,VC二话不说,给你转了。而且还成功地改变了它们的值。这说明,要真正保护函数的参数。不能全完依赖const。
  程序的运结果告诉我们:const声明的变量不会被改变。但是VC并没有报任何错。就像警察发现小偷偷东西时,只是看好了东西没让偷走,却没有对小偷说不。

  看猫哥的文章、听猫哥的语音,了解猫哥组织的各种采摘或旅游活动,请关注微信公众号《猫哥在线》,扫描以上二维码或者在微信中搜索“猫哥在线”、“maogezx”。
精选留言
以上留言由猫哥筛选后显示
本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
搜索
Copyright©2000 - 2022 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备15042862号-1