靜態成員變量存放於數據段,在編譯時產生,故有以下特性:
靜態成員變量實際爲類域中的全局變量,其初始化也應與全局變量一樣,不能再頭文件裏初始化,應與全局變量初始化的方式一樣,初始化時,靜態成員變量不收訪問限定符限定
Test.cpp:
class A
{
static int _num;
};
int A::_num = 0;//初始化成功
靜態成員變量被類內所有成員變量共享,也被派生類所有成員變量共享
class B :public A
{
};
int main()
{
A a;
a._num++;
B b;
b._num++;
cout << "b._num:" << b._num << endl;
cout << "a._num:" << a._num << endl;
return 0;
}
靜態成員變量具有常量性,可以成爲成員類的可選參數,普通成員變量不具有常量性,所以不能作爲成員函數的可選參數
class B :public A
{
public:
void fun(int a = _num)//正確
{
}
void fun1(int a = num)//報錯
{
}
private:
int num;
};
靜態成員變量可以聲明爲所屬類類型,鋪同成員變量不可以聲明爲所屬類類型,只能聲明爲所屬類類型的引用與指針(節點就是這麼來的)
class B :public A
{
public:
void fun(int a = _num)//正確
{
}
void fun1(int a = num)//報錯
{
}
private:
int num;
static B _bclass;//正確
B _b1class;//錯誤
B* _bclassptr;//正確,爲一指針
B &_b2class;//錯誤,爲一引用
};
由於靜態成員變量定義不在類體內,所以靜態數據成員的值在const成員函數中可以被合法的改變。
class A
{
public:
static int _num;
};
int A::_num = 0;//初始化成功
class B :public A
{
public:
void fun()const
{
_num++;//正確,const函數可以改變靜態成員變量
}
private:
int num;
};
本文出自 “pawnsir的IT之路” 博客,請務必保留此出處http://10743407.blog.51cto.com/10733407/1748567