1.静态成员和静态成员函数的定义
静态成员并不依赖于对象而是依赖于类,如果我们不实例化对象静态数据成员在内存中依旧存在。静态数据成员会在构造函数中实例化,它的实例化往往是单独进行的。看下图中我们静态数据成员的实例化就是:int Tank::s_iCount不需要加static关键字。
2.静态数据成员与静态成员函数的调用
访问的方法有两种:第一种不通过对象直接通过类来访问
第二种就是用过对象来访问
3.普通数据成员与静态数据成员的区别
从内存中来讨论一下他们的区别,还是以前面的代码为例,当我们实例化Tank这个类的时候实例化一个对象就会产生一个code,实例化四个对象就会产生四个code。但是四个对象诞生之前静态数据成员s_iCount就已经诞生了,并且随着对象的实例化它的值会发生改变但是个数不会发生变化!
注意:用静态的成员函数来调用普通的数据成员或者是调用普通的成员函数是不对的,从逻辑上来讲我们的静态的成员是依赖于类的,但是普通的成员是依赖于对象的,当我们一个对象都没有实例化的时候去调用非静态的数据成员是不成立的!从原理来说同样是不成立的。
4.this指针来看静态成员函数
a.我们可以看到用普通的成员函数fire()来调用普通成员数据和静态数据成员,我们通过前面的学习知道其实fire传递了隐形的this指针,通过this指针可以知道后面的m_strCode是那个对象的数据成员。但是静态数据成员并不属于那个类所以可以直接调用!
b.但是通过静态的成员函数getCount()来调用数据成员的时候,他与对象无关只与类有关,并不会传入隐形的this指针,所以取法判断后面调用的普通数据成员是那个对象的,但是它可以来调用静态的数据成员。
5.总结
静态的数据成员必须单独初始化(不能写到构造函数里面,而是要写到类的外边直接进行初始化)
静态成员函数不能调用非静态的成员函数和非静态数据成员
静态数据成员只有一份,且不依赖对象而存在(sizeof来求对象的大小是不包含静态数据成员的)