2.6 const限定符与引用、指针

时间:2022-12-18 20:22:11
//看上去十分纯洁无害的小东西,一和指针引用结合在一起就开始*人间
 
const类型:1.必须初始化;2.值不能变。
extern const:想让某类const对象只在一个文件里被定义,并在多个其他文件中声明并使用它则使用关键字extern来修饰const类型。(因为const对象仅在文件内有效,见书P54)。
 

 
const的引用
 
所谓“对const 的引用”常常被称为“常量引用”,而这种简称实际上是不合适的。因为引用并不是对象,所以引用并不存在所谓的“常”即恒定不变。(注意就好,本质上还是对于引用并非对象这个重点的涉及)//引用的对象是常量还是非常量可以决定其所能参与的操作,却无论如何都不会影响到引用和对象的绑定关系本身。
 
2.5曾提及引用类型必须和所绑定对象的类型相一致,而这种观点实际上是有两个例外,第一个例外便是: 初始化常量引用时允许用任意表达式作为初始值,允许为一个常量引用绑定一个非常量的对象、字面值甚至是一般表达式——只要不通过该常量引用改变其所绑定的对象即可(哪怕是通过该对象所绑定的其他引用来改变也无所谓)(具体编译器如何这样操作的,此处省略,详见书P55)
 
有趣的是,初始化常量引用做选取的初始值并不设限,但是要绑定常量对象则必须用常量引用来绑定。
 

 
指向常量的指针
 
同常量引用相似:1.指向常量的指针不能用于改变其所指对象的值;2.要想存放常量对象的地址,则必须使用指向常量的指针。(引用和指针的不同:加const限定符后引用可以称为“常量引用”,而指针被称为“ 指向常量的指针”)
 
2.5曾提及指针类型必须和所指定对象的类型相一致,而这种观点实际上也有两个例外,第一个例外便是: 允许一个指向常量的指针指向一个非常量——同样,只要不通过该指针改变该非常量的值即可,该非常量的值并非不可改变。
 

 
const指针
 
指针是对象,所以自然可以加const限定符用于表示常量指针,与常量引用不同,常量引用实际上是绑定常量的引用,对应的是指向常量的指针。常量指针,词眼不在于指针,而在于常量,所以:常量指针必须初始化,且其值不可改变,其写法是把*放在const之前,用于说明指针是一个常量——不变的是指针本身而不是指向的那个值——指针本身是一个常量并不意味这不能通过指针修改其所指对象的值,能否这样做完全依赖于所指对象的类型。
 
关于const与指针,分清以下三个概念即可:
1.指向常量的指针;
2.常量指针;(用constexpr来定义,是为顶层const)
3.指向常量的常量指针。
 

 
//看到顶层const和底层const的时候,笔者完全是懵逼的,懵逼了两百多页,在知乎、CSDN上寻找答案,最终才发现这应该是属于中英文语境产生的理解上的差别
 
以笔者的肤浅认识来说,顶层const和底层const只是用于分辨对象和描述对象的概念罢了,目前并没有在实际的编程过程中体现真正价值,更多是在注释中予以旁注,真正需与顾虑的是顶层const和底层const所体现的原则。
 
顶层const——表示指向常量的指针就是个常量;(此处的指针可替换为任何数据类型:算术类型,类等等)
底层const——表示指针所指向的对象/引用所绑定的对象就是个常量。(此处的指针/引用就是指复合类型的基本类型有关)
 
//而实际上,二者的区别在前言中已经说的很明确了,这里不加累赘,要增加进一步理解,还是在看书中去体会把