本章內容均為coursera中c++程式設計課件的整理
基本概念
靜態成員:在說明前面加了static關鍵字的成員。
class crectangle
;
普通成員變數每個物件有各自的乙份,而靜態成員變數一共就乙份,為所有物件共享。
sizeof 運算子不會計算靜態成員變數。
class cmyclass ;
則 sizeof( cmyclass ) 等於 4
普通成員變數每個物件有各自的乙份,而靜態成員變數一共就乙份,為所有物件共享。
普通成員函式必須具體作用於某個物件,而靜態成員函式並不具體作用與某個物件。
因此靜態成員不需要通過物件就能訪問。
如何訪問靜態成員
1) 類名::成員名
crectangle::printtotal();
2) 物件名.成員名
crectangle r;
r.printtotal();
3) 指標->成員名
crectangle * p = &r;
p->printtotal();
4) 引用.成員名
crectangle & ref = r;
int n = ref.ntotalnumber;
靜態成員變數本質上是全域性變數,哪怕乙個物件都不存在,類的靜態成員變數也存在。
靜態成員函式本質上是全域性函式。
設定靜態成員這種機制的目的是將和某些類緊密相關的全域性變數和函式寫到類裡面,看上去像乙個整體,
易於維護和理解。
靜態成員的初始化
在c++中,類的靜態成員(static member)必須在類內宣告,在類外初始化,像下面這樣:
class a
;int a::count = 0 ; // 類外初始化,不必再加static關鍵字
因為靜態成員屬於整個類,而不屬於某個物件,如果在類內初始化,會導致每個物件都包含該靜態成員,這是矛盾的。
靜態成員示例
考慮乙個需要隨時知道矩形總數和總面積的圖形處理程式,可以用全域性變數來記錄總數和總面積。
用靜態成員將這兩個變數封裝進類中,就更容易理解和維護。
class crectangle
;crectangle::crectangle(int w_,int h_)
crectangle::~crectangle()
void crectangle::printtotal()
int crectangle::ntotalnumber = 0;
int crectangle::ntotalarea = 0;
// 必須在定義類的檔案中對靜態成員變數進行一次說明
//或初始化。否則編譯能通過,鏈結不能通過。
int main()
輸出結果:
2,13
2,13
注意事項
在靜態成員函式中,不能訪問非靜態成員變數,也不能呼叫非靜態成員函式。
void crectangle::printtotal()
cretangle::printtotal(); //解釋不通, w 到底是屬於那個物件的?
crectangle::crectangle(int w_,int h_)
crectangle::~crectangle()
void crectangle::printtotal()
此crectangle類寫法,有何缺陷?
在使用crectangle類時,有時會呼叫複製建構函式生成臨時的隱藏的crectangle物件。
呼叫乙個以crectangle類物件作為返回值的函式時,臨時物件在消亡時會呼叫析構函式,減少ntotalnumber 和
ntotalarea的值,可是這些臨時物件在生成時卻沒有增加ntotalnumber 和 ntotalarea的值。
解決辦法:為crectangle類寫乙個複製建構函式。
crectangle :: crectangle(crectangle & r )
靜態成員變數 和 靜態成員函式
資料成員可以分靜態變數 非靜態變數兩種.靜態成員 靜態類中的成員加入static修飾符,即是靜態成員.可以直接使用類名 靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中靜...
靜態成員變數和靜態成員函式
我們學到的類物件的成員變數一般都是這個物件專屬,不能為其他物件所共有。然而在實際程式設計中我們需要統計物件的數量等問題,所以就必須設定乙個類的物件所共有的變數,就是靜態成員變數。首先通過乙個簡單的例程 說明靜態成員如何使用。includeusing namespace std class a vir...
靜態成員變數和靜態成員函式
靜態成員提供乙個同類成員的共享機制 static 關鍵字可以說明乙個類的成員 把乙個類的成員說成說明成 ststic 時,這個類無論有多少物件被建立 這些物件共享這個static 成員 靜態成員變數 include using namespace std class bb void addc pro...