c++ 易混淆概念之常量指针

指向常量的指针

常量是这样一种变量:它的值不能被改变,因此,常量必须初始化.

指向常量的指针,可以指向常量或者非常量.但是要想用指针来存放常量对象的地址,只能用指向常量的指针.
指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定该对象的值不能通过其他方式改变.
可以这样想: 指向常量的指针, 自以为是地以为自己指向了常量,所以自觉地不去改变该对象的值.
同样,可以认为指向非常量的指针,会认为自己指向的是非常量,因此,可能会改变自己指向的变量,因此不能用指向非常量的指针保存常量对象的地址.因为,指向非常量的指针可能会试图改变其指向的常量对象的值.

非常量可以转化为常量.反之则不行.

1
2
3
4
5
6
const double pi = 3.14;
const double *pip = π // 正确:指向常量的指针
const double pi1 = 3.1415;
pip = π // 使指向常量的指针pip指向另一个常量
double pi2 = 3.1415926;
pip = &pi2; // 指向常量的指针pip指向一个非常量

常量指针

常量指针是指指针本身是常量,即指针一旦指向某个对象就不能再改变(指针中保存的那个地址就不再改变了).因此同常量一样,常量指针必须初始化.

指针本身是常量只规定了指针不能指向其他对象,而并没有规定不能通过指针修改其所指向对象的值,能否只有做完全取决于所指对象的类型.常量指针既可以指向常量也可以指向非常量,具体指向的是常量还是非常量,取决于定义该指针时所指向对象的基本数据类型.

1
2
3
4
5
int errNumb = 0;
int *const curErr = &errNumb; // 指向非常量的常量指针 curErr常量指针,始终指向errNumb
*curErr = 1; // 通过指向非常量的常量指针修改其所指向对象的值
const double pi = 3.14;
const double *const pip = π // 指向常量的常量指针pip

常量指针this

类的成员函数调用时,用请求该函数的对象地址初始化this.在整个调用过程中,this所指向的都是发起该调用的对象.默认情况下,this的类型是指向非常量版本的常量指针.如类类型的名为sales_data, 则this指针的类型是
sales_data *const. 又如果想要用指针来保存常量对象的地址,只能使用指向常量的指针, 所以,我们不能把类型为sales_data const的this指向一个常量对象.也因此,不能在一个常量对象上调用普通的成员函数.如果想要常量对象也能调用该成员函数,那么必须要把this指针的类型设置成指向常量的常量指针,即*const sales_data const*
声明成员函数时,紧随参数列表的const的作用就是将this指针的类型声明成指向常量的常量指针.像这样使用construction的成员函数被称作常量成员函数,常量成员函数内部不能改变this指针所指向的对象的内容(即调用此成员函数的对象的内容).

1
2
3
4
class sales_data{
void f(); // 常量对象不能调用此函数
void f() const; // 此函数是常量成员函数,常量对象也可以调用,this指针指向的是常量对象(也可以是非常量对象)
}