C++顶层const与底层const
(1)顶层const即声明对象本身是一个常量,其内存中存放的值初始化后是不能更改的(且必须有初始化);
如:
const int i = 9; //定义一个int型常量i,并初始化为9,此后i存储的值就不能更改了;
int j;
int* const p = &j; // 定义一个int 型指针常量p存放变量j的地址,此后p存储的地址值或者说p的指向就不能更改了;
另外,顶层const允许用一个有存储值的变量来初始化它,此过程中将变量存储值的副本作为右值初始化const常量。

(2)底层const用来表示不能通过指针或迭代器来修改它们所指向的对象的存储值。const并不是表示指针或迭代器本身,它们本身是否为常量是由顶层const来表示的。
且不是说指针所指向的对象一定是常量,只是说指针只能读取指向的对象而不能修改对象的值。

(3)小结:
const作用于对象时,是顶层const,即对象本身存储的常量值一旦初始化赋值后就不能改变(const对象定义时也必须给定初始值)
对于指针或者迭代器,则有顶层const和底层const之分,前者作用于指针本身,表示指针初始化定义后,存储的地址值不能改变或者说指针的指向不能改变;后者指作用于指针指向的对象,即无法通过指针来改变对象的值,只能读取对象的值。 常量指针不仅能指向常量对象也能指向变量对象。
对于常量引用,都是底层const,即无权通过引用名来更改所绑定对象的值。常量引用可以引用常量、变量、字面值、能类型转换的其他类型变量(实践上,引用了的中间变量)
值得注意的是,用字面值或者其他类型变量初始化常量引用时,实际上引用的是中间变量,例如如果用double变量来初始化 const int &时,编译器会将double变量隐式转化为一个int型的无名字的临时变量,引用绑定的是此临时变量。
c++认为,常量引用可以绑定这个临时量,而普通引用就不能绑定这个临时量。 因为c++认为,使用普通引用绑定一个对象,就是为了能通过引用对这个对象做改变。如果普通引用绑定的是一个临时量而不是对象本身,那么改变的是临时量而不是希望改变的那个对象,这种改变是无意义的。所以规定普通引用不能绑定到临时量上。
那么为什么常量引用就可以呢,因为常量是不能改变的。也就是说,不能通过常量引用去改变对象,那么绑定的是临时量还是对象都无所谓了,反正都不能做改变也就不存在改变无意义的情况。

作为参数时:
顶层const,即常量对象,可以接收常量、变量(前提是变量已被赋值过)、字面值或者能隐式类型转化的其他类型数据。
底层const,常指针,可以指向变量也能指向产量,即可以传入变量地址或者常量地址。
常引用,可以传入变量、常量、字面值、常量表达式。
浙公网安备 33010602011771号