VC++ 2008专题应用程序开发实例精讲
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.5 const关键字

程序员常常需要在程序中使用某种类型的常量,例如一月的天数或圆周率π(圆的周长与其直径之比),甚至烘炉中的面包数等。但是,在计算过程中应避免显式使用数值字面量,而使用初始化为指定值的变量会更好。例如,把码转换为英尺时,并不一定要把待转换的值与3相乘,而可以把该值与已初始化为3的feet_per_yard变量相乘,这样会使代码的含义更明确。在程序中显式使用的数值字面量有时称为幻数(magic number),尤其在这些字面量的目的和来源不很明显的情况下,就更是如此。

用变量代替幻数的另一个原因是可以减少代码中要维护的点数。假定幻数表示时常变化的某个内容(例如利率),而且该幻数还出现在代码中的好几个地方,则当利率变化时,就需要修改程序中的所有幻数。如果定义了一个变量,就只需在初始化时修改这个值。

当然,如果用一个变量存储这样的常量,一般希望固定该值,防止其他人不小心修改它。为此,可以使用关键字const。例如:

const int feet_per_yard = 3; //定义一个整型变量feet_per_yard其值为3

可以把任何类型的“变量”定义为const,编译器会检查用户是否试图修改这种变量的值。例如,如果在赋值运算符的左边加上了const,就会出现错误。因此,在把变量声明为const时,必须为它提供一个初始值。

注意把变量声明为const会改变它的类型。类型为const int的变量与类型为int的变量完全不同。

程序示例——使用const

下面编写一个小程序,把用码、英尺和英寸表示的长度转换为用英寸表示的长度。

//程序的功能是演示使用const
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main() {
const int inches_per_foot=12;
const int feet_per_yard=3;
int yards=0;
int feet = 0;
int inches=0;
//从键盘读出长度值
cout<< "Enter a length as yards, feet, and inches: ";
cin >>yards>>feet>>inches;
//Output the length in inches
cout << endl
<< "Length is inches is "
<< inches + inches_per_foot *(feet+feet_per_yards*yards)
<< endl;
return 0;}

结果如下:

Enter a length as yards, feet and inches: 2 2 11
Length is inches is 107

例子的说明如下。

与前面的例子相比,本例多了一个using语句:

using std::cin;

这个语句把std命名空间中的名称cin引入程序文件,该名称表示标准输入流,即键盘输入。

下面的语句定义了两个转换常量:

const int inches_per_foot=12;
const int feet_per_yard=3;

用关键字const声明它们,将避免直接修改这些变量。添加下面的语句可以测试一下:

inches_per_foot=15;

在常量的声明之后使用这样的语句,程序将不再编译。

该程序用下面的语句提示输入,并读取yards、feet和inches的值:

cout << "Enter a length as yards, feet and inches: ";
cin >> yards>>feet>>inches;

注意第二行代码使用流cin指定了几个连续的输入操作,为此使用了第1章中简要介绍过的提取运算符<<,它的用法类似于流输出操作cout,可以输入多个值。插入和提取运算符将确说明了数据的流向。

从键盘输入的第一个值被存储在yards中,第二个值被存储在feet中,第三个值被存储在inches中。这里的输入处理非常灵活,可以在一行上输入三个值,其中用空格分隔开(实际上是用空白字符分隔开),也可以分几行输入它们。

在输出语句中执行单位的转换:

cout << endl
<< "Length is inches is "
<< inches + inches_per_foot *(feet+feet_per_yards*yards)
<< endl;

转换因子声明为const,因此只要不修改它们,就不会影响它们在表达式中的使用。