2.30:对于下面的这些语句,请说明对象被声明成了顶层const还是底层const?
const int v2=0; int v1=v2;
int *p1=&v1,&r1=v1;
const int *p2=&v2,*const p3=&i,&r2=v2;
Ans:v2是顶层const对象,p2是底层const对象,p3是顶层const也是底层const,r2是常量引用是底层const对象
2.31:假设已有上一个练习中所做的那些声明,则下面的哪些语句时合法的?请说明顶层const和底层const在每个例子中有何体现。
r1=v2; //合法,r1是一个普通的引用,v2是一个顶层const对象,拷贝过程中不影响。。
p1=p2; p2=p1; //前者p2是底层const对象,而p1是普通指针,用底层const对象p2去修改普通指针p1,显然是不合法的。后者p2是底层const对象,不是顶层const对象,因而可以修改p2指针本身的值。
p1=p3; p2=p3; //前者不合法,p3是顶层const对象也是底层const对象,而p1是普通指针,因此不合法。后者合法,p3是一个顶层const指针也是底层const指针,而p2是一个底层const,故合法。
2.32:下面代码是否合法?如果非法,请设法将其修改正确。
int null=0,*p=null;
Ans:非法。应修改为:int null=0,*p=&null;或者可以改成:int null =0,*p=nullptr;