因为我老是弄混这个东西,所以考虑单独把这个写出来
1 const int* p
这个叫常量指针,意味着他可以对指向进行修改,而不能对值进行修改。
int main()
{
int a = 10;
int b = 10;
const int *p1 = &a;
//对指向进行修改,OK
p1 = &b;
//对值进行修改,error
*p1 = 30;
system("pause");
return 0;
}
2 int *const p
这个叫指针常量,这意味着指向是不能变得,但是内容可以变。同时他就是引用&的本质。
int main()
{
int a = 10;
int b = 10;
int *const p2 = &a;
//修改内容,OK
*p2 = 30;
//修改指向,error
p2 = &b;
system("pause");
return 0;
}
3 int const *
这个实际上也是常量指针,但别用了,看起来就别扭
4 const int * const p
常量指针常量,这将使得指向不能改,内容也不能改。
int main()
{
int a = 10;
int b = 10;
const int *const p3 = &a;
//error
*p3 = 20;
//error
p3 = &b;
system("pause");
return 0;
}
5 函数中参数带const
如果你的参数不需要进行修改,请一定要养成使用const的习惯!这主要是为了防止你编代码遍傻了把里面的值给改咯。
6 成员函数带const
他的意思是该成员函数不会修改这个对象的任何数据成员。
class A
{
private:
int a;
//# 8
mutable int c;
public:
A(int b = 2) : a(b) {}
void add(int b) const {}
void sub(int b) {}
// # 8,inline内部被赋值修改
void div(int b) const { c = b; }
};
class B : public A
{
};
int main()
{
//# 7
const A a;
a.add(2);
A a1;
a1.add(2);
system("pause");
return 0;
}
这种成员函数能够被const对象和非const对象同时访问。
7 类对象带const
接6,注意到有
const A a;
这意味着这个对象在初始化后就不再进行修改,因此他只能访问到带const的成员函数
a.sub(3);
则是错误的!因为sub没有带const,这意味着他有可能是能够改变a这个对象里面的数据。
8 mutable
接6,假设说有那么一种需求:虽然我定义了带const的成员函数,但是我还是希望在这里面可以修改某些数据变量。虽然这种要求显得莫名其妙(至少对于目前的我来说),但是C++提供这种操作,即在你需要改变的数据成员变量前面加mutable即可。