在编程中我们常常会使用敞亮的概念,除了使用#define定义的宏之外,我们还有更好的选择,就是使用const关键字。

  1.const关键字的意义

  当我们定义一个变量,并且希望这个变量不再改变(编译器会做出优化),通常就会使用const限定符。

  1. const int i = ;//定义i==3的int常量i
  2. i = ; //非法操作,i是场量,值不可以更改

  定义一个常量时,必须对他初始化

  1. const int i;

  这样的定义就是非法的,不符合c++标准。编译器会报错。

  2.const 常量在文件内有效

  c++中,如果程序包含多个文件,而每个文件都需要使用某个const对象,c++ 规定需要在声明和定义是都加上‘extern’关键字。

  

  1. 1.c
  2.  
  3. #include <stdio.h>
  4. extern const int i;
  5.  
  6. int main()
  7. {
  8. printf("%d\n",i);
  9. }
  10.  
  11. 2.c
  12.  
  13. extern int i =;

  对上边两个文件分别用gcc和g++进行编译,结果gcc发出了一条警告,说i变量已被初始化,却又加上extern。可见c语言并不吃这一套。

  3 .const和 引用

  一般来说,应用类型必须和所引用的对象类型一致,但是const引用却是例外:

  1. double value = 1.23;
  2. const int &cval = value;//合法

这里有一个转换的过程,其实cval引用绑定在一个临时的变量上。编译器是这么处理的:

  1. const int tmp = value;// 隐式转换
  2. const int &cval = tmp;

  4.const和指针

  关于顶层const,和底层const的区别:

  1. int i=;
  2. const int* p = &i;// 不可以通过p指针修改i的值,底层const
  3. int* const p = &i;//p的值不可以修改,顶层const

  简而言之靠右的是顶层const,靠左的是底层const。

  5.const和编译器优化

  c++编译器往往会对const对象进行优化,编译器会把出现const对象的地方直接用常量值代替。

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. const int i =;
  7. int* p = const_cast<int*>(&i);
  8. *p=;
  9. cout << i << endl;
  10. }

  于是第9行 会被编译器 处理为 cout<< 3<< endl; 输出结果也就是了。

  但是我们可以使用volatile关键字通知c++编译器,我们的const对象的值是可以发生变化的,于是编译器就会很识趣的不再为你做出替代const对象的优化。

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. volatile const int i =;
  7. int* p = const_cast<int*>(&i);
  8. *p=;
  9. cout << i << endl;
  10. }

  于是输出结果就像意料的那样是4了。

  6.const和typedef

  当typedef给一个复合类型取别名时,用const对这个别名进行修饰时,const是对给定类型进行修饰,而不可以理解为简单的替换。 

  1. typedef int* pint;
  2. int i=;
  3. const pint p1 = &i;
  4. p1 = NULL;//非法,p1是常量指针
  5. *p1 = ;// 合法的,因为i的值不是const的

  pint是int* 的别名,是一个指向int的指针,因为const修饰的是类型,所以p1是一个 const指针。也就是 int* const p1,如果直接替换的话,就变成了const int* p1,顶层const变成了底层const,显然相去甚远!

const 用法总结的更多相关文章

  1. c++ const用法小结

    const用法 1,定义全局变量的内存分配问题 #define  Pi_1  3.14       //使用#define宏 const double Pi_2 = 3.14    //使用const ...

  2. const用法

    一.const作用 二.const用法 1.修饰一般常量   修饰符const可以用在类型说明符前,也可以用在类型说明符后. 例如: ; ; 2.修饰常数组  修饰符const可以用在类型说明符前,也 ...

  3. 【转】话说C语言const用法

    原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...

  4. static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符

    一.static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝  C++ Code  1 2 3 4 5 6 7 8 9 10 11 ...

  5. const用法详解(转)

    http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...

  6. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  7. C++的那些事:const用法面面观

    一.const是什么 在 C/C++ 语言中,const关键字是一种修饰符.所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码.就 con ...

  8. 【三支火把】---C语言const用法总结

    C语言关键字const相信对于不少C语言新手是既陌生又熟悉的,好像经常见,但是却不知道为何用,怎么用?学习至此,总结一下const的用法,使用程序来帮助你理解该关键字,希望能帮到像我一样的新手. 我看 ...

  9. typedef,static,const用法

    一.typedef主要功能是定义一个已存在类型的别名,但是和宏并存 宏与typedef区别 1.宏定义只是简单的字符串替换 2.typedef定义的类型是类型的别名,typedef后面是一个整体声明, ...

  10. C++中const用法详解

    本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...

随机推荐

  1. 【原创随笔】Sql2008 R2 做CQRS小结

    1.做数据同步,订阅服务器只要把数据库建好就可以了,至于表和存储过程以及其它的都不管,订阅的时候会自动创建这些信息. 2.选择事务发布(如果同步表,表至少要带主键,不然不能选择) 3.在发布的时候,用 ...

  2. Java数字图像处理基础 - 必读

    写了很多篇关于图像处理的文章,没有一篇介绍Java 2D的图像处理API,文章讨论和提及的 API都是基于JDK6的,首先来看Java中如何组织一个图像对象BufferedImage的,如图: 一个B ...

  3. PHP常规模板引擎中与CSS/JSON冲突的解决

    主要针对对象:Smarty/Dwoo 参考:http://developer.51cto.com/art/201009/224929.htm 其实以前都不怎么关注模板引擎,觉得没必要使用.但随着年龄的 ...

  4. [python拾遗]列表

    python列表拾遗 1.列表可以修改,使用 ‘+’ 将一个新列表附加在原列表的尾部: >>> a = [1,'a'] >>> b = a + [2,'b'] &g ...

  5. www.97top10.com--做最好的技术交流网站

    www.97top10.com--做最好的技术交流网站

  6. c++中string的常用函数说明

    string可以说是是字符数组的升级版,使用更加啊方便,不容易出错.本文对string的常用函数进行简单介绍,做到会用即可. string中的常用函数分为四类,即赋值,添加,比较和删除. 一.赋值 1 ...

  7. AngularJS 最常用的功能

    第一 迭代输出之ng-repeat标签ng-repeat让table ul ol等标签和js里的数组完美结合 1 2 3 4 5 <ul> <li ng-repeat="p ...

  8. iOS 开发技巧-制作环形进度条

    有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现. 先看一下这篇博客,博客地址:ht ...

  9. iOS label根据显示内容自适应大小

    - (void)setupLabel { //准备工作 UILabel *textLabel = [[UILabel alloc] init]; textLabel.font = [UIFont sy ...

  10. iOSQuartz2D-01-核心要点

    简介 作用 绘制 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件(通常为内部结构较复杂的控件) UIKit中的绝大部分控 ...