电竞比分网-中国电竞赛事及体育赛事平台

分享

c++ 靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)

 WUCANADA 2012-04-15

c++ 靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)

分類: c++ 2149人閱讀 評(píng)論(2) 收藏 舉報(bào)

       溫故而知新,閑來無事,再次捧了本c++primer 看了看,寫點(diǎn)c++靜態(tài)成員變量和成員函數(shù)吧,以前一直在用,但是有沒有完全搞懂什么時(shí)候該用static 成員變量,什么時(shí)候該用static function,什么時(shí)候不要用靜態(tài)成員函數(shù)。

       靜態(tài)成員變量:primer中是這樣說的,對(duì)于所有的對(duì)象共有一個(gè)成員變量的就用static ,提供一個(gè)所有對(duì)象共有的一個(gè)成員變量比“每一個(gè)類對(duì)象維護(hù)一個(gè)成員變量” 要更有效。

       在這種情況下類的靜態(tài)數(shù)據(jù)成員提供了一個(gè)更好的方案靜態(tài)數(shù)據(jù)成員被當(dāng)作該類類型的全局對(duì)象對(duì)于非靜態(tài)數(shù)據(jù)成員,每個(gè)類對(duì)象都有自己的拷貝而靜態(tài)數(shù)據(jù)成員對(duì) 每個(gè)類類型只有一個(gè)拷貝靜態(tài)數(shù)據(jù)成員,只有一份由該類類型的所有對(duì)象共享訪問。同全局對(duì)象相比使用靜態(tài)數(shù)據(jù)成員有兩個(gè)優(yōu)勢(shì)
      1 靜態(tài)數(shù)據(jù)成員沒有進(jìn)入程序的全局名字空間因此不存在與程序中其他全局名字沖突的可能性
      2 可以實(shí)現(xiàn)信息隱藏靜態(tài)成員可以是private 成員而全局對(duì)象不能
      在類體中的數(shù)據(jù)成員聲明前面加上關(guān)鍵字static 就使該數(shù)據(jù)成員成為靜態(tài)的static 數(shù)據(jù)成員,遵從public/private/protected 訪問規(guī)則,例如在下面定義的Account 類中_interestRate是被聲明為double 型的私有靜態(tài)成員


class Account {
        Account( double amount, const string &owner );
        string owner() { return _owner; }

        static double getRate(){return _interestRate;}
private:
       static double _interestRate;
       double _amount;
       string _owner;
};



為什么把_interestRate 聲明為static 而_amount 和_owner 不呢,這是因?yàn)槊總€(gè)Account對(duì)應(yīng)不同的主人有不同數(shù)目的錢而所有Account 的利率卻是相同的,因?yàn)樵谡麄€(gè)程序中只有一個(gè)_interestRate 數(shù)據(jù)成員它被所有Account對(duì)象共享,所以把_interestRate聲明為靜態(tài)成員,減少每個(gè)Account對(duì)象所需的存儲(chǔ)空間。

 

        靜態(tài)成員函數(shù):靜態(tài)成員函數(shù)一般只能訪問靜態(tài)成員變量,如果要訪問非靜態(tài)成員變量的話,只能訪問某一個(gè)對(duì)象的非靜態(tài)成員變量和靜態(tài)成員函數(shù)。可以傳一個(gè)對(duì)象的指針,引用等參數(shù)給這個(gè)靜態(tài)成員函數(shù)。

      class   a   { 
public: 
    a():m_ia(123)   {} 
    int   getia()   {   return   m_ia;   } 
    static   int   f(a   &aa)   {   return   aa.getia();   } 
private: 
    int   m_ia; 
}; 

void   main() 

    a   aa; 
    cout<<a::f(aa); 
}  

 

     靜態(tài)成員函數(shù)中是不能調(diào)用非靜態(tài)成員的,包括非靜態(tài)成員函數(shù)和非靜態(tài)成員變量。那么在非靜態(tài)成員函數(shù)中是否可以調(diào)用靜態(tài)成員函數(shù)呢?答案是肯定的,因?yàn)殪o 態(tài)成員函數(shù)屬于類本身,在類的對(duì)象產(chǎn)生之前就已經(jīng)存在了,所以在非靜態(tài)成員函數(shù)中是可以調(diào)用靜態(tài)成員函數(shù)的。其實(shí),我們也可以以一個(gè)內(nèi)存模型這個(gè)角度來考 慮,也就是說,無論采取什么樣的操作,程序代碼都是在內(nèi)存中運(yùn)行的,只有在內(nèi)存中占有了一席之地,我們才能訪問它。如果一個(gè)成員函數(shù)或成員變量還沒有在內(nèi) 存中產(chǎn)生,結(jié)果是無法訪問它的。所有靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量。

使用static關(guān)鍵字聲明的函數(shù)成員使靜態(tài)的,靜態(tài)成員函數(shù)同樣也屬于整個(gè)類,由同一個(gè)類的所有對(duì)象共同維護(hù),為這些對(duì)象所共享.  
      作為成員函數(shù),它的訪問屬性可以受到類的嚴(yán)格控制,對(duì)于公有的靜態(tài)函數(shù)成員函數(shù),可以通過類名或?qū)ο竺麃碚{(diào)用,但一般情況下建議用對(duì)象名來引用靜態(tài)函數(shù)成員.注意,一般的成員函數(shù)只能通過對(duì)象名來調(diào)用.  
        由于一個(gè)類的靜態(tài)成員函數(shù)只有一個(gè)拷貝,因此它訪問對(duì)象的數(shù)據(jù)和函數(shù)時(shí)受到了限制.靜態(tài)成員函數(shù)可以直接訪問該類的靜態(tài)數(shù)據(jù)成員.而訪問非靜態(tài)數(shù)據(jù)成員, 必須通過參數(shù)傳遞方式得到對(duì)象名,然后通過對(duì)象名來訪問.可以看到,通過靜態(tài)函數(shù)成員訪問非靜態(tài)成員使相當(dāng)麻煩的,一般的使用中,它主要用來訪問全局變量 或同一個(gè)類中的靜態(tài)數(shù)據(jù)成員,特別是和后者一起使用,達(dá)到對(duì)同一個(gè)類中對(duì)象之間共享的數(shù)據(jù)進(jìn)行維護(hù)的目的.  
        構(gòu)造函數(shù)和析構(gòu)函數(shù)不可以定義為static,構(gòu)造函數(shù)要給每一個(gè)對(duì)象一個(gè)this指針如果可以是靜態(tài)的,它如何構(gòu)造和訪問this指針?
明顯是不可以的!

      靜態(tài)成員變量一般要在.cpp文件里進(jìn)行定義:double Account::_interestRate = 0.0589;靜態(tài)成員函數(shù)的聲明除了在類體中的函數(shù)聲明前加上關(guān)鍵字static 以及不能聲明為const 或volatile 之外與非靜態(tài)成員函數(shù)相同,出現(xiàn)在類體外的函數(shù)定義不能指定關(guān)鍵字static.

       const string str = "liangxueliang";
    Account *Acc = new Account(222222,str);
    Acc->getRate();
    Account::getRate();

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多