const的限定
const对象一旦创建后,其值就不可以改变,所以const对象必须初始化。与非const的类型比较,主要区别在于const类型对象执行但是不改变其操作内容。
在默认状态下,const只在文件内有效。在默认状况下,const定义的对象仅限定在文件类起作用,当多个文件中出现了同名的const时其实等同于在不同文件中分别定义了独立的变量。于是我们只在一个文件中定义const对象,而在其他文件中仅仅声明就可以。对于const对象不管是声明还是定义都加extern关键字,这样只需要定义一次就可以了。如下:
//在file1.h文件里面定义i
extern const int i=3; //将i定义为常量3
//在file2.h中引用i时只要声明就可以,避免重定义
extern const int i;
int a=i; //这样就可以使用i了
const的引用被称为对常量的引用(reference to const),引用类型必须与其所引用的对象保持一致,但是在这里有两个例外,第一个例外是在初始化常量引用时允许用任意表达式作为初始值。允许为一个常量引用绑定非常量对象,字面值,甚至是一个表达式:
int i=42;
const int &r1=i; //正确,此时r1与i绑定
const int &r2=42; // 正确,此时绑定一个字面值42
const int &r3=r1*2; //正确,r3是一个常量引用,绑定字面值84
int &r4=42; //错误,非常量引用不可绑定字面值
指向常量的指针不可以用于改变它所指的对象的值。要想存放指向常量的地址,必须使用指向常量的指针。
const int i=9;
int *p1=&i //错误,不可以用一个普通指针指向一个常量
const int*p2=&i; //正确,用常量指针指向常量
*p2=5; //错误,常量指针不可以改变所指向位置的值
常量指针(const pointer)必须初始化,一旦初始化完成,它指向的位置(存放的地址)就不在改变。
int i=4;
int j=5;
int *const p=&i; //p将一直指向i,p是一个常量指针
const int*p1=&j; //p1是一个指向常量的指针,注意const的位置