C++變數作用域(詳解版)

2020-07-16 10:04:39
C++ 允許在程式中幾乎任何地方建立變數。常見的做法是在函數頂部定義函數的所有變數,也就是在標記主體開始的開放大括號之後。當然,在一些更長的程式中,變數有時在程式使用它的位置附近定義,只要在使用之前定義它們就沒問題。

我們知道,使用大括號包圍一個或多個程式設計語句即定義了一個程式碼塊。函數 main 的主體必須被大括號包圍,它就是一個程式碼塊。與 if 或 if-else 語句中的 else 相關聯的一組語句也同樣是程式碼塊。

無論如何,變數都需要定義在程式碼塊的內部,也可以在任何程式碼塊內定義一個變數。變數的作用域就是它的定義語句和塊的閉括號之間的那一部分。因此,在函數頂部定義的變數,其作用域實際上就是整個函數,而內部塊中定義的變數,其作用域就是該塊。

下面的程式在後面定義了它的變數:
#include <iostream>
using namespace std;

int main()
{
    //Constants for minimum income and years
    const double MIN_INCOME = 35000.0;
    const int MIN_YEARS = 5;
    // Get the annual income
    cout << "What is your annual income? ";
    double income; // Variable definition
    cin >> income;
    if (income >= MIN_INCOME)
    {
        //Income is high enough, so get years at current job
        cout << "How many years have you worked at your current job? ";
        int years; // Variable defined inside the if block
        cin >> years;
        if (years > MIN_YEARS)
            cout << "nYou qualify.n";
        else
            cout << "nYou must have been employed for more than "<< MIN_YEARS << " years to qualify.n";
    }
    else // Income is too low
    {
        cout << "nYou must earn at least $" << MIN_INCOME << " to qualify.n";
    }
    return 0;
}
程式的第 11 行中定義了 income 變數,它在標記 main 函數程式碼塊的大括號內,所以它的作用域包括第 11?28 行,也就是從它被定義的行到 main 函數封閉大括號的位置,在這個作用域內它都可以被程式使用。

years 變數在第 18 行中定義,包圍它的大括號標記的程式碼塊是由 if 語句有條件地執行的程式碼塊,所以它的作用域只包括第 18?22 行。也就是從它被定義的點到關閉if程式碼塊的大括號之間的行。這些在一組大括號內定義的變數被稱為具有區域性作用域或塊作用域。在區域性作用域之外,這些變數是不可見的,也不能被使用。

注意,當一個程式正在執行並且它進入構成一個變數作用域的程式碼段時,就稱該變數進入作用域。這只是意味著變數現在可見,程式可以參照它。同樣,當一個變數離開作用域時,它就不再能敢使用。

同名變數

當塊巢狀在另一個塊中時,內部塊中定義的變數可能與外部塊中定義的變數具有相同的名稱。雖然一般認為這樣做不妥,因為它很可能會導致混亂,但其實這樣做是被允許的。當內部塊中的變數進入作用域時,外部塊中的變數變為“隱藏”,不能使用。下面的程式說明了這一點:
// This program uses two variables with the same name.
#include <iostream>
using namespace std;

int main()
{
    int number; // Define a variable named number
    cout << "Enter a number greater than 0: ";
    cin >> number;
    if (number > 0)
    {
        int number; // Define another variable named number
        cout << "Now enter another number: ";
        cin >> number;
        cout << "The second number you entered was ";
        cout << number << endl;
    }
    cout << "Your first number was " << number << endl;
    return 0;
}
程式輸出結果:

Enter a number greater than 0: 2
Now enter another number: 7
The second number you entered was 7
Your first number was 2

此程式中有兩個單獨的變數名 number。一個在外部塊中的第 7 行上定義,另一個在內部塊中的第 12 行上定義。內部塊中的 cin 和 cout 語句(屬於 if 語句)只能與該塊中定義的 number 變數一起使用。一旦程式離開該塊,內部 number 離開作用域,將再次顯示外部 number 變數。

警告,儘管在巢狀塊中定義變數是完全可以接受的,但是在命名時應該避免與外部塊中的變數相同,畢竟這樣太容易將一個變數與另一個變數混淆了。