const int *const ptr = &ival;
3.3 typedef中易出错的const指针
typedef string *ptr;
const ptr s_ptr;
上式不能直接替换理解为const string *s_prt; 从而认为s_ptr是一个指向const string的指针。
首先,ptr是一个指针,const修饰的是一个指针,所以应该是string *const s_ptr; s_ptr是一个指向string的const指针。
4. const与数组
const与数组的点在于const在定义时必须初始化这个原则,所以使用动态分配数组时,如果数组存储的是const类型的对象,必须进行初始化(使用初始化符号())。
5. const与函数返回值
修饰函数的返回值,用于返回一个常量。
const int foo();
5.1 返回通过值传递
如果函数返回时采用值传递,比如返回一个int类型,那么函数会把返回的值(比如47)复制到外部临时存储单元中(产生临时副本),所以加const修饰毫无意义
int foo();
const int foo();
二者完全相同。需要注意的是,值传递产生临时副本,效率低(下面const与函数参数有讲),所以通常采用引用传递来返回。
5.2 返回通过引用传递(并不多见)
如果返回值不是内部类型,通常使用引用传递来返回结果,因为引用传递的是本身,不需要产生临时副本。但需要注意的是,此时仅仅返回一个别名。
ClassType &foo();
const ClassType &foo();
const修饰的返回引用值,表示函数调用的结果只能赋值给一个同类型的const引用。
5.3 返回通过指针传递
const ClassType *foo();
表示函数返回一个ClassType类型的指针,这个指针指向一个const对象,指针所指的内容不能被修改,所以函数的返回值只能赋值给指向一个const的同类型的指针。
const ClassType *ptr = foo(); //ok
ClassType *ptr = foo(); //error
6. const与函数参数
首先需要明确,const修饰的目的就在于保护所修饰的内容不被改变。










