C++ const用法详解

我们知道,在程序运行时不会更改的值可以作为常数存储。但是,有时这种做法并不是很理想。例如,假设以下语句出现在计算有关贷款数据的银行程序中:

amount = balance * 0.069;

在这个程序中,出现了两个潜在的问题。首先,除原始程序员以外的任何人都不清楚这个 0.069 是什么东西。它看起来似乎是一个利率,但在某些情况下,又可以是与贷款支付相关的费用。如果不仔细检查程序的其余部分,怎样才能确定该语句的目的呢?

如果在整个程序中还有其他的计算公式也使用了此数字,并且必须定期更改,则会出现第二个问题。假设这个数字是利率,那么如果利率从 6.9% 变为 7.2% 该怎么办呢?程序员将不得不搜索全部源代码,以查找每一次出现的该数字。

通过使用命名常量可以解决这两个问题。命名常量也称为常量变量,就像是一个变量,但其内容是只读的,在程序运行时不能更改。以下是一个命名常量的定义:

const double INTEREST_RATE = 0.069;

除了 const 出现在数据类型名称之前,它看起来就像一个常规的变量定义。关键字 const 是一个限定符,它告诉编译器将该变量设置为只读。这样可以确保在整个程序执行过程中其值保持不变。如果程序中的任何语句尝试更改其值,则在编译程序时会导致错误。

命名常量可以有任何合法的 C++ 标识符名称,但是许多程序员会在其名称中全部使用大写字母,将其与常规变量区分开来。上述示例中的 INTERESTJRATE 正是如此。

在定义一个命名常量时,必须用一个值来进行初始化。它不能先定义,然后再通过赋值语句来进行赋值:

const double INTEREST_RATE; //非法
INTEREST_RATE = 0.069;  //非法

使用命名常量还有一个附带的好处,那就是它们使程序更具有自我解释的能力。一旦命名常量 INTEREST_RATE 被正确定义,那么以下程序语句:

newAmount = balance * 0.069;

就可以改为以下语句:

newAmount = balance * INTEREST_RATE;

现在新程序员可以轻松阅读第2个语句并更好地理解其中含义。显然,与 balance 变量相乘的正是利率。

这种方法的另一个优点是可以很容易地对程序进行广泛的改变。例如,假设整个程序在十几个不同语句中均出现过利率,这时要修改利率,则只要修改命名常量定义中的初始化值就可以了,这也是唯一需要修改的地方。如果利率上升到 7.2%,则可以简单地将定义修改如下:

const double INTEREST_RATE = 0.072;

然后该程序就可以重新编译。每个使用 INTEREST_RATE 的语句都将使用新值。

命名常量也可以帮助防止程序代码中的键入错误。例如,假设在执行各种几何计算的程序中使用数字 3.14159 作为 PI 的值。每次在程序代码中输入数字 3.14159 时,都可能会出现一个或多个数字的错误。为了帮助防止这种错误,可以为 PI 定义一个命名常量,使用正确的值初始化,然后在需要其值的所有公式中使用该常量。

下面的程序在计算圆面积时就使用了命名常量。它在第 9 行定义了 PI 常量,然后在第 17 行使用了它:
//This program calculates the area of a circle. The formula for the
// area of a circle is PI times the radius squared. PI is 3.14159.
#include <iostream>
#include <cmath>    // Needed for the pow function
using namespace std;

int main()
{
    const double PI = 3.14159; // PI is a named constant
    double area, radius;
    cout << "This program calculates the area of a circle.\n";
   
    // Get the radius 
    cout << "What is the radius of the circle? ";
    cin >> radius;
    // Compute and display the area
    area = PI * pow(radius, 2);
    cout << "The area is " << area << endl;
    return 0;
}
程序输出结果:

This program calculates the area of a circle.
What is the radius of the circle? 10.0
The area is 314.159