今天刚开始看《深度探索
C++
对象模型》,刚看到第一章,竟然发现自己对类静态成员和静态成员函数还不够了解。查看了《
C++ Primer
》后,有以下几点体会:
(1)
为什么需要类静态成员?
有时候某个类的多个对象需要访问一个全局对象,在这种情况下“提供一个全局对象”比“每个类都维持一个独立的数据成员”要更为有效。而类静态成员与全局变量相比,又有两点好处:(
a
)不存在与程序中其他全局名字冲突的可能性;(
b
)可设置为
private
,实现信息隐藏。
(2)
类静态成员的特点
对于非静态数据成员,每个类对象都有自己的拷贝,而静态数据成员对每个类类型只有一个拷贝。由于静态数据成员分配在全局数据区,因此在程序开始运行时就必须存在,故静态数据成员的空间分配和初始化不可能在
main
函数或其他函数中完成(因而在局部类中也不允许出现静态数据成员)。这样一来,静态数据成员的空间分配和初始化只可能有以下三种途径:(
a
)类的头文件:这里有类的声明。但存在一个无法回避的问题:对于静态数据成员,在程序中也只能存在一个定义,而类的头文件可能被重复引用而出现重复定义;(
b
)
main
函数前的全局数据声明和定义处:这种方法也有问题,每一个使用该类的程序都必须在此处定义一下该类的静态成员,这是不现实的;(
c
)类定义的内部实现:这是最为理想的方式,引用时只需包含头文件即可。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
(3)
类静态成员的定义
在对静态数据成员进行定义时有以下几点注意事项:(
a
)在类定义之外定义时,静态成员的名字必须被其类名限定修饰,前不可再添加
static
;(
b
)像
int
等有序类型的静态数据成员可在类定义中初始化,但仍需在类定义外进行定义,但此时已不能指定初始值;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
(4)
类静态成员的访问:
在类的成员函数中可以直接访问该类的静态数据成员,而在非成员函数中可使用成员访问操作符或类名限定修饰的方式进行访问。
(5)
静态成员函数:
静态成员函数无法访问属于具体类对象的非静态数据成员,也无法访问非静态成员函数,他只能访问静态数据成员和调用其余的静态成员函数。这样一来,就能防止类的非静态数据成员遭受窜改。静态成员函数没有
this
指针,任何在静态成员函数中显式或隐式地引用这个指针都将导致编译时刻错误。