默认情况下,const限定符仅在文件内有效
不同文件定义同名的const类型变量,默认为不同的定义。
如果希望不同文件共享同一个const变量,则这个const变量在声明和定义时都要加extern。
//file_1.cc定义并初始化了一个常量,该常量可以被其他文件访问
extern const int bufSize=fcn();
//file_1.h头文件
extern const int bufSize;//与file_1.cc定义的bufSize是同一个
const的引用
double dval=3.14;
double &k=dval;
const double &ri=dval;
k=0;
cout<<ri; //输出0
double dval=3.14;
double &k=dval;
const int &ri=dval;
k=0;
cout<<ri; //输出3
/*第二组ri绑定了一个临时量
**const int temp=dval;
**const int &ri=temp; */
对const的引用可能引用一个非const的对象
int i=42;
int &r1=i;
const int &r2=i;
r1=0;
r2=0; //错误
指针与const
常量的地址需要通过指向常量的指针储存
const int i=42;
const int *p=i;
也允许指向常量的指针指向非常量,但不允许通过指针修改对象的值
int i=42;
const int *p=i;
const指针:不变的是指针所指向的值而非指向对象的值
int errNum=0;
int *const curErr = &errNum; //curErr将一直指向errNum
//但是可以通过curErr改变errNum的值,如 *curErr=3;
const double p=3.14;
const double *const pip=&p; //pip是指向常量的常量指针
//pip所指对象的值和其所存地址的值都不能改变
顶层const
顶层const
狭义:指针本身是个常量
广义:表示任意的对象是常量
底层const
狭义:指针所指向的对象是常量
广义:与指针和引用等复合类型的基本类型部分有关
//例子
int i=0;
int *const pi=&i; //不能改变pi的值,顶层const
const int ci=42; //不能改变ci的值,顶层const
const int *p2=&ci; //允许改变p2的值,底层const
const int *const p3=p2; //靠右的顶层const,靠左的底层const
const int &r=ci; //用于声明引用的都是底层const
执行对象拷贝操作,顶层const不受影响;拷入拷出对象必须具有相同的底层const资格,或者两个对象的数据类型可以发生转换。一般来说非常量可以转化为常量,反之不行。
i=ci;
p2=p3;
//ci顶层const与p3顶层const无影响
int *p=p3; // 错误:p3包含底层const的定义,而p没有
p2=&i; //正确:int* 能转化成 const int*
p2=p3; //正确:p2与p3都是底层const
int &r=ci; //错误:普通的int&不能绑定到int常量上