範圍規則摘要
使用的名稱在其範圍內不可以模稜兩可 (其位置由多載決定)。 如果名稱表示一個函式,該函式必須明確指定參數的數目和類型。 如果名稱仍然明確, 則會套用成員存取 規則。
建構函式初始設定式
建構函式初始化運算式 會在指定建構函式的最外層區塊範圍內進行評估。 因此,它們可以使用建構函式的參數名稱。
全域名稱
物件、函式或列舉程式若是在任何函式或類別之外引入,或是加上全域一元範圍運算子 (::
) 前置詞,且未與下列任何二元運算子搭配使用,其名稱即為全域名稱:
範圍解析 (
::
)物件和參考的成員選取範圍 ( . )
指標的成員選取範圍 ( - > )
限定名稱
與二進位範圍解析運算子 ( ::
) 搭配使用的名稱稱為「限定名稱」。在二進位範圍解析運算子之後指定的名稱必須是運算子左邊指定的類別成員,或是其基類的成員。
在成員選取運算子 ( 或 - > ) 之後指定的名稱必須是運算子左邊指定之物件的類別類型成員,或是其基類成員的成員。 成員選取運算子 ( - > ) 右邊所指定的名稱也可以是另一個類別類型的物件,前提是 的左側 > 是 - 是類別物件,而且類別會定義多載的成員選取運算子 ( - > ) 來評估為其他類別類型的指標。 (本條款在 中更詳細 地討論類別成員存取 。)
編譯器會依照下列順序搜尋名稱,並且在找到名稱時停止:
如果名稱是在函式內使用,則為目前區塊範圍,否則為全域範圍。
向外至每個封閉區塊範圍,包括最外層的函式範圍 (包括函式參數)。
如果名稱是在成員函式內使用,則會在類別的範圍內搜尋名稱。
在類別的基底類別內搜尋名稱。
在封閉巢狀類別範圍 (如果有的話) 及其基底內搜尋。 搜尋會繼續,直到搜尋至最外層封閉類別範圍為止。
在全域範圍內搜尋。
不過,您可以依照下述方式修改這個搜尋順序:
前面加上
::
的名稱會強制從全域範圍開始搜尋。前面加上
class
、struct
和union
關鍵字的名稱會強制編譯器只搜尋class
、struct
或union
名稱。範圍解析運算子 (
::
) 左邊的名稱只能class
是 、struct
、namespace
或union
名稱。
如果名稱參考非靜態成員,但是在靜態成員函式中使用,則會產生錯誤訊息。 同樣地,如果名稱參考封入類別中的任何非靜態成員,就會產生錯誤訊息,因為封閉類別沒有封入類別 this
指標。
函式參數名稱
函式定義中的函式參數名稱會視為在函式最外層區塊的範圍內。 因此,它們會是區域名稱且當函式結束時會超出範圍。
函式宣告 (原型) 中的函式參數名稱會位於宣告的區域範圍,而在宣告的結尾會超出範圍。
預設參數會位於其所預設的參數範圍內,如上兩個段落中所述。 但是,它們無法存取區域變數或非靜態類別成員。 預設參數是在函式呼叫時進行評估,但是它們是在函式宣告的原始範圍中進行評估。 因此,成員函式的預設參數一定是在類別範圍中進行評估。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應