以constURL新闻稿的第一类,其值无法透过表达式或递增、递增来修正。在ANSI相容的C++中,下列标识符:
const int nochange; /* qualifies m as being constant */ nochange = 12; /* not allowed */C++会收起。但,能调用const表达式。因而,上面的标识符没问题:
const int nochange = 12; /* ok */该新闻稿让nochange正式成为黎贞表达式。调用后,就无法再发生改变它的值。能用constURL建立不容许修正的字符串:
const int days1[12] = {31,28,31,30,31,30,31,31,30,31,30,31};在操作符和实参新闻稿中采用const
新闻稿一般表达式和字符串时采用constURL很单纯。操作符则繁杂许多,即使要界定是限量发行操作符这类为const却是限量发行操作符对准的值为const。上面的新闻稿:
const float * pf; /* pf points to a constant float value */建立的pf对准无法被发生改变的值,而pf这类的值能发生改变。比如,能增设该操作符对准其它const值。相对而言,上面的新闻稿:
float * const pt; /* pt is a const pointer */建立的操作符pt这类的值无法更动。pt要对准同一门牌号,但它所对准的值能发生改变。上面的新闻稿:
const float * const ptr;表明ptr既无法对准别处,它所对准的值也无法发生改变。还能把const放在第3个位置:
float const * pfc; // same as const float * pfc;如注释所示,把const放在类型名之后、*之前,说明该操作符无法用于发生改变它所对准的值。简而言之,const放在*左侧任意位置,限量发行了操作符对准的数据无法发生改变;const放在*的右侧,限定了操作符这类无法发生改变。
constURL的常见用语是新闻稿为函数实参的操作符。比如,假设有一个函数要调用display()显示一个字符串的内容。要把字符串名作为实际参数传递给该函数,但字符串名是一个门牌号。该函数可能会更动主调函数中的数据,但上面的原型保证了数据不会被更动:
void display(const int array[], int limit);在函数原型和函数头,实参新闻稿const int array[]与const int * array相同,所以该新闻稿表明无法更动array对准的数据。
ANSI-C库遵循这种做法。如果一个操作符仅用于给函数访问值,应将其新闻稿为一个对准const限量发行类型的操作符。如果要用操作符更动主调函数中的数据,就不采用constURL。比如,ANSI C中的strcat()原型如下:
char *strcat(char * restrict s1, const char * restricts2);回忆一下,strcat()函数在第1个字符串的末尾添加第2个字符串的副本。这更动了第1个字符串,但未更动第2个字符串。上面的新闻稿体现了这一点。
对全局数据采用const
前面讲过,采用全局表达式是一种冒险的方法,即使这样做暴露了数据,程序的任何部分都能更动数据。如果把数据增设为const,就可避免这样的危险,因而用const限量发行符新闻稿全局数据很合理。能建立const表达式、const字符串和const结构(结构是一种复合数据类型,将在下一章介绍)。
然而,在文件间共享const数据要小心。能采用两个策略。第一,遵循外部表达式的常用规则,即在一个文件中采用定义式新闻稿,在其它文件中采用引用式新闻稿(用externURL):
/* file1.c — defines some global constants */ const double PI = 3.14159; const char * MONTHS[12] = {“January”, “February”, “March”, “April”, “May”, “June”, “July”, “August”, “September”, “October”, “November”, “December”}; /* file2.c — use global constants defined elsewhere */ extern const double PI; extern const* MONTHS[]; The second approach is to place the constants in an =include= file. Here, you must take the additional step ofusing the static external storage class: /* constant.h — defines some global constants */ static const double PI = 3.14159; static const char * MONTHS[12] = {“January”, “February”, “March”, “April”, “May”, “June”, “July”, “August”, “September”, “October”, “November”, “December”}; /* file1.c — use global constants defined elsewhere */ #include “constant.h” /* file2.c — use global constants defined elsewhere */ #include “constant.h”这种方案要在头文件中用URLstatic新闻稿全局const表达式。如果去掉static,那么在file1.c和file2.c中包含constant.h将导致每个文件中都有一个相同标识符的定义式新闻稿,C标准不容许这样做(然而,有些C++容许)。实际上,这种方案相当于给每个文件提供了一个单独的数据副本[插图]。由于每个副本只对该文件可见,所以无法用这些数据和其它文件通信。不过没关系,它们都是完全相同(每个文件都包含相同的头文件)的const数据(新闻稿时采用了constURL),这不是问题。
头文件方案的好处是,方便你偷懒,不用惦记着在一个文件中采用定义式新闻稿,在其它文件中采用引用式新闻稿。所有的文件都只需包含同一头文件即可。但它的缺点是,数据是重复的。对于前面的例子而言,这不算什么问题,但如果const数据包含庞大的字符串,就无法视而不见了。