共用方式為


範圍 (C++)

當您宣告類別、函式或變數之類的程序專案時,其名稱只能「看到」並用於程式的特定部分。 名稱可見的內容稱為其 範圍。 例如,如果您在函式內宣告變數 xx 則只會在該函式主體內顯示。 它有本機範圍。 您的程式中可能具有相同名稱的其他變數;只要它們位於不同的範圍,就不會違反一個定義規則,也不會引發任何錯誤。

針對自動非靜態變數,範圍也會決定在程式記憶體中建立和終結它們的時間。

有六種範圍:

  • 全域範圍 全域名稱是在任何類別、函式或命名空間之外宣告的。 不過,C++甚至這些名稱都存在隱含全域命名空間。 全域名稱的範圍會從宣告點延伸至宣告所在檔案的結尾。 對於全域名稱,可見度也會受到鏈接規則的控管,這些規則會決定名稱是否顯示在程式中的其他檔案中。

  • 命名空間範圍 在命名空間宣告的名稱,在任何類別或列舉定義或函式區塊之外,可從其宣告點到命名空間的結尾看到。 命名空間可以在不同檔案的多個區塊中定義。

  • 區域範圍 在函式或 Lambda 內宣告的名稱,包括參數名稱,具有本機範圍。 它們通常被稱為「局部變數」。 它們只會從宣告點到函式或 Lambda 主體的結尾顯示。 本機範圍是一種區塊範圍,本文稍後會討論。

  • 類別範圍 類別成員的名稱具有類別範圍,不論宣告點為何,都會在整個類別定義中延伸。 類別成員輔助功能是由、 publicprivate 關鍵詞進一步控制protected。 公用或受保護的成員只能使用成員選取運算子 (或 *

  • 語句範圍 在語句區塊結尾之前,會顯示在 、 forifwhile 語句中switch宣告的名稱。

  • 函式範圍 具有函式範圍,這表示即使在函式宣告點之前,函式主體仍可看見它。 函式範圍可讓您在宣告標籤之前goto cleanup撰寫類似 cleanup 的語句。

隱藏名稱

您可以在封閉的區塊中宣告名稱,以隱藏該名稱。 下圖是在內層區塊中重新宣告 i,從而隱藏外層區塊範圍中與 i 相關的變數。

顯示區塊範圍名稱隱藏的圖表。
封鎖範圍和名稱隱藏

本圖所示的程式輸出為:

i = 0
i = 7
j = 9
i = 0

注意

szWhat 引數被視為在函式的範圍中。 因此,其會被視為已在函式的最外層區塊中宣告。

隱藏類別名稱

您可以藉由宣告函式、物件、變數或相同範圍中的列舉程式,隱藏類別名稱。 不過,在 關鍵詞 class前面加上 時,仍然可以存取類別名稱。

// hiding_class_names.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

// Declare class Account at global scope.
class Account
{
public:
    Account( double InitialBalance )
        { balance = InitialBalance; }
    double GetBalance()
        { return balance; }
private:
    double balance;
};

double Account = 15.37;            // Hides class name Account

int main()
{
    class Account Checking( Account ); // Qualifies Account as
                                       //  class name

    cout << "Opening account with a balance of: "
         << Checking.GetBalance() << "\n";
}
//Output: Opening account with a balance of: 15.37

注意

呼叫類別名稱 (Account) 的任何位置,都必須使用 關鍵詞類別來區分它與全域範圍的變數 Account。 當類別名稱出現在範圍解析運算子 (::) 的左邊時,不適用這項規則。 範圍解析運算子左邊的名稱一律視為類別名稱。

下列範例示範如何使用 關鍵詞宣告 型Accountclass別物件的指標:

class Account *Checking = new class Account( Account );

Account前一個語句中初始化運算式中的 ,具有全域範圍;其類型double為 。

注意

重複使用識別項名稱 (如這個範例中所示) 會視為不良的程式設計風格。

如需類別物件宣告和初始化的相關信息,請參閱 類別、結構和等位。 如需使用 newdelete 免費存放區運算子的相關信息,請參閱 新的和刪除運算符

隱藏具有全域範圍的名稱

您可以在區塊範圍中明確宣告相同的名稱,以隱藏具有全域範圍的名稱。 不過,您可以使用範圍解析運算元 (::) 來存取全域範圍名稱。

#include <iostream>

int i = 7;   // i has global scope, outside all blocks
using namespace std;

int main( int argc, char *argv[] ) {
   int i = 5;   // i has block scope, hides i at global scope
   cout << "Block-scoped i has the value: " << i << "\n";
   cout << "Global-scoped i has the value: " << ::i << "\n";
}
Block-scoped i has the value: 5
Global-scoped i has the value: 7

另請參閱

基本概念