3、 若引用所指向的对象不会随着引用的改变而改变,则引用一定要定义为const。例如const int ival = 10; const int * const &pi = &ival; //这里注意由于&ival表达式作右值,那么pi所指向的对象&ival不会改变,故第二个const的是必要的。 注意若将代码改为const int ival = 10; const int *pt = &ival; const int * &pi = pt; //ok!因为引用pi指向pt,pt的值可以改变,故pi的改变可以引起其引用对象pt的改变,故只需要一个const。还要注意此类情况发生在函数调用过程中:
void manip( vector<int>& );
void manip( const vector<int>& );
vector<int> f();
extern vector<int> vec;
int main()
{
manip(vec); //调用void manip( vector<int>& ),因为其为没有额外限定修饰的精确匹配
manip( f() ); //因为实参实存放函数f()返回值的临时单元(是一个右值),不能用来初始化非const引用参数, //故调用void manip( const vector<int>& )
return 0;
}
4、 typedef char *cstring; extern const cstring cstr; //等价于extern cstring const cstr;注意这里cstr是一个指向字符的const指针,也即是char *const cstr;而不是const char *cstr。