###const常量#
我们通过const修饰变量来定义常量,const对象一旦创建完成就不允许修改,const对象必须初始化。
const int a = 100; //正确
a = 10; //错误,const对象不允许修改
const int b; //错误,const对象必须初始化
默认情况下,const对象只在文件内有效,如果需要在其他文件中使用该对象,则需在定义和声明处均添加extern关键字,这点和变量不同。
//file1.h文件定义了常量a;
extern const int a=100;
//file1.cpp文件声明了常量a,与file1.h中的是同一个;
#include "file1.h"
extern const int a;
###const的引用#
把引用绑定到const对象上,称为对常量的引用。
const int a = 100;
const int &b = a;
允许把对const的引用绑定到非常量上,但不允许通过对const的引用来修改非常量的值。
int a = 100;
const int &b = a; //正确,允许把对const的引用绑定到非常量上
b = 10; //错误,不允许通过对const的引用修改非常量的值
不允许把普通引用绑定到const对象上,因为试图通过引用修改const对象。
const int a = 100;
int &b = a; //错误,不允许把普通引用绑定到const对象上
严格上来讲,不存在常量引用,因为引用本身不是一个对象,但是程序员常常将对const的引用称为常量引用。
###指向常量的指针和常量指针#
指向常量的指针:
同引用一样,指向常量的指针不允许修改所指对象的值,想要存放常量对象地址,只能使用指向常量的指针。
const int a = 100;
int *b = &a; //错误,b是一个普通指针
const int *c = &a; //正确,c是一个指向常量的指针
*c = 10; //错误,不能通过c来修改常量a
同绑定const的引用一样,指向常量的指针可以指向非常量对象,指向常量仅代表不允许通过该指针修改对象的值,但没有规定所指对象必须为常量。
指向常量的指针还可以更改所指对象,但不允许修改所指对象的值。
const int a = 100;
int b = 10;
const int *c = &a;
c = &b; //正确,允许修改所指对象,允许指向非常量对象
常量指针:
指针是对象,所以允许把指针本身定义为常量,常量指针不允许修改指针的值,但是允许通过指针修改所指对象的值。
int a = 100;
int *const b = &a;
*b = 10; //正确,允许通过常量指修改所指对象的值
int c = 10;
b = &c; //错误,不允许修改指针本身的值
顶层const:
我们用顶层const来表示对象本身是常量,底层const则与指针引用等复合类型的基本类型部分有关。
同其他类型相比,指针类型既可以是顶层const,也可以是底层const。
int a = 100;
int *const b = &a; //不能修改b的值,b是一个顶层const
const int d = 10;
const int *c = &d;
c = &a; //可以修改c的值,c是一个底层const