const语法理解

 本篇主要写给对const语法理解存在误区的c++学习者,希望所有对这方面比较模糊的朋友可以阅读并从中找到一些答案。    
  。    
  2004-11-19   21:00    
  Const   最早想法是用于取代预处理器#define   这个宏,从而形成常量的概念。针对常量const对象,const指针及指向const的指针,函数const类型参数,const   函数返回类型,   const类成员,及const成员函数,及对const最后理解的一些总结来描述   const。    
  ①   const对象和const类型的对象    
  对于这两个概念的描述如下    
  1.   int   const   Object;   //Object是一个const量是不可以被修改   Object   =   2;Error    
  2.   const   int   Object;   //Object是   const   int型他所存放的内容不可以被修改    
  对于1,2这两种const用于对象,表述虽然不同但是效果是一样的。因为对象本身存放着内容对对象的改变就是对于对象内容的改变,同样改变后者也是在改变前者。所以语义上一样的。    
  ②   const指针   和   指向const的指针   及两者结合    
  对于三个概念描述如下    
  1.   int*   const   p;   //指针p是const不能被修改   例如p++;   //修改p本身会Error    
  //修改p指向内容   *p   =   2;   //OK    
  2.   const   int*   p;   //p是指向一个整形常量的指针指向的内容不可以改变   p++;//OK    
  //   *p   =   2;   //Error    
  3.   const   int*   const   p;   //指针p本身是不能被修改并且p所有有效的内容也不能被    
  //修改   *p   =   2;   Error   和   p++;   Error    
  ③   const   参数修饰   和   参数返回类型的const修饰    
  1.const   参数修饰    
  此时函数参数修饰   const的具体用法   ①   ②中用法是一样的    
  例如   void   Fun(   const   int   I   )   {   I++;}   //Error不能修改常量I    
  2.const修饰函数返回类型用法也是类似于   ①②中,仅仅修饰的对象变化变成一个返回对象    
  例如:const   int   Fun()   {   static   int   I;   return   I;}    
  int   Res   =   (Fun())++   //Error不能修改常量返回对象    
  ④   const类成员   和   const   成员函数    
  1.   const成员    
  类const成员在构造期间会允许被初始化并且在以后不能被改变。我们就可以知道类const成员和一般const   变量是有所不同的,类const成员是对应于每个对象而言才有意义。因为他在构造期被初始化,只有当类实例化后才会进行构造。所以类const成员可以这样描述:   在类的每一次实例化时被初始化,在这个对象的生存周期中不可改变。    
  2.   const   成员函数    
  描述:   void   Class::MemberFun()   const   {};   //此时这个const修饰的this所有类成员变量都不允许在这个函数体作用后被修改。这在设计上会带来一些好处,能防止你意外的处理带来的问题。    
  总结:    
  <1>   const   常量   一般编译器不会分配空间只是维护一张表。而当extern   外部引用这个常量或者“&”对这个常量取地址时,编译器才会为其分配地址。Const本身的机制比较复杂。    
  <2>   const   记忆法则   const修饰后面一个最近的名称。我曾初学的时候被const   修饰搞的糊里糊涂,后来慢慢的总结我觉得这样理解最容易的。    
  例子:   const   int   I;   此时const仅仅修饰int   表明   I不是一个常量但是I的内容是常量。因为c/c++表达   对I的改变就是对I内容的改变所以   I也类似一个const。大家不妨可以用指针const修饰试试理解会有帮助的我想。    
  <3>   对于所有非const   类型可以无条件转化为   const类型,但是后者不能自动转化为前者除非显式的强制转化去掉const性。这样做是有意义的,因为const类型是非const的一个子集是一种特殊,由普遍转化为特殊是合理的,就象模板特化,继承的向上映射都是有意义的。    
  <4>   记住所有const修饰的内容并不是永远不可改变,如果人为的强制转化编译器是不会提醒的。因为它没有义务这么做,所以我们对其转化时要小心。    
  <5>   在const类成员函数处理时,我们引入了mutable修饰类成员变量,经过其修饰的成员变量可以在const类成员函数中被修改,编译器是允许的。而其他未被mutable修饰的成员还是按照const规则不能在const成员函数中被改变。    
   
  《结束》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值