1、关于const 限定符的知识点
const表示不可改变的量!const用在变量定义时的类型前表示该变量不可改变,注意:该变量必须初始化(可以在运行时初始化)。
例子:
const int buf; 不合法,因为变量为初始化。
int cnt=0; 合法。
const int sz=cnt; 合法。
++cnt; ++sz; 不合法,变量sz是一个const变量,不能被改变。
2、指针与 const 的知识点:
(1)指向常量的指针:不能用于改变其所指对像的值。要想存放常量的地址,只能使用指向常量的指针。
(2)常量指针:指针自身是一个对象,不可变。int *const p = &pi (常量指针必须初始化,则他的值就不能改变了)
(3)指向常量的常量指针。const int *const p (不仅指针本身不可变,指针所指对象也不可变)
例子1:下面哪些初始化时合法的,理由?
a、int i=-1,&r=0;
b、int *const p2=&i2;
c、const int i=-1,&r=0;
d、const int *const p3=&i2;
e、const int *p1=&i2;
f、const int &const r2;
g、const int i2=i,&r=i;
解析:
a:引用r的赋值对象必须是一个对象,所以不合法
b:合法,将p2设为一个常量指针,初始化为i2对象的地址
c:合法,将i设为常量,r设置为常量的引用(注意const int &r = 0 是正确的,但是int &r = 0是不正确的)
d:合法,p3为指向常量的常量指针,初始值为i2的地址
e:合法,p1为指向常量的指针,初始值为i2的地址
f:使用不合法
g:合法,正常的赋值。
例子2:说明下面的定义是什么意思?
a、int i,*const cp;
b、int *p1,*const p2;
c、const int ic,&r=ic;
d、const int *const p3;
e、const int *p;
解析:
a:不合法,常量指针cp未初始化
b:不合法,常量指针p2未初始化
c:不合法,常量ic未初始化
d:不合法,常量指针p3未初始化
e:合法
例子3:假设上一个练习中的定义的那些变量,则下面的哪些语句是合法的?请说明原因。
a: i=ic;
b:p1=p3;
c:p1=⁣
d:p3=⁣
e:p2=p1;
f:ic=*p3;
解析:
a:合法
b:不合法,const int 和 int 不是一个类型,指向常量的指针在赋值时必须类型一致
c:不合法,原因和b相同
d:不合法,p3是一个常量指针,不能被再次赋值
e:不合法,p2是一个常量指针,不能被再次赋值
f:不合法,ic是个常量,不能被再次赋值
3、顶层const与底层const
知识点:
(1)顶层const:指的是本身不可以被改变(表示指针本身是个常量)。
(2)底层const:指的是自身所指对象不可以被改变(表示指针所指的对象是个常量)。
(3)用于声明引用的const都是底层const。
例子1:(1)const int v2=0; (2) int v1=v2; (3)int *p1=&v1,&r1=v1; (4)const int *p2=&v2, *const p3=&i,&r2=v2;
解析:
v2是顶层const;
p2是底层const;
p3最左是底层,右侧是顶层const;
其它都不是const;
知识点:顶层const的拷贝不受限制,但是底层const的拷贝的对象必须具有相同的底层const资格。一般来说:非常量可以赋值给常量,反之则不行。
例子2:假设以有上一个练习中所作的那些声明,则下面的哪些语句是合法的?请说明顶层const和底层const在每个例子中具体如何实现?
r1=v2;
p1=p2;p2=p1;
p1=p3;p2=p3;
解析:
a:合法;
b:不合法,p1是非常量,p2是常量,不能进行赋值操作;
c:合法;
d:不合法,p3既是底层也是顶层const,所以都得考虑到;
e:合法;