常量定义语句const范文

上传人:大米 文档编号:497864121 上传时间:2022-09-11 格式:DOC 页数:11 大小:57.50KB
返回 下载 相关 举报
常量定义语句const范文_第1页
第1页 / 共11页
常量定义语句const范文_第2页
第2页 / 共11页
常量定义语句const范文_第3页
第3页 / 共11页
常量定义语句const范文_第4页
第4页 / 共11页
常量定义语句const范文_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《常量定义语句const范文》由会员分享,可在线阅读,更多相关《常量定义语句const范文(11页珍藏版)》请在金锄头文库上搜索。

1、篇_:const常量与define宏定义的区别(1) 编译器处理方式不同define宏是在预处理阶段展开。const常量是编译运行阶段使用。(2) 类型和安全检查不同define宏没有类型,不做任何类型检査,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查。(3) 存储方式不同define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)。(4) const可以节省空间,避免不必要的内存分配。例如Sdefine PI 14159 /常量宏const doulbe Pi二 14159; /此时并未将 Pi 放入 ROH

2、 中double i=Pi; /此时为Pi分配内存,以后不再分配!double I二PI; /编译期间进行宏替换,分配内存double j二Pi; /没有内存分配double J二PI; /再进行宏替换,又一次分配内存!const左义常量从汇编的角度来看,只是给岀了对应的内存地址,而不是象#define -样 给岀的是立即数,所以,const 义的常量在程序运行过程中只有一份拷贝,而#define泄 义的常量在内存中有若干个拷贝。(5) 提髙了效率。编译器通常不为普通const常量分配存储空间,而是将它们保存在符 号表中,这使得它成为一个编译期间的常戢,没有了存储与读内存的操作,使得它的效率也

3、 很髙。const与#define的比较C+语言可以用const来圧义常虽,也可以用define来左义常量。但是前者比后者有 更多的优点(1)const常疑有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安 全检查。而对后者只进行字符替换,没有类型安全检査,并且在字符替换可能会产生意料不 到的错误(边际效应)。(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。1【规则5-2-1在C+程序中只使用const常星而不使用宏常量,即const常量完全 取代宏常量。3常量左义规则1【规则5-3-1需要对外公开的常量放在头文件中,不需要对外公开的常量放在左义 文

4、件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。1【规则5-3-2如果某一常量与其它常量密切相关,应在泄义中包含这种关系,而不 应给岀一些孤立的值。例如const float RADIUS二100;const float DIAMETER二RADIUS * 2;4类中的常量有时我们希望某些常量只在类中有效。由于define定义的宏常量是全局的,不能达到 目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的, 但苴含义却不是我们所期望的。const数拯成员只在某个对象生存期内是常量,而对于整个 类而言却是可变的,因为类可以创建多个对象,

5、不同的对象n const数据成员的值可以不同。不能在类声明中初始化const数据成员。以下用法是错误的,因为类的对象未被创建时, 编译器不知道SIZE的值是什么。class Aconst int SIZE二100; /错误,企图在类声明中初始化const数据成员int array SIZE; /错误,未知的SIZE;const数据成员的初始化只能在类构造函数的初始化表中进行,例如class AA(int size) ; / 构造函数const int SIZE ;;A: A(int size) : SIZE (size) /构造函数的初始化表 A a (100); / 对象 a 的 SIZE

6、值为 100A b(200): / 对象 b 的 SIZE 值为 200怎样才能建立在整个类中都恒泄的常量呢?别指望const数据成员了,应该用类中的枚 举常量来实现。例如class Aenum SIZE1=1OO, SIZE2二200 ; / 枚举常量int arraylSIZE1;int array2SIZE2;枚举常疑不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是它的 隐含数据类型是整数其最大值有限,且不能表示浮点数(如PI=14159)O sizeof(A)=1200; 其中枚举部长空间。篇二:C+语言中const关键字用法总结C+语言中const关键字用法总结一、c

7、onst是什么在C/C+语言中,const关键字是一种修饰符。所谓“修饰符”,就是在编译器进行编 译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码。 就const修饰符而言,它用来告诉编译器,被修饰的这些东西,具有“只读”的特点。在编 译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。所以,const修饰符的作用主要是利用编译器帮助我们检査自己代码的正确性。我们使 用const在源码中标示出“不应该改变”的地方,然后利用编译器,帮助我们检査这些地方 是否真的没有被改变过。如果我们不小心去修改了这些地方,编译器就会报错,从而帮助我 们纠正错误。

8、使用const和不使用const,对于最终编译产生的代码并没有影响。虽然const对于最终代码没有彫响,但是尽可能使用const,将帮助我们避免很多错误, 提高程序正确率。二、const可以修饰哪些对象在上而已经提到过了,const是一种修饰符,那它可以作为哪些对象的修饰符呢?下而 列举了一些C/C+中用到const的地方。1, const 变量2, const 指针3, const 引用4, const 类5, 类的const成员变量6, 类的const成员函数7, const修饰函数的形参与返回值下面我们分别讨论上面几种情况下,const的用法。三、const与变量当一个变量被const修

