(1)
const 引用可以初始化为不同类型的对象或者初始化为右值。
int i =42;
const int &r = 42; //去掉const 非法
const int &r2 = r+i;
原因 :
观察将引用绑定到不同的类型时,就可以理解上面的问题
double dval = 3.14;
const int &ri = dval;
编译器会把代码转换成
int temp = dval;
const int &ri = temp;
如果ri不是const,那么就可以将ri赋一新值。这样做不会修改dval,而是修改temp.
期望对ri的赋值会修改dval的程序员会发现dval并没有修改。仅允许const引用绑定
到需要临时使用的值完全避免了这个问题,因为const引用是只读的,不能在被修改。
非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或者绑定右值。
(2)
const int *p 与 int const *p 等价
p是一个指向int 类型的const对象的指针,const 限定了p指针指向的对象类型,而非p本身。
也就是说,p本身不是const,在定义时不需要对它进行初始化,如果需要的话,允许给p重新
赋值,使其指向另一个const 对象( p = &b;),但不能通过 *p = 42 来修改其所指向对象的值。
int *const p 指向int型对象的const 指针, 指针p就是const对象 在定义的时候必须初始化,
也不能修改p 的指向,但是可以通过*p来修改其所指向的对象。
(3)
typedef string *pstring;
const pstring cstr;
很容易被理解为 const string *cstr; 是错误的。
声明const pstring 时,const修饰的是pstring的类型,这是一个指针。
因此,该声明语句应该是把cstr定义为指向string类型对象的const指针。
应该等价于 string *const cstr;