一、
按存儲區域分,全局變量、靜態全局變量和靜態局部變量都存放在內存的靜態存儲區域,局部變量存放在內存的棧區。
1定義全局靜態變量的好處:
<1>不會被其他文件所訪問,修改
<2>其他文件中可以使用相同名字的變量,不會發生衝突。
在函數的返回類型前加上關鍵字static,函數就被定義成爲靜態函數。
函數的定義和聲明默認情況下是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其
關鍵字extern和static用來說明具有靜態存儲期的變量和函數。用static聲明的局部變量具有靜態存儲持續期(static storage duration),或靜態範圍(static extent)。雖然他的值在函數調用之間保持有效,但是其名字的可視性仍限制在其局部域內。靜態局部對象在程序執行到該對象的聲明處時被首次初始化。(摘自《C++ Primer》 P337)
1. 靜態數據成員
1) 內存中的位置:靜態存儲區
2) 初始化和定義:
<1> 靜態數據成員定義時要分配空間,所以不能在類聲明中定義。
<2> 靜態數據成員在程序中只能提供一個定義,所以靜態數據成員的初始化不能在類的頭文
3) 訪問:
<1> 類對象名.靜態數據成員
<2> 類類型名::靜態數據成員
a.static數據成員和普通數據成員一樣遵public, protected, private 訪問規則。
b.對於非靜態數據成員,每個類對象都有自己的拷貝。靜態數據成員被當作類的全局對象,
5) 同全局對象相比,使用靜態數據成員有兩個優勢:
<1> 靜態數據成員沒有進入程序的全局名字空間,因此不存在與程序中其他全局名字衝突的
<2> 可以實現信息隱藏。靜態成員可以是private成員,而全局對象不能。
6) 應用:
class Account {
Account( double amount, const string &owner );
String owner() { return _owner ;}
private:
static double _interestRate;
double _amount;
string _owner;
};
這是因爲每個Account對應不同的主人,有不同數目的錢,而所有Account的利率卻是相同的。
因爲在整個程序中只有一個_interestRate數據成員,他被所有Account對象共享,所以把
_interestRate值可能變化,所以不能聲明爲const。因爲_interestRate是靜態的,所以它只需要
7)靜態數據成員的“唯一性”本質(獨立於類的任何對象而存在的唯一實例),使他能夠以獨特
<1> 靜態數據成員的類型可以是其所屬類,而非static數據成員只能被聲明爲該類對象的指針
public:
//...
private:
static Bar mem1; //OK
Bar *mem2; //OK
Bar mem3; //錯誤
};
private:
int var;
static int stcvar;
public:
//錯誤:被解析爲非static的Foo:var
//沒有相關的類對象
int mem1( int = var );
//無需相關的類對象
int mem2( int = stcvar );
int mem3( int = ::var );
};
1) 聲明:在類的成員函數返回值之前加上關鍵字static,他就被聲明爲一個靜態成員函數。靜
2) 定義:出現在類體外的函數定義不能指定關鍵字static。
3) 作用:主要用於對靜態數據成員的操作
4) 靜態成員函數與類相聯繫,不與類的對象相聯繫。
5) 靜態成員函數不能訪問斐靜態數據成員。因爲非靜態數據成員屬於特定的類實例。
6) 靜態成員函數沒有this指針,因此在靜態成員函數中隱式或顯示的引用這個指針都將導致編
7) 訪問:可以用成員訪問操作符(.)和箭頭(->)爲一個類對象或指向類對象的指針調用靜態成員