上一講雞啄米大概介紹了下UML知識,這一講開始雞啄米就要講講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++編程入門系列之十八(C++程序設計必知:作用域和可見性)

       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<iostream>
        using namespace std;
        int i;   //文件作用域
        int main()
        {
                 i=1;
                 {                                              //子塊
                         int i;                                //塊作用域
                         i=2;
                         cout<<"i="<<i<<endl;  //輸出2
                 }
                 cout<<"i="<<i;   //輸出1
                 return 0;
         }

       上面的例子中,在main函數之前聲明了變量i,i在整個源文件中都有效,即它具有文件作用域。而在子塊中也聲明一個變量i,這個i具有塊作用域。進入main函數後給i賦了初值1,在子塊中又聲明了一個同名變量i,并賦初值2,第一次輸出i時輸出i=2,為什麼呢?因為子塊裡具有塊作用域的i把外面具有文件作用域的i屏蔽掉了,就是說在子塊中,具有文件作用域的i是不可見的。出了子塊後,具有塊作用域的i就無效了,所以就輸出具有文件作用域的i的值i=1。

        2.可見性

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

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

雞啄米:C++編程入門系列之十八(C++程序設計必知:作用域和可見性)

       作用域可見性要注意的幾點是:
       a.我們要引用标識符時,必須先聲明标識符。
       b.在一個作用域内,不能聲明多于一個的同名的标識符。
       c.在不同的作用域,并且這些作用域間沒有互相包含關系,則可以在其中聲明同名标識符,這些同名标識符不會互相影響。
       d.如果在有包含關系的作用域中聲明了同名标識符,則外層作用域中的标識符在内層作用域中不可見。

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

       作用域和可見性的知識還算是比較簡單的。雞啄米相信大家很容易就能夠理解。如果有什麼問題大家可以在雞啄米博客中留言讨論,大家辛苦了。

 

除非特别注明,雞啄米文章均為原創
轉載請标明本文地址:http://dnsf85p.top/software/59.html
2011年9月30日
作者:雞啄米 分類:軟件開發 浏覽: 評論:8