静态成员变量和成员函数是指在类中以static修饰的变量和函数。
直接看例子熟悉其使用和特性:
#include <iostream> using namespace std;
class test { public: test() :a(0), b(0) { } ~test() { } void add() { a++; b++; c++; // 非静态函数可以使用静态成员变量 } static void adds() { //a++; b++; // 编译报错,静态成员函数无法使用非静态变量 c++; } static int getC() { cout << "static c : " << c << endl; return c; }
void print() { cout << "a : " << a << endl; cout << "b : " << b << endl; cout << "c : " << c << endl; }
private: int a; int b; static int c; //静态成员变量 };
//静态类成员变量初始化,同时给C分配内存。 int test::c = 10;
void main() {
test a1, a2, a3; a1.print(); //0,0,10 a2.adds(); //0,0,12 a2.add(); //1,1,12 a3.print(); //0,0,12
//静态成员函数的调用方法 a3.getC(); //用对象. test::getC(); //类::
cout << "end..." << endl; system("pause"); return; } |
|
运行结果:
通过上面例子可以看出:
- 静态成员提供了一个同类对象的共享机制,静态成员局部于类,但他不属于对象;无论创建多少给对象,这些对象都共享静态成员;
- 静态成员函数提供不依赖于类数据结构的共同操作,它没有this指针;
- 有两种方法在类外调用静态成员函数,分别是1)类名::函数,2)通过对象调用;
- 普通成员函数可以使用静态变量,但静态成员函数中不能使用普通变量;
- 类静态成员变量初始化和分配内存在类外进行,不需要加static但需要带上变量类型;
- 子类可以定义一个与父类一样的静态变量,以屏蔽父类的影响。
- 当A类包含静态成员变量时,B类继承A类并使用任何方法时,必须对A中的静态成员变量进行初始化,否则编译错误;因为静态成员变量需要独立初始化同时分配内存。
思考:为什么静态成员函数中不能使用非静态变量?
因为静态成员函数属于整个类,如果在其中使用非静态成员变量(如b),同时定义了多个类对象a1,a2,a3,编译器就无法确定该变量是属于哪个对象的(a1.b, a2.b, a3.b)。