閱讀71 返回首頁    go 技術社區[雲棲]


C++中數據共享的實現機製

在程序設計中如何實現不同的函數模塊之間的數據共享,是程序設計中的關鍵技術問題。
    
    本文以C++為例,詳細闡述了麵向對象程序設計中各種方式數據共享的實現機製。
    
    C++是目前應用廣泛的一種麵向對象程序設計語言,它比較適合於編寫大型複雜程序。它所提供的數據共享機製具有廣泛的代表性,能夠很好的解決程序設計中數據的共享。
    
    1、使用局部變量和全局變量共享
    
    數據使用局部變量能夠在調用和被調用函數之問通過參數傳遞實現不同函數塊之問的數據共享【局部變量具有局部作用域,能很好地實現函數之間的數據隱蔽。但在傳遞過程中需要很大的係統開銷,故一般隻用於傳遞少量的數據。
    
    全局變量具有文件作用域。全局變量所存儲的數據在程序中任何地方都可以訪問,能夠在程序中的所有函數之間實現數據共享。例如:
    
    include< iostream.h >
    
    int i;//定義i為全局變量
    
    void f()
    
    {i=8;}//在函數f中給全局變量賦值
    
    void P()
    
    {cout《 i《endl;}//在函數P中輸出全局變量i
    
    int main()
    
    {
    
    f();//調用函數f給全局變量賦值為“8”
    
    P();//調用函數P輸出全局變量值“8''
    
    return 0;}
    
    使用全局變量實現共享數據相當方便,但其副作用也相當大。因為全局變量無法對數據的訪問權進行有效控製。也就是說,我們很難知道程序中數據在那些函數中共享,這樣一旦共享的黃石理工學院學報2005年數據發生結構性調整,也就很難判斷它到底影響到哪些函數,從而給程序維護帶來相當大的困難。
    
    這種共享方式,直接影響到數據安全、程序代碼重用和擴充。所以,在程序設計中,應可能少的使用這種共享方式。
    
    2、通過類的數據成員共享數據
    
    C++中類內部封裝的數據成員提供了同一類的函數成員之間進行數據共享機製。這種共享方式一方麵實現了類內部函數的全麵共享,同時也提供了通過設置適當的訪問控製屬性,把共享隻限製在類的範圍之內,這樣對類外來說,類的數據成員仍是隱藏的,達到了共享與隱藏兩全,解決了全局變量和局部變量所無法克服的矛盾。例如:一個時鍾類,該類中封裝了私有數據成員有Hour,Minute,Second,在類的成員函數之間實現數據共享。在類的外麵,對它們的訪問隻能通過類自身提供的外部接口進行,無法直接訪問。
    
    Class Clock//時鍾類的聲明
    
    {
    
    public://#b部接口,公有數據成員函數
    
    void SetTime(int NewH =0,int NewM =0,int
    
    News=0);
    
    void ShowTime();
    
    private://私有數據成員 .
    
    int Hour,Minute,Second;//在類的成員函數之間共享
    
    };
    
    3、通過類的靜態成員實現數據共享
    
    C++中使用靜態成員可以實現同一類的不同對象之間共享數據。類的普通數據成員在類的每一個對象都有一個拷貝,就是說每個對象的同名數據成員可以分別存儲不同數值,這就保證對象擁有自身區別其他對象的特征的需要。靜態數據成員是類的數據成員的一種特例,采用static關鍵字來聲明;每個類隻有一個拷貝,由該類的所有對象共同維護和使用,從而實現了同一類的不同對象之間的數據共享。例如有一學生類:
    
    class student
    
    {
    
    private:
    
    im ID :
    
    char nalne;
    
    static count;//靜態數據成員,用來存放”人
    
    //其他數據成員與函數成員略
    
    }
    
    如果程序中需要統計學生人數,這個數據存放在什麼地方呢?若以類外的全局變量來存放,不能實現數據的隱藏,若在類中增加一個數據成員用以存放人數,必然在每一個對象中都存儲一副本,這樣不僅冗餘,而且每個對象分別維護一個“人數”,勢必造成數據的不一致性。因此,比較好的方案是在student類中增加一個靜態數據成員static count用來存放學生“人數”.
    
    4、通過友元機製共享數據
    
    在一個類中,可以利用關鍵字friend將別的模塊(一般函數、其他類的成員函數或其他類)聲明為它的友元,這樣這個類中本來隱藏的信息就可以被友元訪問【如果友元是一般函數或類的成員函數,稱為友元函數;如果友元是一個類,則稱為友元類,友元類的所有成員函數都成為友元函數。例如:
    
    class B
    
    {. //B類的成員聲明
    
    friend float f(B&x,B&y);//友元函數聲明
    
    friend class A;//聲明A為B的友元類
    
    };
    
    在B類聲明f函數為友元函數,則在f函數中通過對象名可直接訪問B類所有的數據成員。同時在B類聲明A類為友元類,則A類的所有成員函數都是B類的友元函數,都可以訪問B類的私有和保護成員。采用友元類共享數據機製,使友元類成員函數可以通過對象名直接訪問到隱藏的數據,從而使程序達到高效協調工作。在較為複雜的問題中,實現不同類之間的數據共享,友元類的使用也是必不可少的選擇。
    
    友元在類之間、類與普通函數之間共享了內部封裝的數據的同時,必然會對類的封裝性帶來一定的破壞。因此在程序設計中使用友元,要在共享和封裝之間找到一個恰當的平衡點,從而達到提高程序效率同時,將程序隱患降來最低。
    
    5、結束語
    
    在大型程序設計中數據共享問題是一個複雜的綜合性問題。設計過程中既要實現數據共享,又要保證共享數據的安全。這就要求程序設計人員必須充分了解各種實現機製的運行場合,熟知運用它們所帶來的利與弊,這樣才能恰到好處地運用這些機製,設計出高質量程序。

最後更新:2017-04-02 15:15:00

  上一篇:go Android教父高煥堂:開源隻是手段,開放才是目的
  下一篇:go SQL語句中where 1=1的基本用法