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,因此只要不修改它们,就不会影响它们在表达式中的使用。