const 限定符
关键字const可以用来修饰一个变量使其值不能被改变
const int bufsize = 512; //不可对bufszie进行赋值等尝试修改bufsize值的操作
因为被const修饰的值不能被改动,所以必须在声明的同时初始化
除了不能参与涉及修改常量内容的操作,常量与非常量所能参加的操作大多相同;
默认状态下,const对象仅在文件内有效,如果需要让其在别的文件中能访问,则需要用extern关键字修饰
extern const double pi =3.14156; //(声明并)定义
extern const double pi //访问(声明)
对 const 的引用 (const typename &): 引用不是对象不能用const修饰,引用本身绑定之后地址变不可更改,const 引用指的是引用指向的对象不能更改。(底层 const)
指向 const 的指针 (const typename *): 指针指向的对象不能更改。(底层 const)
const 的指针 (typename * const): 指针本身不能更改其指向的地址。(顶层 const)
对 const 的引用:(const typename &)
对于const对象必须要用对const的引用,因为如果采用普通引用会造成能通过引用来修改const对象的结果。反之,对const的引用并没有限定必须引用const对象,但是如果通过对const的引用来绑定一个非const对象,那将无法通过该引用去改变绑定对象的值,当然对非const对象本身进行修改仍是可行的。
通常情况下,引用的类型必须与其引用对象的类型一致,因为如果不一致,编译器将会产生一个temp对象先对引用对象进行转型,然后再将引用与temp对象绑定。这一操作将会使引用失去与指定对象绑定进行操作的意义。如果是对const的引用则允许进行这种操作,其效果相当于定义一个未命名变量然后用对const 的引用与它绑定,对const引用是其与外部的唯一接口,所以这个未命名变量也无法进行修改。
指向 const 的指针(const typename *)
与引用相同,对于const对象必须要用指向const的指针,无法通过指向const 的指针修改对象的值,同样的,指向const的指针并不要求一定要指向const对象,如果指向普通对象,该对象可以通过别的途径改变自己的值。
const 的指针(typename * const)
指针也是一种对象,因此指针也可以设置为const对象。与其他常量一样,指针常量在声明时必须初始化。指针常量指向的地址不可改变, 其余属性与普通指针都相同。
顶层const: 任意对象本身是常量。
底层const:一般与复合类型的基本类型部分有关,复合类型的基本类型部分是常量。(指向或者引用的对象为常量)
顶层和底层在拷贝时有着明显区别,顶层对象在拷贝给别的对象时,别的对象是否顶层const并无影响,然而底层const拷贝时需要拷贝对象有着同样的底层const,否则可能能通过该对象修改const的值,这是不允许的。