我们常常需要在程序中使用某种类型的常量,例如一月的天数或圆周率p(圆的周长与其直径之比),甚至烘炉中的面包数。但是,在计算过程中应避免显式使用数值字面量,而使用初始化为指定值的变量会更好。例如,把码转换为英尺时,并不一定要把一个值与3相乘,而可以把该值与已初始化为3的feet_per_yard变量相乘,这样会使代码的含义更明确。在程序中显式使用的数值字面量有时称为幻数(magic number),尤其在这些字面量的目的和来源不很明显的情况下,就更是如此。
用变量代替幻数的另一个原因是可以减少代码中要维护的点数。假定幻数表示时常变化的某个内容,例如利率,而且该幻数还出现在代码中的好几个地方。当利率变化时,就需要修改程序中的所有这些幻数。如果定义了一个变量,就只需在初始化时修改这个值。
当然,如果用一个变量存储这样的常量,就希望固定该值,防止不小心修改它。为此,可以使用关键字const。例如:
const int feet_per_yard = 3; //Conversion factor yards to feet
可以把任何类型的“变量”定义为const,编译器会检查用户是否试图修改这种变量的值。例如,如果在赋值运算符的左边加上了const,就会出现错误。因此,在把变量声明为const时,必须为它提供一个初始值。
注意把变量声明为const会改变它的类型。类型为const int的变量与类型为int的变量完全不同。
程序示例2.4—— 使用const
下面编写一个小程序,把用码、英尺和英寸表示的长度转换为用英寸表示的长度。
//Program 2.4 – Using 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;
//Read the length from the keyboard
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中。这里的输入处理非常灵活,可以在一行上输入3个值,其中用空格分隔开(实际上是用空白字符分隔开),也可以分几行输入它们。
在输出语句中执行英寸的转换:
cout << endl
<< "Length is inches is "
<< inches + inches_per_foot *(feet+feet_per_yards*yards)
<< endl;
转换因子声明为const,只要不修改它们,就不会影响它们在表达式中的使用。





