靜態成員:不管這個類創建了多少個對象,靜態成員在內存中只保留一份,靜態成員用來解決同一個類中不同對象之間數據成員和函數的共享問題。
1、靜態成員函數是用關鍵詞static聲明的成員函數,它屬於整個類而並不屬於類的某個對象。
類的靜態成員(變量和方法)屬於類本身,在類加載的時候就會分配內存,可以通過類名直接去訪問;非靜態成員(變量和方法)屬於類的對象,所以只有在類的對象產生(創建類的實例)時才會分配內存,然后通過類的對象(實例)去訪問。
由於靜態函數是獨立於類對象而存在的,因此靜態成員函數中沒有this指針。所以靜態成員函數不可以直接訪問類中的非靜態成員,但是可以直接訪問靜態成員。
若要訪問非靜態成員時,必須通過參數傳遞的方式得到相應的對象,再通過對象來訪問。
class B{
private:
int x;
int y;
static int count;
public:
B():x(0), y(0){
count++;
}
B(int xx, int yy):x(xx), y(yy){
count++;
}
static int getObjCount();
};
int B::count = 0;
int B::getObjCount(){
return count;
}
int main()
{
cout << B::getObjCount() << endl;
B b1;
B b2(10, 20);
cout << b1.getObjCount() << endl;
cout << b2.getObjCount() << endl;
cout << B::getObjCount() << endl;
B *p = new B;
cout << p->getObjCount()<< endl;
return 0;
}

靜態數據成員的類型可以是所屬類的類型,而普通數據成員則不可以。普通數據成員的只能聲明為所屬類類型的 指針或引用。舉例如下:
class base{
public :
static base _object1;//正確,靜態數據成員
base _object2;//錯誤
base *pObject;//正確,指針
base &mObject;//正確,引用
};
2、常成員函數
返回類型 成員函數名 (參數表) const ;
在定義時使用const關鍵字修飾的用於訪問類的常對象函數,成為常成員函數。
常成員函數不能更新對象的數據成員,也不能調用該類中的沒有用const修飾的成員函數,但可以被其他成員函數調用。
常對象只能調用常成員方法,而不能調用其他的成員函數。
const關鍵字可以用於對重載函數的區分
class CDate
{
private:
int y;
int m;
int d;
public:
int year()const;
int month() const;
int day(){return d++ ;}
//int day()const {return d;}
int AddYear(int i){return y+1;}
};
int CDate::year()const
{
return y;
}
int CDate::month()const
{
return m;
//return m++; 錯誤:常成員函數中不能更新類的數據成員
}
int main()
{
CDate const date;
//int day = date.day(); 錯誤常對象不能調用非常成員函數
int year = date.year();
}
