c++中為了保護類的封裝性,提出了static成員來代替全域性變數,下面我們來了解一下static成員的使用方法:程式通過vs2008除錯成功
例一:#include "stdafx.h"
#include
#include
#include
#include
#include
class test
;int test::a = 15;//類static資料成員必須在類宣告處外初始化
void test::show (void)
~test(){}
static void show(void);
private:
static int a;
int b; };
//void test::initial(int& lhs)
int test::a = 0;
void test::show (void)
3.靜態區域性變數屬於靜態儲存方式(即不在棧內),它具有以下特點:
(1)生存期長:
靜態區域性變數在函式內定義,但不象自動變數那樣,當呼叫時就存在,退出函式時就消失。靜態區域性變數始終存在著,也就是說它的生存期為整個源程式。
(2)作用域:
靜態區域性變數的生存期雖然為整個源程式,但是其作用域仍與自動變數相同。
(3)比全域性變數***小:
離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用,而且儲存了前次被呼叫後留下的值,雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成意外的***,例如中途被其它函式修改。
(4)乙個靜態資料成員不能是聯合成員,也不能是位域成員。
(5)靜態成員函式不能宣告為const!但引數可以是const。
4.注意事項:
(1)類的靜態成員函式是屬於整個類而非類的物件,所以它沒有this指標,這就導致了它僅能訪問類的靜態資料和靜態成員函式。
(2)不能將靜態成員函式定義為虛函式。
(3)由於靜態成員宣告於類中,操作於其外,所以對其取位址操作,就多少有些特殊,變數位址是指向其資料型別的指標,函式位址型別是乙個「nonmember函式指標」。
(4)由於靜態成員函式沒有this指標,所以就差不多等同於nonmember函式,結果就產生了乙個意想不到的好處:
成為乙個callback函式,使得我們得以將c++和c-based x window系統結合,同時也成功的應用於執行緒函式身上。
(5)static並沒有增加程式的時空開銷,相反她還縮短了子類對父類靜態成員的訪問時間,節省了子類的記憶體空間。
(6)靜態資料成員在《定義或說明》時前面加關鍵字static。
(7)靜態資料成員是靜態儲存的,所以必須對它進行初始化。
(8)靜態成員初始化與一般資料成員初始化不同:
初始化在類體外進行,而前面不加static,以免與一般靜態變數或物件相混淆;
初始化時不加該成員的訪問許可權控制符private,public等;
初始化時使用作用域運算子來標明它所屬類;
所以我們得出靜態資料成員初始化的格式:
<資料型別》《類名》::《靜態資料成員名》=《值》
(9)為了防止父類的影響,可以在子類定義乙個與父類相同的靜態變數,以遮蔽父類的影響。
這裡有一點需要注意:我們說靜態成員為父類和子類共享,但我們又重複定義了靜態成員,這會不會引起錯誤呢?
不會,我們的編譯器採用了一種絕妙的手法:name-mangling 用以生成唯一的標誌
static成員函式和static成員
c 的靜態成員是和類關聯的,它屬於某個類,但是不屬於某個特定的物件。靜態成員變數只儲存乙份供所有物件共用。所以在所有物件中都可以共享它。使用靜態成員變數實現多個物件之間的資料共享不會破壞隱藏的原則,保證了安全性還可以節省記憶體。但是可以通過物件呼叫靜態成員函式,雖然我們一般不會這麼做 1 class...
類中static變數和成員變數
要理解標題,我們首先來看下static變數本身的特殊之處,即它儲存在全域性資料區。在類中的static變數也是如此。c 的記憶體分布 區 函式體的二進位制 全域性資料區 全域性變數和static變數 堆 動態記憶體分配 通過new 棧 區域性變數 常量區 字元 文字常量 這之後我們先通過 觀察一下區...
C 之static類成員,static類成員函式
0.static修飾類中成員,表示類的共享資料 1.static類成員 在c primer裡面說過,static類成員不像普通的類資料成員,static類資料成員獨立於一切類物件處在。static類資料成員是與類關聯的,但不與該類定義的物件有任何關係。這句話什麼意思?就是static不會想普通類資料...