关键字:
const
const对象在创建后其值就不可更改,所以const对象必须初始化
如果const修饰的对象在编译时期就能确定其值
如:const int bufSize = 512;
那么所有用到bufSize的地方都会用512替换(这样编译器不会给它们分配额外的内存)
而:int getInt() {
int a = 10;
return a;
}
const int bufSize = getInt();
此时,由于getInt()只能在运行时期返回值,所以编译器要给每个用到bufSize的地方分配内存。
也正是因为这样的特性,const对象在默认情况下只在本文件内有效
顶层const与底层const:
1. 顶层const
2. 底层const
示例1:
const int i = 0;
示例2:
int a = 0;
int* const p1 = &a;
const int* p2 = &a;
所以,p1的值不可更改(不可改变指向),可以通过p1间接改变a的值
p2的值可以更改(可改变指向),不可以通过p2间接改变a的值(但可直接改变a的值)
const引用
const引用中的const是底层const,需要注意的是顶层const对于引用而言是没有意义的。
因为引用的语法糖已经强制了引用对象是没法改变指向的
另外普通引用是没法指向右值的(因为右值不可寻址)
如:int& a = 7;
而:const int& a = 7;
能做到的原因是:
int temp = 7;
const int& a = temp;
补充:
被mutable关键字修饰的对象,可以摆脱const的束缚