const修饰的常成员函数可以理解为是一个“只读”函数。 如果一定要修改常对象中的每个数据成员的值,对该数据成员函数声明为mutable,如:
mutable int count;把count声明为可变数据成员,即可改变。
const位于*号左边,const修饰指针所指向的变量,即指针指向为常量,可以先不进行初始化;
int b = 500; const int *a = &b; int const *a = &b; //指针所指向的内容为常量,内容不能被改变 int b = 500; const int *a = &b; *a = 600; // 错误 //改变的方法 int b = 500; const int *a = &b; b = 600; //或者 int b = 500, c = 600; const int *a = &b; a = &c;const 位于*号右边,const修饰指针本身,即指针本身是常量,定义时必须同时进行初始化;
int b = 500; int * canst a = &b; //指针本身是常量,但指针指向的内容不是常量; int b = 500; int * const a;//错误,未初始化 int * const a = &b; *a = 600;//正确,允许改值 cout<<a++<<endl;//错误*号两边均有const修饰,指针本身和指向的内容均为常量,均不能改变,定义时必须同时进行初始化!
int b = 500; const int * canst a = &b;C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多优点:
const 常量有数据类型,而宏常量没有。编译器对前者进行类型安全检查,而后者只是进行字符替换,没有类型安全检查,且在字符替换中可能产生错误(边际效应);有些集成化的调试工具可以对const常量进行调试,但不能对宏常量进行调试。在c++中const常量完全取代宏常量。参考: 程序员面试宝典 C++面向对象程序设计
