資源描述:
《第5章 靜態(tài)成員與友員.ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、第5章靜態(tài)成員與友員5.1靜態(tài)成員的需要性5.2靜態(tài)數(shù)據(jù)成員5.3靜態(tài)函數(shù)成員5.4靜態(tài)成員的使用5.5友元的使用5.6編程實例5.1靜態(tài)成員的需要性類是類型而不是數(shù)據(jù)對象,每個類的對象都是該類數(shù)據(jù)成員的拷貝。然而,往往需要讓類的所有對象在類的范圍內(nèi)共享某個數(shù)據(jù),這些數(shù)據(jù)是類中所有對象共有的。聲明為static類的成員便能在類的范圍內(nèi)共享,稱為靜態(tài)成員。例如,建立一個學(xué)生鏈表,在Student類中,聲明鏈表的首指針和學(xué)生人數(shù)。classStudent{//...protected:Student*p
2、First;//鏈表首指針intcount;//學(xué)生人數(shù)};這個類聲明意味著每個學(xué)生對象都有一個鏈表首指針和學(xué)生數(shù),要想得到現(xiàn)有的學(xué)生數(shù),不能到類中去取,因為類不是一個占有內(nèi)存的實體。而到對象中去取,則要求一旦學(xué)生人數(shù)變化,就要對每個對象進行修改。如果將學(xué)生數(shù)的定義count放在全局變量中,則它們在類的外面,不符合面向?qū)ο笠蟮姆庋b性和重用性。例如,下面的代碼用全局變量來表示學(xué)生類鏈表首指針和學(xué)生人數(shù)。classStudent{//...};intcount;//記錄學(xué)生人數(shù),是全局變量Studen
3、t*pFirst;//學(xué)生類鏈表首指針,是全局變量voidfn(){Studentstud1;//創(chuàng)建第一個學(xué)生對象count++;//學(xué)生人數(shù)加1pFirst=&stud1;//對pFirst沒有約束}//fn()退出時,stud1作用域終止,stud1被析構(gòu)由于count和pFirst均為全局變量,在龐大的程序中,沒有真正指明哪個函數(shù)對它們負責,這種無規(guī)則會引起軟件設(shè)計的混亂,一旦程序變大,維護量就急劇上升。同時,在重用Student類的時候,總是還要額外地考慮全局變量的處置,這不得不使類的封裝
4、性受到傷害。若能將學(xué)生人數(shù)和鏈表首指針封裝在類里面,則count和pFrirst可以受到保護,還可以作為一個類而重用,這種屬于類的一部分,但既不適于用普通成員表示,也不適于用全局變量表示的數(shù)據(jù),用靜態(tài)成員來表示。5.2靜態(tài)數(shù)據(jù)成員在一個類中,若將一個數(shù)據(jù)成員說明為static,這個成員就成為靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員是類的所有對象共享的成員因此,靜態(tài)數(shù)據(jù)成員被看做是類的成員而不是某個對象的成員。靜態(tài)數(shù)據(jù)成員有以下特點:(1)使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存。因為無論建立多少個類的對象,都只有一個靜態(tài)數(shù)據(jù)
5、成員的拷貝,即對多個對象來說,靜態(tài)數(shù)據(jù)成員只有一個,供所有對象共用。(2)靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲的,必須對它進行初始化。靜態(tài)數(shù)據(jù)成員的初始化與一般數(shù)據(jù)成員的初始化不同,其格式如下:數(shù)據(jù)類型類名::靜態(tài)數(shù)據(jù)成員名=值;靜態(tài)數(shù)據(jù)成員采用如下方式聲明、分配內(nèi)存空間和初始化:classclassName{public:protected:staticintabc;//聲明靜態(tài)數(shù)據(jù)成員,未分配空間};intclassName::abc=0;//靜態(tài)數(shù)據(jù)成員在類聲明外分配空間和初始化注意:l初始化是在類體外進行
6、的,在類中不為它分配內(nèi)存空間;l初始化時不加該成員的訪問權(quán)限控制符private、protected、public;l初始化時必須使用作用域運算符(::)來表明它所屬的類。公共靜態(tài)數(shù)據(jù)成員可被類的外部訪問(即訪問控制權(quán)限設(shè)為public),保護或私有靜態(tài)數(shù)據(jù)成員只可被類的內(nèi)部訪問,上面的代碼描述了一個保護靜態(tài)數(shù)據(jù)成員。訪問靜態(tài)數(shù)據(jù)成員時,采用如下格式:類名::靜態(tài)數(shù)據(jù)成員名靜態(tài)數(shù)據(jù)成員用得比較多的場合一般為:l用來保存流動變化的對象個數(shù)(如:記錄學(xué)生類鏈表中學(xué)生對象的個數(shù));l作為一個標志,指示一個
7、特定的動作是否發(fā)生(如:可能創(chuàng)建幾個對象,每個對象要對某個磁盤文件進行寫操作,但顯然在同一時間里只允許一個對象寫文件,在這種情況下,用戶希望說明一個靜態(tài)數(shù)據(jù)成員指出文件何時正在使用,何時處于空閑狀態(tài));l一個指向一個鏈表第一成員或最后一個成員的指針(如:鏈表首指針pFirst)。例5.1對象計數(shù)模式。#includeclassPoint{doublex,y;staticintcount;public:Point(doublea=0,doubleb=0){x=a;y=b;cou
8、nt++;}//構(gòu)造函數(shù)Point(Point&p);//拷貝初始化構(gòu)造函數(shù)~Point(){};doubleGetX(){returnx};doubleGetY(){returny};voidShowCount()//輸出靜態(tài)數(shù)據(jù)成員{cout<<"PointObjectid="<