C++共享变量机制
在程序設(shè)計(jì)中如何實(shí)現(xiàn)不同的函數(shù)模塊之間的數(shù)據(jù)共享,是程序設(shè)計(jì)中的關(guān)鍵技術(shù)問(wèn)題。
????
??? 本文以C++為例,詳細(xì)闡述了面向?qū)ο蟪绦蛟O(shè)計(jì)中各種方式數(shù)據(jù)共享的實(shí)現(xiàn)機(jī)制。
????
??? C++是目前應(yīng)用廣泛的一種面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,它比較適合于編寫大型復(fù)雜程序。它所提供的數(shù)據(jù)共享機(jī)制具有廣泛的代表性,能夠很好的解決程序設(shè)計(jì)中數(shù)據(jù)的共享。
????
??? 1、使用局部變量和全局變量共享
????
??? 數(shù)據(jù)使用局部變量能夠在調(diào)用和被調(diào)用函數(shù)之問(wèn)通過(guò)參數(shù)傳遞實(shí)現(xiàn)不同函數(shù)塊之問(wèn)的數(shù)據(jù)共享【局部變量具有局部作用域,能很好地實(shí)現(xiàn)函數(shù)之間的數(shù)據(jù)隱蔽。但在傳遞過(guò)程中需要很大的系統(tǒng)開(kāi)銷,故一般只用于傳遞少量的數(shù)據(jù)。
????
??? 全局變量具有文件作用域。全局變量所存儲(chǔ)的數(shù)據(jù)在程序中任何地方都可以訪問(wèn),能夠在程序中的所有函數(shù)之間實(shí)現(xiàn)數(shù)據(jù)共享。例如:
????
??? include< iostream.h >
????
??? int i;//定義i為全局變量
????
??? void f()
????
??? {i=8;}//在函數(shù)f中給全局變量賦值
????
??? void P()
????
??? {cout《 i《endl;}//在函數(shù)P中輸出全局變量i
????
??? int main()
????
??? {
????
??? f();//調(diào)用函數(shù)f給全局變量賦值為“8”
????
??? P();//調(diào)用函數(shù)P輸出全局變量值“8''
????
??? return 0;}
????
??? 使用全局變量實(shí)現(xiàn)共享數(shù)據(jù)相當(dāng)方便,但其副作用也相當(dāng)大。因?yàn)槿肿兞繜o(wú)法對(duì)數(shù)據(jù)的訪問(wèn)權(quán)進(jìn)行有效控制。也就是說(shuō),我們很難知道程序中數(shù)據(jù)在那些函數(shù)中共享,這樣一旦共享的黃石理工學(xué)院學(xué)報(bào)2005年數(shù)據(jù)發(fā)生結(jié)構(gòu)性調(diào)整,也就很難判斷它到底影響到哪些函數(shù),從而給程序維護(hù)帶來(lái)相當(dāng)大的困難。
????
??? 這種共享方式,直接影響到數(shù)據(jù)安全、程序代碼重用和擴(kuò)充。所以,在程序設(shè)計(jì)中,應(yīng)可能少的使用這種共享方式。
????
??? 2、通過(guò)類的數(shù)據(jù)成員共享數(shù)據(jù)
????
??? C++中類內(nèi)部封裝的數(shù)據(jù)成員提供了同一類的函數(shù)成員之間進(jìn)行數(shù)據(jù)共享機(jī)制。這種共享方式一方面實(shí)現(xiàn)了類內(nèi)部函數(shù)的全面共享,同時(shí)也提供了通過(guò)設(shè)置適當(dāng)?shù)脑L問(wèn)控制屬性,把共享只限制在類的范圍之內(nèi),這樣對(duì)類外來(lái)說(shuō),類的數(shù)據(jù)成員仍是隱藏的,達(dá)到了共享與隱藏兩全,解決了全局變量和局部變量所無(wú)法克服的矛盾。例如:一個(gè)時(shí)鐘類,該類中封裝了私有數(shù)據(jù)成員有Hour,Minute,Second,在類的成員函數(shù)之間實(shí)現(xiàn)數(shù)據(jù)共享。在類的外面,對(duì)它們的訪問(wèn)只能通過(guò)類自身提供的外部接口進(jìn)行,無(wú)法直接訪問(wèn)。
????
??? Class Clock//時(shí)鐘類的聲明
????
??? {
????
??? public://#b部接口,公有數(shù)據(jù)成員函數(shù)
????
??? void SetTime(int NewH =0,int NewM =0,int
????
??? News=0);
????
??? void ShowTime();
????
??? private://私有數(shù)據(jù)成員 .
????
??? int Hour,Minute,Second;//在類的成員函數(shù)之間共享
????
??? };
????
??? 3、通過(guò)類的靜態(tài)成員實(shí)現(xiàn)數(shù)據(jù)共享
????
??? C++中使用靜態(tài)成員可以實(shí)現(xiàn)同一類的不同對(duì)象之間共享數(shù)據(jù)。類的普通數(shù)據(jù)成員在類的每一個(gè)對(duì)象都有一個(gè)拷貝,就是說(shuō)每個(gè)對(duì)象的同名數(shù)據(jù)成員可以分別存儲(chǔ)不同數(shù)值,這就保證對(duì)象擁有自身區(qū)別其他對(duì)象的特征的需要。靜態(tài)數(shù)據(jù)成員是類的數(shù)據(jù)成員的一種特例,采用static關(guān)鍵字來(lái)聲明;每個(gè)類只有一個(gè)拷貝,由該類的所有對(duì)象共同維護(hù)和使用,從而實(shí)現(xiàn)了同一類的不同對(duì)象之間的數(shù)據(jù)共享。例如有一學(xué)生類:
????
??? class student
????
??? {
????
??? private:
????
??? im ID :
????
??? char nalne;
????
??? static count;//靜態(tài)數(shù)據(jù)成員,用來(lái)存放”人
????
??? //其他數(shù)據(jù)成員與函數(shù)成員略
????
??? }
????
??? 如果程序中需要統(tǒng)計(jì)學(xué)生人數(shù),這個(gè)數(shù)據(jù)存放在什么地方呢?若以類外的全局變量來(lái)存放,不能實(shí)現(xiàn)數(shù)據(jù)的隱藏,若在類中增加一個(gè)數(shù)據(jù)成員用以存放人數(shù),必然在每一個(gè)對(duì)象中都存儲(chǔ)一副本,這樣不僅冗余,而且每個(gè)對(duì)象分別維護(hù)一個(gè)“人數(shù)”,勢(shì)必造成數(shù)據(jù)的不一致性。因此,比較好的方案是在student類中增加一個(gè)靜態(tài)數(shù)據(jù)成員static count用來(lái)存放學(xué)生“人數(shù)”.
????
??? 4、通過(guò)友元機(jī)制共享數(shù)據(jù)
????
??? 在一個(gè)類中,可以利用關(guān)鍵字friend將別的模塊(一般函數(shù)、其他類的成員函數(shù)或其他類)聲明為它的友元,這樣這個(gè)類中本來(lái)隱藏的信息就可以被友元訪問(wèn)【如果友元是一般函數(shù)或類的成員函數(shù),稱為友元函數(shù);如果友元是一個(gè)類,則稱為友元類,友元類的所有成員函數(shù)都成為友元函數(shù)。例如:
????
??? class B
????
??? {. //B類的成員聲明
????
??? friend float f(B&x,B&y);//友元函數(shù)聲明
????
??? friend class A;//聲明A為B的友元類
????
??? };
????
??? 在B類聲明f函數(shù)為友元函數(shù),則在f函數(shù)中通過(guò)對(duì)象名可直接訪問(wèn)B類所有的數(shù)據(jù)成員。同時(shí)在B類聲明A類為友元類,則A類的所有成員函數(shù)都是B類的友元函數(shù),都可以訪問(wèn)B類的私有和保護(hù)成員。采用友元類共享數(shù)據(jù)機(jī)制,使友元類成員函數(shù)可以通過(guò)對(duì)象名直接訪問(wèn)到隱藏的數(shù)據(jù),從而使程序達(dá)到高效協(xié)調(diào)工作。在較為復(fù)雜的問(wèn)題中,實(shí)現(xiàn)不同類之間的數(shù)據(jù)共享,友元類的使用也是必不可少的選擇。
????
??? 友元在類之間、類與普通函數(shù)之間共享了內(nèi)部封裝的數(shù)據(jù)的同時(shí),必然會(huì)對(duì)類的封裝性帶來(lái)一定的破壞。因此在程序設(shè)計(jì)中使用友元,要在共享和封裝之間找到一個(gè)恰當(dāng)?shù)钠胶恻c(diǎn),從而達(dá)到提高程序效率同時(shí),將程序隱患降來(lái)最低。
????
??? 5、結(jié)束語(yǔ)
????
??? 在大型程序設(shè)計(jì)中數(shù)據(jù)共享問(wèn)題是一個(gè)復(fù)雜的綜合性問(wèn)題。設(shè)計(jì)過(guò)程中既要實(shí)現(xiàn)數(shù)據(jù)共享,又要保證共享數(shù)據(jù)的安全。這就要求程序設(shè)計(jì)人員必須充分了解各種實(shí)現(xiàn)機(jī)制的運(yùn)行場(chǎng)合,熟知運(yùn)用它們所帶來(lái)的利與弊,這樣才能恰到好處地運(yùn)用這些機(jī)制,設(shè)計(jì)出高質(zhì)量程序。
不知道看完這邊文章,學(xué)員們對(duì)于C++中數(shù)據(jù)共享的實(shí)現(xiàn)機(jī)制了解的更加清楚了呢?希望本篇文章能對(duì)大家有一定的幫助。
總結(jié)
- 上一篇: C++ Public, Protecte
- 下一篇: Fast implementation/