关于const的几点说明

原创 2006年05月23日 14:09:00

const
1. 限定符声明变量只能被读
    const int i=5;
    int j=0;
    ...
    i=j;   //非法,导致编译错误
    j=i;   //合法
2. 必须初始化
    const int i=5;    //合法
    const int j;      //非法,导致编译错误
3. 在另一连接文件中引用const常量
    extern const int i;     //合法
    extern const int j=10;  //非法,常量不可以被再次赋值
4. 便于进行类型检查
    用const方法可以使编译器对处理内容有更多了解。
    #define I=10
    const long &i=10;   /*dapingguo提醒:由于编译器的优化,使得在const long i=10; 时i不被分配内存,而是已10直接代入以后的引用中,以致在以后的代码中没有错误,为达到说教效果,特别地用&i明确地给出了i的内存分配。不过一旦你关闭所有优化措施,即使const long i=10;也会引起后面的编译错误。*/
    char h=I;      //没有错
    char h=i;      //编译警告,可能由于数的截短带来错误赋值。
5. 可以避免不必要的内存分配
    #define STRING "abcdefghijklmn/n"
    const char string[]="abcdefghijklm/n";
    ...
    printf(STRING);   //为STRING分配了第一次内存
    printf(string);   //为string一次分配了内存,以后不再分配
    ...
    printf(STRING);   //为STRING分配了第二次内存
    printf(string);
    ...
    由于const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有
若干个拷贝。
6. 可以通过函数对常量进行初始化
    int value();
    const int i=value();
    dapingguo说:假定对ROM编写程序时,由于目标代码的不可改写,本语句将会无效,不过可以变通一下:
    const int &i=value();
    只要令i的地址处于ROM之外,即可实现:i通过函数初始化,而其值有不会被修改。
7. 是不是const的常量值一定不可以被修改呢?
    观察以下一段代码:
    const int i=0;
    int *p=(int*)&i;
    p=100;
    通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值。
8. 请分清数值常量和指针常量,以下声明颇为玩味:
    int ii=0;
    const int i=0;            //i是常量,i的值不会被修改
    const int *p1i=&i;        //指针p1i所指内容是常量,可以不初始化
    int  * const p2i=ⅈ     //指针p2i是常量,所指内容可修改
    const int * const p3i=&i; //指针p3i是常量,所指内容也是常量
    p1i=ⅈ                  //合法
    *p2i=100;                 //合法

不知道这里有没有说清楚,希望回给浏览帖子的人一些帮助!

关于const reference的几点说明

几天前,在程序中遇到一个问题,当我检查程序错误时,在STL实现中发现了类似下面的代码:#include using namespace std;class A{public:    A(const s...
  • billdavid
  • billdavid
  • 2004年11月10日 21:14
  • 1517

const 有什么用途?(请至少说明两种)

答: (1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东 西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。...
  • u010648606
  • u010648606
  • 2014年05月17日 14:35
  • 1287

面试官过来谈几点面试过程中的体会

工作这些年,从最初从学校毕业找工作被别人面再到现在面试别人,
  • carolzhang8406
  • carolzhang8406
  • 2014年10月02日 10:05
  • 718

关于软件测试的几点反思 - 测试是必需的吗?

对比而言,我们其实也可以粗略的发现,测试做的深入程度很多时候是和这个企业的定位有关,而不是和测试人员的能力有关。或者应该来说,长期来看,取决于这个方面。因为有人员的流动和发展,对比下国内几个大的互联网...
  • superqa
  • superqa
  • 2014年03月17日 20:43
  • 5032

年终未必有奖金

点击上方“CSDN”,选择“置顶公众号”关键时刻,第一时间送达!薪资总是与能力相匹配,能拿高薪的程序员就必然有着过人之处。然而,很多程序员薪水达到一定级别之后就会遇到天花板,他们发现加薪幅度越来越小,...
  • csdnnews
  • csdnnews
  • 2018年01月25日 00:00
  • 3904

给一道关于const的面试题

/*题目:请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变 A.const int const *x = &y; B.int * const x = &y; C.const int ...
  • derkampf
  • derkampf
  • 2016年06月07日 22:00
  • 510

关于Flash的几点思考(Thoughts on Flash)

苹果与 Adobe 的关系由来已久。Adobe 的创始人还在那如今已成传说的车库中工作时,我们就已经认识了。苹果是他们的第一个大客户,将他们的 Postscript 语言改为我们当时新推出的 La...
  • guangegwi
  • guangegwi
  • 2015年10月21日 11:51
  • 532

c语言中const的几点说明

(一)关于const的基本说明:   百度百科里面说“const是一个C语言的关键字,它限定一个变量不允许被改变。”我觉得这个解释不妥,const只是说明这个变量是“只读”的,确切的说是这个变量只是...
  • qixiantong_123
  • qixiantong_123
  • 2013年02月21日 21:12
  • 131

关于ESB实施的几点建议

作者 马国耀 前言 谈及企业服务总线(ESB),在有面向服务的架构(SOA)实施经验的开发者眼中一定不会陌生。这些年,人们一直在谈论它,以至有些人认为“实施SOA一定需要E...
  • zuoys
  • zuoys
  • 2013年07月03日 14:19
  • 592

关于java线程安全问题

线程:负责一个进程中的代码执行。线程是进程中的一个执行路径。 线程安全问题出现的根本原因: 1. 存在着两个或者两个以上的线程。 2. 多个线程共享了着一个资源, 而且操作资源的代码有多...
  • q739404976
  • q739404976
  • 2017年01月14日 16:03
  • 132
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于const的几点说明
举报原因:
原因补充:

(最多只允许输入30个字)