const与指针
- 指向常量的指针
指向常量的指针const type* ptr
可指向常量、变量。ptr是一个指向const type类型的指针变量。
注:ptr可修改(指向其他地址)。
int val = 10;
const int tmp = 20;
const int *q = &val;
q = &tmp; //合法
- 常指针
常指针type *const ptr
只能指向变量。
注:ptr不可修改(不能指向其他地址)。
int val = 10, tmp = 20;
int *const q = &val;
//q = tmp; //非法
- 常对象不能被修改;
- 不能把指向常对象的指针赋值给非常对象的指针;
考虑以下类:
class class_const
{
private:
/* data */
int val = 10;
public:
class_const(const int _val);
~class_const();
int get_val() const;
void set_val(const int _val);
void modify_val(const int _val) const;
};
class_const::class_const(const int _val):val(_val)
{}
class_const::~class_const()
{}
int class_const::get_val() const
{
return val;
}
void class_const::set_val(const int _val)
{
val = _val;
}
- 在类中,const对象不能调用非const成员函数;
const class_const ccc(10);
printf("%d\n", ccc.get_val());
// ccc.set_val(20); 非法
class_const cc(10);
printf("%d\n", cc.get_val());
cc.set_val(20); //合法
printf("%d\n", cc.get_val());
- const成员函数不能改变数据成员;
- const成员函数不能调用非const成员函数;
void class_const::modify_val(const int _val) const
{
// val = _val; 非法
// 如何改?强转
((class_const *)this)->val = _val;
// 或将val用mutable修饰,类中定义为:mutable int val = 10;
// set_val(_val); 非法
}