C++ const用法詳解

2020-07-16 10:04:36
我們知道,在程式執行時不會更改的值可以作為常數儲存。但是,有時這種做法並不是很理想。例如,假設以下語句出現在計算有關貸款資料的銀行程式中:

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