C 中 作用域及可見性

2021-06-28 13:47:23 字數 2236 閱讀 7983



作用域是用來表示某個識別符號在什麼範圍內有效,可見性是指識別符號是否可見,可引用。

1.作用域

作用域是這樣乙個區域,識別符號在程式的這個區域內是有效的。c++的作用域主要有四種:函式原型作用域、塊作用域、類作用域和檔案作用域。

a.函式原型作用域

函式原型大家還記得嗎?比如:void fun(int x);這個語句就是函式原型的宣告。函式原型宣告中的形參的作用範圍就是函式原型作用域。fun函式中形參x有效的範圍就在左、右兩個括號之間,出了這兩個括號,在程式的其他地方都無法引用x。識別符號x的作用域就是所謂的函式原型作用域。函式原型如果有形參,宣告時一定要有形參的型別說明,但是形參名比如x可以省略,不會對程式有任何影響,一般為了程式可讀性好,我們一般都寫上乙個容易理解的形參名。函式原型作用域是最小的作用域。

b.塊作用域

這裡說的塊就是一對大括號括起來的一段程式,塊中宣告的識別符號在什麼範圍內有效呢?從識別符號宣告處到塊結束的大括號之間都有效。也就是說塊中識別符號的作用域就是從識別符號宣告處開始,到塊結束的大括號為止。給個例子說明下:

void fun(int x)

// b的作用域結束

} // a的作用域結束

在fun的函式體內宣告了整型變數a,又在if語句的分支內宣告了變數b,a和b都具有塊作用域,但是它們的塊作用域並不同。a的作用域從其宣告處開始,到其所在塊的結束處也就是整個函式體結束的地方為止,b的作用域是從b宣告處開始到其所在塊結束也就是if分支體結束0的地方為止。

c.類作用域

假設有乙個類a,a中有乙個資料成員x,x在a的所有函式成員中都有效,除非函式成員中也定義了乙個名稱為x的變數,這樣的x就具有類作用域。為什麼要排除含有另乙個名稱也為x的變數的函式成員呢?因為那樣的話a的資料成員x在此函式成員被函式成員中的另乙個x覆蓋,不可見了,關於可見性下面會講。

函式成員訪問的大多數資料成員都具有類作用域。我們一般用a.x的方式訪問類a的物件a的資料成員x,這裡的x就具有類作用域。

符號「.」用於訪問物件的成員,包括函式成員。比如,a.fun(x)用來呼叫物件a的函式fun。如果ptr是指向類a的乙個物件的指標,則訪問其資料成員x的方式為ptr->x,訪問函式成員的形式如:ptr->fun(x)。

d.檔案作用域

如果乙個識別符號沒有在前三種作用域中出現,則它具有檔案作用域。這種識別符號的作用域從宣告處開始,到檔案結尾處結束。

給個例子說明下檔案作用域:

#include

using namespace std;

int i; 

//檔案作用域

int main()

cout<

//輸出1

return 0; }

上面的例子中,在main函式之前宣告了變數i,i在整個原始檔中都有效,即它具有檔案作用域。而在子塊中也宣告乙個變數i,這個i具有塊作用域。進入main函式後給i賦了初值1,在子塊中又宣告了乙個同名變數i,並賦初值2,第一次輸出i時輸出i=2,為什麼呢?因為子塊裡具有塊作用域的i把外面具有檔案作用域的i遮蔽掉了,就是說在子塊中,具有檔案作用域的i是不可見的。出了子塊後,具有塊作用域的i就無效了,所以就輸出具有檔案作用域的i的值i=1。

2.可見性

識別符號的可見性是指在程式的某個地方是否是有效的,是否能夠被引用被訪問。程式執行到某一處時,能夠訪問的識別符號就是在此處可見的識別符號。

上面說的四種作用域中,最大的是檔案作用域,其次是類作用域,再次是塊作用域。它們的包含關係是:

作用域可見性要注意的幾點是:

a.我們要引用識別符號時,必須先宣告識別符號。

b.在乙個作用域內,不能宣告多於乙個的同名的識別符號。

c.在不同的作用域,並且這些作用域間沒有互相包含關係,則可以在其中宣告同名識別符號,這些同名識別符號不會互相影響。

d.如果在有包含關係的作用域中宣告了同名識別符號,則外層作用域中的識別符號在內層作用域中不可見。

我們再來看下檔案作用域中的那個例子,此例就是檔案作用域中包含了塊作用域的例子。在子塊之前可以引用具有檔案作用域的變數i,此時它是可見的,但是進入子塊後,就只能引用具有塊作用域的變數i了,這時具有檔案作用域的變數i就不可見了,這就是上面d中說的外層的識別符號被內層的同名識別符號遮蔽,這也叫做同名覆蓋。

go 函式的作用域及可見性

比如 test.go 中 我們定義 了 a 作為全域性變數,那麼在這個程式中任何地方都可以呼叫a,這個 var a int 100 func add a int,b int int package main import fmt zhangyue res listen6 可見性 func main ...

變數的作用域與可見性

1.基本概念 變數有資料型別 char unsigned char short unsigned short int unsigned int long unsigned long float double 定義變數 int a 100 自動分配4位元組的記憶體空間,其中儲存100 2.從作用域與可...

PL SQL變數作用範圍及可見性

在pl sql程式設計中,如果在變數的定義上沒有做到統一的話,可能會隱藏一些危險的錯誤,這樣的原因主要是變數的作用範圍所致。與其它高階語言類似,pl sql的變數作用範圍特點是 變數的作用範圍是在你所引用的程式單元 塊 子程式 包 內。即從宣告變數開始到該塊的結束。乙個變數 標識 只能在你所引用的塊...