笨蛋C++06 - 用const保护数组

112 阅读2分钟

显示数组并用const保护数组

创建显示数组内容的函数很简单。只需要将数组名和填充的元素数目传递给函数。然后该函数使用循环来显示每一个元素。然而,还有另外一个问题---确保显示函数不修改原始数组。除非函数的目的就是为了修改传递给他的数据。否则应该避免发生这种情况。使用普通函数时。这种保护将自动实现。这是由于C++按值传递数据。而且函数使用的时数据的副本。然而,接受数组名的函数将使用原始数据。这正是fill_array函数能够完成其工作的原因。为了防止函数无意之间修改数据的内容。可以在声明形参的时候使用关键字const。

void show_array(const double arr[],int n);

该声明表示,指针arr指向的是常量数据。这意味着不能够用arr来修改数据。也就是说,可以使用像arr[0]这样的值。但是不能修改。注意。这并不是意味着原始数组必须是常量。而只是意味着不能在show_arr()函数中使用arr来修改这些数据。因此。show_array()将数组视为只读数据。假设无意间在show_array()函数中执行了如下的操作。从而违反了这些限制:

arr[10]+=10;

编译器将禁止这样做。比如:Borland C++将给出一条错误信息。

cannot modify a const object in function show_array(const double *,int)

其他编译器可能用其他措辞表示不满。

将const用于指针有一些很微妙的地方。我们来详细探讨下,可以用两种不同的方式将const关键字用于指针。第一种方式是让指针指向一个常量对象。这样可以防止用指针来修改指向的值。第二种方法是将指针本身声明为常量。这样可以防止改变指针指向的位置。下面来看细节。

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;