9、饰后,具有以下几个特点1)该变量只能读取不能修改。(编译器进行检查)2)泄义时必须初始化。3)C+中喜欢用const来上义常量,取代原来C风格的预编译指令defineo 1 const int var; / Error:常量变量var需要初始化设泄项2 const int varl=42;3 varl二43; / Error表达式必须是可以修改的左值上面代码中第一行和第三行都有错误,注释便是编译器给出的错误提示。另外注意,在使用const变量作为数组的下标时,变量的值一左要是一个常量表达式(在 编译阶段就能计算得到结果)1 const int sz=42;2 int iArsz;3 const

10、 int szl二sizeO; / sizeO必须是一个返回常量的函数4 int iAriszl;55 int var=42;6 const int sz2=var;7 int iAr2sz2; / errorsz2只有运彳亍时才知道值四、const与引用我们知道,引用必须在左义的时候赋值,这样就会所引用的变量绑龙在一起并作为它的 一个别名,在程序中的其他地方,是不能让引用再与其他对象绑泄。这个特性,让引用看起 来就像是const对象一样,一旦泄义后将不能更改。所以并不存在const的引用。但是我们却可以引用一个const的对象(变量),我们称之为对常量的引用,与普通的引 用不同的时.对常量的

11、引用不能被用作修改它所绑左的对象。1 const int ci二1024;2 const int &rl=ci;3 rl=42; / Errorrl是对常量的引用4 int & r2二ci; /Error不能将一个非常呈:引用指向一个常量的对象我们知逍,引用的类型必须与其所引用对象的类型一致,如下而的代码double dval二14;int& ri=dval; / Error无法用double类型的值初始化int&类型的引用(非常量限泄) 上述代码为何不行?此处ri引用了一个int型的整数。对于ri的操作数应该是整数运算,但是dval却是一 个双精度的浮点数而非整数。因此为了确保让ri绑泄一个

12、整数,编译器把上述代码变成了如 下形式double dval=14;int temp=dval;int& ri=temp;其中temp是一个临时变量,而ri绑左了一个临时量,所以当ri改变时,并没有改变 davl的值,所以这种引用是无效的。也许你注意到了,当我们把double变量绑定在一个int&类型上时,编译器提示后有个 括号非常量限立。这说明如果是一个常虽的引用,则有可能是通过的,显然下而的代码就没 有任何问题double dval=14;const int& ri二dval;因为在这里,ri是一个常量引用,我们并不想通过ri改变dval的值,只要能读到dval 对应的int型的值就行。五

13、、const与指针我们知道,指针与引用不同,指针本身是一个对象,所以存在常量指针,这种指针在定义并初始化后,便不能再指向英他变量。用来修饰这种常量指针的const,我们称之 为顶层const。与顶层指针对应的是底层指针,这种指针指向一个const修改的对象,这一点上就有点 像是常量的引用。对于指向常量的指针或引用,都有以下规则1)可以将一个非const对象的地址赋给一个指向const对象的指针2)可以将一个非const对象的地址赋给一个指向非const对象的指针3)可以将一个const对象的地址赋给一个指向const对彖的指针4)不可以将一个const对象的地址赋给一个指向const对象的指针

14、。1 int var;2 const int ci二42;33 int *pl二& var;4 int *p2二&ci; / Error, const int* 不能用于初始化 int*5 const int *p3=&var; /ok6 const int *p4=&ci; /ok还有一种指向const对象的const指针,这种指针首先表明,本身是一个const指针, 一旦初始化后不能指向其他对象;其次.它本身所指向的对象也是一个常量,即不能通过指 针修改对象的值。const int var=42;const int* const p二&var;这里再强调一点,const只是给编译器看的,我

15、们可以很轻松的骗过编译器,并看看编 译器都做了什么1 const int var=42;2 int* p二(int*)&var;3 *p=20;4 cout var endl; /425 cout *p endl; /20我们在代码的第2行,用一个类型转换强制的,把一个非const指针指向了一个const 对象。但是后而我们通过这个指针来修改这个值,却没有生效,原因呢?那是因为编译器在编译阶段发现var是一个常量,所以在编译目标代码时已经将var的 地方都用42进行了替换。六、const与类其实类泄义的对象,与普通的变量是一样的,用const修饰时,说明这个类是一个常量 类对象,这个对象有下面2个特点1)不能改变其成员变量(非mutalbe成员)2)不能调用英非const成员函数1 class AClass2 public:3 int m_var;4 mutable int m_mutable_var;5

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号