目前,我们讨论的是C++99和C89 的标准;
C语言
在C语言(C89标准)中, const 的特性:
const int size=10; //正确(常变量)
int array[size]={0} //错误(常变量不能用做数组下标)
C++语言
const int size=10; //正确(常量)
int array[size]={0} //正确
这是什么原因呢?其实是在C语言和C++语言中,两者的编译方式有区别:
(1)C语言中把const还当做变量编译;
(2)C++语言中凡是出现常量的地方(编译时初始化)均用值来替换。
由于const 对象一旦创建后其值就不能再改变,所以const 对象必须初始化。
const int i=get_size(); //正确,运行时初始化
const int j=42; //正确,编译时初始化
const int k;//错误,k未经初始化
如果利用一个对象去初始化另外一个对象,则他们是不是const都没有关系。
int i=42;
const int ci=i; //正确,i的值被拷贝给了ci
int j=ci; //正确,ci的值被拷贝给了j
ci 的常量特征仅仅在执行改变ci 的操作才会发挥作用。
总结:
(1)C++语言和C语言对const的定义不同,C++语言中定义为常量,C语言中定义为常变量;
(2)两个语言对const的编译方式不同(详细见上面)
(3)C++语言中常量有向常变量退化的可能;同时,常量的“常”只是体现在修改它的值时才会发挥作用。