1、值替代
C语言中预处理器用值代替名字:
#define BUFSIZE 100
这种方式在C++中依然适用,同时
C++用const把值代替带进编译器领域:
const bufsize = 100 ;或 const int bufsize = 100 ;
同时还可以执行常量折叠:
char buf[bufsize] ;
1.1 头文件里的const
与使用#define一样,使用const必须把const定义放在头文件里。这样,通过包含头文件,可把const定义单独放在一个地方,并把她分配给一个编译单元。const默认为内部连接,即仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到。
比如说在Test.h中定义了,
const int nTestConst = 1000;
在A.cpp中include"Test.h"
同时在B.cpp中include"Test.h"
不会出现,当没有定义为const时,因变量定义出现两次而出错的情形.
当定义一个const常量时,必须赋一个值给它,除非用extern作了清楚的说明:
extern const bufsize ;
虽然上面的extern强制进行了存储空间分配,但C++编译器并不为const分配存储空间,相反它把这个定义保存在它的符号表里。当const被使用时,它在编译时会进行常量折叠。
1.2 const的安全性
如果想要一个值保持不变,就应该使它成为一个常量(const)。
1.3 集合
const可以用于集合,但必须分配内存,意味着“不能改变的一块存储”。但其值在编译时不能被使用。
const int i [] = {1,2,3,4};
// float f [ i [3] ]; // Illegal
2,指针
当使用带有指针的const时,有两种选择:1、或者const修饰指针正指向的对象,2、const修饰存储在指针本身的地址。
2.1 指向const的指针
使用指针定义的技巧,正如任何复杂的定义一样,是在标识符的开始处读它并从里到外读。如果我们要使正指向的元素不发生改变,得写:
const int * x;
从标识符开始:“x 是一个指针,指向一个const int。”
把const从一边移到另一边,结果一样。
int const * x;
2.2 cosnt指针
是指针本身成为一个const指针,必须把const标明的部分放在*的右边,如:
int d = 1;
int * const x = &d;
指针本身是const指针,编译器要求给它一个初始化值,这个值在指针寿命期间不变。然而要改变它所指向的值是可以的,可以写*x = 2。
这些可以总结成这样一句话:
以*为分界点,
当const在*的左边时,实际物体值不变
当const在*的右边时,指针不变,
即,左物右指
这样来记比较方便!!