外观
08.类的静态成员变量、类的静态成员函数、二阶构造模式、友元的尴尬能力
约 1811 字大约 6 分钟
二阶构造模式类的静态成员C++编程语言
2022-06-16
二十五、类的静态成员变量
1、成员变量的回顾
- 通过对象名能够访问public成员变量
- 每个对象的成员变量都是专属的
- 成员变量不能在对象之间共享
2、新的需求
- 统计在程序运行期间某个类的对象数目
- 保证程序的安全性(不能使用全局变量)
- 随时可以获取当前对象的数目
3、编程实验:解决方案的尝试


4、静态成员变量
在C++中可以定义静态成员变量
- 静态成员变量属于整个类所有
- 静态成员变量的生命期不依赖于任何对象
- 可以通过类名直接访问公有静态成员变量
- 所有对象共享类的静态成员变量
- 可以通过对象名访问公有静态成员变量
静态成员变量的特性
- 在定义时直接通过static关键字修饰
- 静态成员变量需要在类外单独分配空间
- 静态成员变量在程序内部位于全局数据区
语法规则

5、编程实验:静态成员变量的使用


6、小结
- 类中可以通过static关键定义静态成员变量
- 静态成员变量隶属于类所有
- 每一个对象都可以访问静态成员变量
- 静态成员变量在全局数据区分配空间
- 静态成员变量的生命期为程序运行期
二十六、类的静态成员函数
1、未完成的需求
- 统计在程序运行期间某个类的对象数目
- 保证程序的安全性(不能使用全局变量)
- 随时可以获取当前对象的数目(Failure)
2、编程实验:解决方案的尝试


3、问题分析:我们需要什么?
- 不依赖对象就可以访问静态成员变量
- 必须保证静态成员变量的安全性
- 方便快捷的获取静态成员变量的值
4、静态成员函数
在C++中可以定义静态成员函数
- 静态成员函数是类中特殊的成员函数
- 静态成员函数属于整个类所有
- 可以通过类名直接访问公有静态成员函数
- 可以通过对象名访问公有静态成员函数
静态成员函数的定义
- 直接通过static关键字修饰成员函数

5、编程实验:静态成员函数示例


6、静态成员函数 vs 普通成员函数

7、编程实验:最后的解决方案


8、小结
- 静态成员函数是类中特殊的成员函数
- 静态成员函数没有隐藏的this参数
- 静态成员函数可以通过类名直接访问
- 静态成员函数只能直接访问静态成员变量(函数)
二十七、二阶构造模式
1、构造函数的回顾
- 关于构造函数
- 类的构造函数用于对象的初始化
- 构造函数与类同名并且没有返回值
- 构造函数在对象定义时自动被调用
2、问题
- 如何判断构造函数的执行结果?
- 在构造函数中执行return语句会发生什么?
- 构造函数执行结束是否意味着对象构造成功?
3、编程实验:异常的构造函数

4、你该知道的真相
- 构造函数
- 只提供自动初始化成员变量的机会
- 不能保证初始化逻辑一定成功
- 执行return语句后构造函数立即结束
5、真相的意义
构造函数能决定的只是对象的初始状态,而不是对象的诞生!!
6、半成品对象
- 半成品对象的概念
- 初始化操作不能按照预期完成而得到的对象
- 半成品对象是合法的C++对象,也是Bug的重要来源
7、编程实验:半成品对象的危害
8、二阶构造
- 工程开发中的构造过程可分为
资源无关的初始化操作
- 不可能出现异常情况的操作
需要使用系统资源的操作
- 可能出现异常情况,如:内存申请,访问文件

二阶构造示例一

二阶构造示例二

9、编程实验:二阶构造初探

10、编程实验:数组类的加强


11、小结
- 构造函数只能决定对象的初始化状态
- 构造函数中初始化操作的失败不影响对象的诞生
- 初始化不完全的半成品对象是 Bug的重要来源
- 二阶构造人为的将初始化过程分为两部分
- 二阶构造能够确保创建的对象都是完整初始化的
二十八、友元的尴尬能力
1、友元的概念
- 友元是C++中的一种关系
- 友元关系发生在函数与类之间或者类与类之间
- 友元关系是单项的,不能传递

2、友元的用法
在类中以friend关键字声明友元
类的友元可以是其它类或者具体函数
友元不是类的一部分
友元不受类中访问级别的限制
友元可以直接访问具体类的所有成员
3、友元的语法
在类中用friend关键字对函数或类进行声明

4、编程实验:友元的使用初探

5、友元的尴尬
- 友元是为了兼顾C语言的高效而诞生的
- 友元直接破坏了面向对象的封装性
- 友元在实际产品中的高效是得不偿失的
- 友元在现代软件工程中已经逐渐被遗弃
6、注意事项
- 友元关系不具备传递性
- 类的友元可以是其它类的成员函数
- 类的友元可以是某个完整的类
- 所有的成员函数都是友元

7、编程实验:友元的深入分析


8、小结
- 友元是为了兼顾C语言的高效而诞生的
- 友元直接破坏了面向对象的封装性
- 友元关系不具备传递性
- 类的友元可以是其它类的成员函数
- 类的友元可以是某个完整的类
