1.
顶层const作用于对象本身
const int ci = 42; //不能改变ci,const是顶层的
int i = ci; //正确:当拷贝ci时,忽略了它的顶层const
int *const p = &i; //const是顶层的,不能给p赋值
*p = 0; //正确:通过p改变对象的内容是允许的,现在i变成了0
2.
void fcn(const int i) {/*fcn能够读取i,但是不能向i写值*/}
void fcn(int i ){} //错误:重复定义了fcn(int)
3.
形参的初始化方式和变量的初始化方式是一样的。我们可以使用非常量初始化一个底层const对象,但是反过来不行;同时一个普通的引用必须用同类型的对象初始化。
int i = 42;
const int*cp = &i; //正确:但是cp不能改变i
const int &r = i; //正确:但是r不能改变i
const int &r2 = 42; //正确
int *p = cp; //错误:p的类型和cp的类型不匹配
int &r3 = r; //错误:r3的类型和r的类型不匹配
int &r4 = 42; //错误:不能用字面值初始化一个非常量引用