常量的样子与变量完全一样,只是常量的值不允许修改。可以使用 const 关键字来声明常量,如下面的例子所示:
int const a;
const int a;这两条语句都把 a 声明为一个整数,它的值是不能被修改的。两种写法没有实际差异,可以选择自己觉得更好理解的形式来进行书写,并坚持一直使用同一种形式。
当然,由于 a 的值无法修改,所以无法将任何东西赋值给它。如此一来,怎样才能让它在一开始就拥有一个值呢?这有两种方式:
- 可以在声明时对它进行初始化,如下所示:
int const a = 15;- 在函数中声明为 const 的形参在函数被调用时会得到实参的值。
当涉及指针变量时,情况就变得更加有趣,因为有两样东西都有可能成为常量——指针常量和它所指向的实体。下面是几个声明的例子:
int *pi;pi 是一个普通的指向整型的指针。而变量
int const *pci;则是一个指向整型常量的指针。可以修改指针的值,却不能修改它所指向的值。相比之下:
int * const cpi;则声明 cpi 为一个指向整型的常量指针。此时指针是常量,它的值无法被修改,但是可以修改它所指向的整型的值。
int const * const cpci;最后,在 cpci 这个例子中,无论是指针本身还是它所指向的值都是常量,不允许修改。
在声明变量时,如果变量的值不会被修改,应该在声明时使用 const 关键字。这种做法不仅使程序员的意图在其他程序阅读者面前得到更清晰的展现,而且当这个值被意外修改时,编译器能够发现这个问题。
#define 指令是另一种创建名字常量的机制,例如,下面这两个声明都为 50 这个值创建了名字常量:
#define MAX_LEN 50
int const max_len = 50;在这种情况下,使用 #define 比使用 const 变量更好。因为只要允许使用字面值常量的地方都能使用前者,比如声明数组的长度。而 const 变量只能使用在允许使用变量的地方。
名字常量非常有用,因为它们可以给数值起符号名,否则它们就只能修成字面值的形式。用名字常量定义数组的长度或限制循环的计数器能够提高程序的可维护性——如果一个值必须修改,只需要修改声明就可以了。修改一个声明比搜索整个程序修改字面值常量的所有实例要容易得多,特别是当相同的字面值用于两个或多个不同目的的时候。