基本概念
在说明前加了static关键字
class CRectangle {private:int w, h;static int nTotalArea; // 静态成员变量public:CRectangle(int w_, int h_);static void PrintTotal(); // 静态成员函数};
普通成员变量每个对象各有一份,但静态成员变量是所有对象共享的,一共只有一份
- sizeof不计算成员变量
- 普通成员函数必须具体作用于某个对象,而静态成员函数不是作用于某个对象
- 静态成员不需要通过对象就能访问,本质上是一个全局变量,即便一个对象也不存在,这个变量也存在
-
如何访问?
类名::成员名
- CRectangle::PrintTotal();
- 对象名. 成员名 & 指针 -> 成员名
- BUT! 不做用于某个具体对象!
- 引用. 成员名
接上例
CRectangle::CRectangle(int w_, int h_) {w = w_; h = h_;nTotalNumber++;nTotalArea += w * h;}CRectangle::~CRectangle() {nTotalNumber--;nTotalArea -= w * h;}void CRectangle::PrintTotal() {cout << nTotalNumber << "," << nTotalArea << endl;}
静态成员变量必须进行一次声明或初始化,否则编译能通过,链接不能通过
int CRectangle::nTotalNumber = 0;int CRectangle::nTotalArea = 0;main() {cout << CRectangle::nTotalNumber; // 错!私有成员,不能访问!}
静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数
- 因为静态成员函数不是作用在具体对象上
考虑调用CRectangle::PrintTotal(); 是访问谁呢?void CRectangle::PrintTotal() {cout << w << "," << nTotalNumber << ...; // wrong!}
BUT上面的函数声明有问题!Why?
- 因为静态成员函数不是作用在具体对象上
如果是使用复制构造函数生成一个对象,area和num都没有加,消亡的时候却调用了析构函数,总数减少。
- 所以写一个复制构造函数就好咯
