|
溫故而知新,閑來無事,再次捧了本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ì) class Account { Account( double amount, const string &owner ); string owner() { return _owner; } static double getRate(){return _interestRate;}
為什么把_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 {
靜態(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ì)象所共享. 靜態(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"; |
|
|