const一般的意义是 ,恒定不变,修饰的对象不能改变,或是为了保护数据,提高了程序额健壮性。分类如下:
常变量: const 类型说明符 变量名
常引用: const 类型说明符 &引用名
常对象: 类名 const 对象名
常成员函数: 类名::fun(形参) const
常数组: 类型说明符 const 数组名[大小]
常指针: const 类型说明符* 指针名 ,类型说明符* const 指针名
首先提示的是:在常变量(const 类型说明符 变量名)、常引用(const 类型说明符 &引用名)、常对象(类名const 对象名)、 常数组(类型说明符 const 数组名[大小]), const” 与 “类型说明符”或“类名”(其实类名是一种自定义的类型说明符) 的位置可以互换。如:
const int a=5; 与 int const a=5; 等同
类名 const 对象名 与 const 类名 对象名 等同
用法1:常量
取代了C 中的宏定义,声明时必须进行初始化(!c++类中则不然)。const限制了常量的使用方式,并没有描述常量应该如何分配。如果编译器知道了某const 的所有使用,它甚至可以不为该const 分配空间。最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。―《C++ Program Language》
用const 声明的变量虽然增加了分配空间,但是可以保证类型安全。
C 标准中,const 定义的常量是全局的,C++中视声明位置而定。
用法2:指针和常量
使用指针时涉及到两个对象:该指针本身和被它所指的对象。将一个指针的声明用const“预先固定”将使那个对象而不是使这个指针成为常量。要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const。
所以出现在 * 之前的const 是作为基础类型的一部分:
char *const cp; //到char 的const 指针
char const *pc1; //到const char 的指针
const char *pc2; //到const char 的指针(后两个声明是等同的)
从右向左读的记忆方式:
cp is a const pointer to char. 故pc 不能指向别的字符串,但可以修改其指向的字符串的内容
pc2 is a pointer to const char. 故*pc2 的内容不可以改变,但pc2 可以指向别的字符串
且注意:允许把非 const 对象的地址赋给指向 const 对象的指针,不允许把一个 const 对象的地址赋给一个普通的、非 const 对象的指针。
用法3:const 修饰函数传入参数
将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。
通常修饰指针参数和引用参数:
void Fun( const A *in); //修饰指针型传入参数
void Fun(const A &in); //修饰引用型传入参数
用法4:修饰函数返回值
可以阻止用户修改返回值。返回值也要相应的付给一个常量或常指针。
用法5:const 修饰成员函数(c++特性)
const 对象只能访问const 成员函数,而非const 对象可以访问任意的成员函数,包括const 成员函数;
const 对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;
const 成员函数不可以修改对象的数据,不管对象是否具有const 性质。编译时以是否修改成员数据为依据进行检查。
使用建议:
1 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
2 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
3 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
4 const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
5 不要轻易的将函数的返回值类型定为const;
6除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
7任何不会修改数据成员的函数都应该声明为const 类型。
const的最主要功能是保护数据, 另外使用const引用还能提高函数运行效率,减少复制实参开销!
原文:http://blog.csdn.net/zzucsliang/article/details/43877321