C++常量详解一(常量指针与常量引用的初始化)
1、常量
1.1、常量的初始化:
const对象一旦创建后其值就不能再改变,所以const对象必须初始化。这里我们要注意一点,像constint*p和constint&r都并不是const对象。因为constint*p只是表示不能通过p改变p所指的对象的值,p的值是可以变的,所以p可以不用初始化。至于r,引用本身就不是对象,所以r也并不是const对象,r之所以一定初始化,是因为引用必须初始化。对于以上内容,你也可以理解为底层const修饰的并不是const对象,还要注意像constint*constp1这种,这是一定要初始化的,这是const对象,因为它有一个顶层const。
1.1.1分清了const对象后,让我们先把目光聚集到const对象这里。
const对象可以分为大致三类:
constintm int*constp constint*constq
而这前两类都可以用来给非const对象或者const对象初始化,因为这前两类都是顶层const,初始化时的拷贝是不会对他们的自身值做出什么改变,即以下代码均正确。
//第一类 intm1=m;//正确 constintm2=m;//正确 //第二类 int*p1=p;//正确 int*constp2=p;//正确 constint*p3=p;//正确 constint*constp4=p;//正确
而第三类则需要我们注意一下,因为第三类还有一个底层const。
constint*constq
int*q1=q;//报错 int*constq2=q;//报错 constint*q3=q;//正确 constint*constq4=q;//正确
底层const有一个限制:当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const。
我们可以这样理解:constint*constq如果可以拷贝初始化给q1、q2,那么意味着我们可以通过q1、q1来改变q所指的对象的值,那这样q的底层const还有什么意义呢?
以上,是说这三类可以给哪些对象初始化,现在我们看看哪些可以给这三类初始化
第一类constintm
//以下一些变量不初始化,我把重点落在类型。 intm1; constintm2; constintm=m1;//正确 constintm=m2;//正确
第二类int*constp
//以下一些变量不初始化,我把重点落在类型。 int*p1; int*constp2; constint*p3; constint*constp4; int*constp=p1;//正确 int*constp=p2;//正确 int*constp=p3;//错误 int*constp=p4;//错误
这里的报错同样因为底层const有一个限制:当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const
第三类constint*constq
//以下一些变量不初始化,我把重点落在类型。 int*q1; int*constq2; constint*q3; constint*constq4; constint*constq=q1;//正确 constint*constq=q2;//正确 constint*constq=q3;//正确 constint*constq=q4;//正确
1.1.2现在让我们把目光转回非const对象的初始化
这里主要有两类:
//以下一些变量不初始化,我把重点落在类型。 constint*p; constint&r;
先考虑他们可以给哪些对象初始化
第一类constint*p
//以下一些变量不初始化,我把重点落在类型。 int*p1=p;//报错 int*constp2=p;//报错 constint*p3=p;//正确 constint*constp4=p;//正确
此处同样由于低层const的限制
第二类constint&r
//以下一些变量不初始化,我把重点落在类型。 int&r1=r;//错误 constint&r2=r;//正确
这里强调一下,引用不是对象,所以没有像int*const&r或者constint*const&r这种形式
好,再考虑哪些可以给他们初始化
第一类constint*p
//以下一些变量不初始化,我把重点落在类型。 int*p1; int*constp2; constint*p3; constint*constp4; constint*p=p1;//正确 constint*p=p2;//正确 constint*p=p3;//正确 constint*p=p4;//正确
因为constint*p意义在于表明不可以通过p改变它所指的对象的值,这个对象可以不是常量,只是p所指的对象对于p来说是常量,所以它所指的对象是否const其实并没有关系。
第二类constint&r
//以下一些变量不初始化,我把重点落在类型。 int&r1; constint&r2; constint&r=r1;//正确 constint&r=r2;//正确
这里const同样是指不能通过r改变它所引用的对象,所以它所引用的对象本身是不是const无关紧要。
纵观以上的错误,都是试图把底层const拷贝初始化给没有底层const的对象。
以上就是关于涉及到常量的指针和引用的初始化的解释了。