C++中的Const关键字

这里的具体内容主要参考C++ Primer Plus 7.3.5小节

const有两种方法用于指针.

第一种方式是让指针指向一个常量const对象,可以防止使用该指针来修改所指向的值.

第二种方法是将指针本身声明为常量,可以防止改变指针指向的位置.

指向一个const的指针

1
2
int age = 39;
const int * pt = &age

以上的声明指出, pt指向一个const int,也就是不能使用pt指针来对其进行修改

*pt的值是一个const,无法进行修改.

但是pt这个声明并不是代表age这个变量本身是个const不能进行修改,而是表示对于pt指针而言age是个const不能进行修改

1
2
*pt = 20; // 不行,因为pt指向的对象是const
age = 20; // 行,因为age本身不是const变量

可以将const变量的地址赋值给定义成为const的指针,但是不可以将const变量的地址赋值给普通的指针.

后者很好理解,你一个const的变量说好的const,结果又能被一个指针来进行修改,这不是搞嘛.

const关键字在函数中的作用也很大

假设有下面这个const数据组成的数组

1
const int months[3] = {31, 28, 31};

那么常量const数组的首地址不能作为函数的非常量形参传入

1
2
3
int sum(int arr[], int n); // 不行,必须使用常量,const int arr[]

int j = sum(months, 3); // 不行

对于写代码,尽可能使用const,使用const可以让函数可以处理const和非const的实参.

如果条件允许,应该将指针形参声明为指向const的指针

指针本身为const

1
2
int age = 39;
const int * pt = &age

对于之前所定义的pt,此处指针的声明表明,*pt是不能改变的,但是pt本身是可以改变的.

也就是说以下的操作是合法的.

1
2
int sage = 80;
pt = &sage;

第二种使用const的方式就是让pt本身变成不可修改

1
2
3
int sloth = 3;
const int *ps = &sloth; // a pointer to const int
int * const finger = &sloth; // a const pointer to int

最后一种的声明方式表明,finger只能指向sloth.