const 限定符 学习小结(1)
1)不能被修改
const bufsize = 512;
buffsize在定义时必须初始化;定义处之外无法修改buffsize的值
2)只能在定义它的文件中使用
file_1.cpp
extern const int bufsize =512;
file_2.cpp
extern const int bufsize;
通过指定const对象为extern,才能在其他文件中被访问。否则只能在file_1.cpp中被访问。
3)指向const对象的指针
const double *cptr; // cptr为指向double型的const对象的指针
cptr可以改变,但是指向的类型不可以改变,为const double型
eg.const double pi = 3.14;
const double *cptr = &pi ;
为什么要有指向const对象的指针? 因为指向const对象的指针不会改变其所指对象的值。但是它又可以
指向别的对象。
4) 可以避免不必要的内存分配
#define STRING "abcdefghijklmn\n"
const char string[]="abcdefghijklm\n";
...
printf(STRING); //为STRING分配了第一次内存
printf(string); //为string一次分配了内存,以后不再分配
...
printf(STRING); //为STRING分配了第二次内存
printf(string);
...
由于const定义常量从汇编的角度来看,只是给出了对应的内存地址,
而不是象#define一样给出的是立即数,所以,const定义的常量在
程序运行过程中只有一份拷贝,而#define定义的常量在内存中有
若干个拷贝。
5) const修饰指针的情况,见下式:
int b = 500;
const int* a = & [1]
int const *a = & [2]
int* const a = & [3]
const int* const a = & [4]
我们可以参考《Effective
c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的
右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无
关),这种情况下不允许对内容进行更改操作,如不能*a = 3
;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。