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.
- 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