将 const 用于指针有一些很微妙的地方,我们来详细探讨一下。可以用两种不同的方式将 const 关键字用于指针。第一种方法是让指针指向一个常量对象,这样可以防止该指针来修改所指向的值。第二种方法是将指针本身声明为常量,这样可以防止改变指针指向的位置。下面来看看细节。
首先,我们声明一个指向常量的指针 pt :
int age = 39;
const int * pt = &age;
改声明指出,pt指向一个 const int,因此不能用 pt 来修改这个值。换句话说,*pt 的值为 const ,不能被修改:
*pt += 1; //错误
cin>> *pt; //错误
现在看一个很微秒的问题。pt 的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对 pt 而言,这个值是常量。例如,pt 指向 age ,而 age 不是 const 。可以直接通过 age 来修改 age 的值,但不能用指针 pt 来修改它:
*pt = 20; //错误
age = 20; //正确
以前我们将常规变量的地址赋给过常规指针;而现在又将常规变量的地址赋给了指向 const 的指针。因此还有两种可能:将 const 变量的地址赋给指向 const 的指针、将 const 的地址赋给常规指针。这两种操作都可行吗?第一种可行,但第二种不行。
const float g_earth = 9.80;
const float * pe = &g_earth; //正确
const float g_moon = 1.63;
float * pm = &g_moon; //错误
对于第一种情况来说,既不能使用 g_earth 来修改 9.80 的值,也不能使用 pe 来修改。C++禁止第二种情况的原因很简单——如果将 g_moon 的地址赋给 pm,则可以使用 pm 来修改 g_moon 的值,这使得 g_moon 的 const 状态很荒谬,因此C++禁止将 const 的地址赋给 非 const 指针。
如果将指针指向指针,则情况更复杂,前面已经讲过,假如涉及的是一级间接关系,则将非 const 指针赋给 const 指针是可以的:
int age = 39; //age++ 正确
int * pd = &age; //*pd++正确
const int * pt = pd; //*pt++错误
记住:如果数据类型本身并不是指针,则可以将 const 数据或非 const 数据的地址赋给指向 const 的指针,但只能将非 const 数据的地址赋给非 const 指针。
尽可能使用 const
1.这样可以避免由于无意间修改数据而导致的编程错误。
2.使用 const 使得函数能够处理 const 和非 const 实参,否则将只能接受非 const 数据。
3.如果条件允许,则应将指针形参声明为指向 const 的指针。