const常量的定义及初始化
当我们需要定义一种不能被改变的变量时,可以用关键词const对变量加以限定,将变量声明为常量。需要注意的是,const对象必须进行初始化操作,并且初始化后其值不能再改变。
const int a=10;//创建并初始化常量
const int b=get_size();//正确,初始化操作可以为复杂的表达式
const int c;//错误,常量未进行初始化
其次,在不改变const对象的前提下,利用一个对象去初始化另一个对象时,它们的const属性被忽略不计。
int a=10;//a不是常量
const int b=a;//正确,可以用非常量值初始化常量对象
int c=b;//正确,可以用常量对象初始化非常量对象,const在此处被忽视
const的引用
可以定义常量引用(其实是对常量的引用),需要注意的是,常量引用不能用作修改其所绑定的对象的值,这点与普通引用不同。其次,如需要对常量进行引用,必须将其声明为常量引用。??注意,引用本身并不是一个对象,只是被引用对象的一个别称!!!
const int a=10;
const int&i=a;//对常量的引用
i=20;//错误,不能修改常量引用所绑定的值
int&j=a;//错误,a为常量,需将j声明为常量引用
需要注意的是,声明为常量引用仅仅限定了引用可参与的操作,其绑定的对象并不一定非得是常量。但不管怎样都不允许通过常量引用修改其所绑定的对象的值!
int a=10;
const int&i=a;//正确,常量引用所绑定的对象并非一定是常量
i=20;//错误,不允许修改常量引用绑定的对象的值
const的指针
指向常量的指针
可以定义指向常量的指针来存放常量对象的地址。注意,只能使用指向常量的指针来存放常量对象的地址!其次,与常量引用(对常量的引用)一样,指向常量的指针所指的对象也可以是非常量,但不管怎样都不允许通过指向常量的指针修改其所指向的对象的值!
const int a=10;
int b=20;
int*ptr1=&a;//错误,不能用普通指针存放常量对象的地址
const int*ptr2=&a;//正确,ptr2是指向常量的指针
*ptr2=20;//错误,不能改变指向常量的指针所指向的对象的值
const int*ptr3=&b;//正确,指向常量的指针所指的对象也并非一定是一个常量
常量指针
与引用所不同的是,指针本身是一个对象,因此,指针可以本定义为常量指针,与其他常量对象一样,常量指针必须被初始化,并且一旦初始化后就不能再改变。??注意,常量指针本身是一个常量对象!!!
int a=10;
int b=20;
int*const ptr1=&a;//正确,定义常量指针并初始化
ptr1=&b;//错误,常量指针一旦被初始化就不允许改变
*ptr1=20;//正确,可通过常量指针修改所指非常量对象的值
需要注意的是,常量指针的const含义仅仅指明自身是一个常量对象,自身的指一旦初始化后就不允许改变,但并不未规定不能通过常量指针修改其所指对象的值,能否修改常量指针所指对象的值完全取决于被指对象本身。下面,来看看这个例子:
const int b=20;
const int*const ptr2=&b;//正确,ptr2是指向常量对象的常量指针
*ptr2=30;//错误,不可通过任何途径修改常量对象(b)的值
顶层const和底层const
顶层const表示指针(可以是其他任意对象)本身是一个常量底层const表示指针所指对象是一个常量
int a=10;
int b=20;
int*const ptr1=&a;//顶层const
ptr1=&b;//错误,不允许改变常量指针的值
const int c=30;//顶层const
const int*ptr2=&c;//底层const,允许改变ptr2的值
const int*const ptr3=&c;//个const是底层const,第二个const是顶层const
const int&i=c;//用于声明引用的const都是底层const!
??注意,由于引用本身并不是一个对象,因此用于声明引用的const都是底层const!
常量表达式
常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式,一个表达式(对象)是不是常量表达式有它的数据类型和初始值共同决定。
const int a=10;//a是常量表达式
const int b=a+10;//b是常量表达式
int c=30;//c不是常量表达式,因为不是const
const int d=get_size();//d不是常量表达式,因为初始值要运行时才能获取到
可以用constexpr将变量声明为常量表达式。声明为constexpr的变量一定是常量,且必须用常量表达式初始化。
constexpr int a=10;//20是常量表达式
constexpr int b=a+10;//a+10是常量表达式