C++中的静态成员和静态成员函数

C++中的静态成员和静态成员函数

1.在一个类中定义静态数据成员和静态成员函数的方法:

想让一个普通的数据成员变成静态的数据成员,需要用到static关键字,静态的成员函数同理。

如:在下面的Tank类中,s_iCount就是一个静态的数据成员,而getCount()就是一个静态的成员函数。

C++中的静态成员和静态成员函数_第1张图片

2.静态数据成员和成员函数的特点

(1)不依赖于对象,而是依赖于类。也就是说当一个类定义成功后,其静态的数据成员已经可以访问了,不需要通过实例化一个对象再访问,所有,静态数据成员的初始化都是单独进行的;而对于一个静态的成员函数,也可以进行单独的访问。

在上述代码中,我们用静态数据成员s_iCount记录当前已经生成的tank对象数,每生成一个tank,构造函数就会让s_iCount++,每生销毁一个tank,析构函数就会让s_iCount--。

(2)访问方式有两种:

a.单独访问,如main函数中的前两行;

b.通过对象访问,如4、5两行。

C++中的静态成员和静态成员函数_第2张图片

(3)对于Tank类,在内存中至始至终仅有一份静态数据s_iCount:

对于普通数据成员m_strCode,每实例化一个对象,都会在内存中产生相应对象的m_strCode;

而对于静态数据成员s_iCount,不管实例化多少对象,仅有一份静态数据s_iCount。

C++中的静态成员和静态成员函数_第3张图片

(4)静态成员函数不可以访问普通数据成员

这点也好理解,因为普通数据成员是依赖于对象的,当我们一个对象也没有实例化的时候,意味着一个普通数据成员也没有诞生。而静态成员函数却可以单独调用,若此时企图访问普通数据成员,显然访问不到。

另外,从原理上,也可以证明这点:

如:

我们定义一个tank类,有一个普通成员函数fire(),和一个静态成员函数getCount();

C++中的静态成员和静态成员函数_第4张图片

我们知道,虽然看起来fire()函数不带任何参数,但是默认编译器会加上一个this指针,因此普通成员函数可以通过this指针访问该对象的任意数据成员和成员函数。

而对于静态数据成员,编译器并不会加上this指针,因此,无法访问某个对象的数据和函数。

C++中的静态成员和静态成员函数_第5张图片

(5)必须进行单独的初始化

(6)不可以给静态成员函数加const修饰符

因为const修饰符本质是给this 指针加前缀,而静态成员函数形参并没有this指针。

你可能感兴趣的:(C++中的静态成员和静态成员函数)