int a = 10;
const int *b = &a; //情况1
int const *b = &a; //情况2
int *const b = &a; //情况3
const int *const b = &a; //情况4
如果const 位于星号的左侧,则const 就是用来修饰指针所指向的变量,即指针指向为常量;
如果const 位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
因此,1和2的情况相同,都是指针所指向的内容为常量(与const放在变量声明符中的位置无关),这种情况下不允许对内容进行更改操作。
假如b是一名仓库管理员,他所进入的仓库,里面的货物(*b)是他没权限允许动的。
int b = 20;
const int *a = &b;
//*a = 600; //wrong
printf("a=%d,b=%d\n",*a,b);
b = 33;
printf("a=%d,b=%d\n",*a,b);
int c = 44;
a = &c;
printf("a=%d,c=%d\n",*a,c);
另外
const int *e; 初始化正确
对于情况3,指针本身是常量,这种情况下不能对指针本身进行更改操作,而指针所指向的内容不是常量。
假如 b 是一名仓库管理员,他只能进入指定的仓库,而不能去别的仓库(b++ 是错误的),但是这个仓库的货物(*b) 可以随便动的
//int *const f; wrong 必须初始化
int *const h = &b;
printf("b=%d,h=%d\n",b,*h);
*h = 73;
printf("b=%d,h=%d\n",b,*h);
对于情况4 为指针本身和指向的内容均为常量。那么这个仓库管理员只能去特定的仓库,并且仓库里面所有的货物他都没有权限去改变。
const修饰函数时,表示函数是只读
如果把const放在函数声明前,说明函数返回值是常量
const与#define相比
const有数据类型,可调试
#define 字符替换,没有安全检查
c++ 类里面的数据成员加上mutable,修改为const的成员变量,可以修改成员
void test13()
{
class C
{
public:
C(int i):m_c(i)
{
}
int incr()const
{
return ++m_c;
}
int decr()const
{
return --m_c;
}
private:
//mutable int m_c;
int m_c;
};
C c1(0),c2(10);
for(int tmp,i=0;i<10;i++)
{
tmp = c1.incr();
cout<<setw(tmp)<<setfill(' ')<<tmp<<endl;
tmp = c2.decr();
cout<<setw(tmp)<<setfill(' ')<<tmp<<endl;
}
}