1. 程式人生 > >C++中 作用域及可見性

C++中 作用域及可見性



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

1.作用域

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

       a.函式原型作用域

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

       b.塊作用域

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

        void fun(int x)
        {  
                 int a(x);               // a的作用域開始
                 cin>>a;
                 if (a>0)
                 {
                          int b;          // b的作用域開始
                          ......
                 }                          // 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()
        {
                 i=1;
                 {                                              //子塊
                         int i;                                //塊作用域
                         i=2;
                         cout<<"i="<<i<<endl;  //輸出2
                 }
                 cout<<"i="<<i;   //輸出1