📄 《c++编程思想》-- 第4章 笔记.txt
字号:
作者:rick1126
email: rickzhang@sina.com
日期:2001-7-21 9:45:12
第4章 初始化和清除
所谓安全性包括初始化和清除两个方面. 在C++中, 初始化和清除的概念是简化类库使用的关键所在, 并可以减少用户忘记这些操作而引起的许多细微错误.
4.1-2 用构造函数和析构函数确保初始化与清除
【构造函数】
. 利用Stroustrup方法, 使用类名作为构造函数名称
. 名字不和其他函数成员冲突
. 编译器知道调用那个函数
. 构造函数和析构函数没有返回值, 否则要么编译器知道如何处理这些返回值, 要么用户自己调用, 这对于安全性不利.
. 需要注意一些非本地的goto语句, 它们使用setjmp(), longjmp()的C语言库函数, 不会引发超出定义范围的析构函数.
4.3 清除定义块
【C语言的声明传统】
. 传统C语言要求在程序的头部定义所有的变量, 其实此时还不知道具体需要实现哪些变量, 由此等于鼓励不初始化变量, 仅仅是声明
. 变量如果紧靠使用处进行定义, 程序的可读性更强
【C++的声明处理】
. 没有拥有构造函数的初始化信息时就不能创建一个对象, 所以不必再程序开头就定义所有变量
. 尽可能在靠近使用处定义和初始化变量
. 对于for循环而言, 新的C++标准中的循环控制表达式里面定义的变量仅仅在循环内有效, 不过VC好像还是不支持这个标准
. 对于goto语句常常会发生跳转到应用的变量未经初始化就使用的语句, 因此此时编译器就好产生警告
4.6 集合初始化
【集合】
. 多个事物聚集在一起, 包括各种类型的集合: struct, calss, 数组等
. 集合的初始化一般使用 {} 进行.
【数组的初始化】
. {}中的初始化元素个数不能大于定义的元素个数, 如果小于则使用最后一个元素值初始化剩余的元素
. 如果没有指定元素个数, 则使用{}中的元素个数
【结构的初始化】
. 单个结构的初始化也是使用{}, 里面是每一个分量的初始化值
. 如果结构含有私有成员, 或者存在一个构造函数则必须在{}执行构造函数的调用
4.7 缺省构造函数
【缺省构造函数】
. 不带任何参数的构造函数, 就是VC的类向导所生成的默认构造/析构函数
. 如果struct或者class没有指定的构造函数, 则编译器会自动创建一个, 如果指定的构造函数不是缺省构造函数模式, 则定义的时候需要传递必要的初始化参数, 而不像基本类型或者缺省构造函数的定义方式, 比如:
class A{
A( int );
...
};
A b;//引起编译器错误, 必须是 A b(1)...
〖个人理解〗
在第1章里面就谈到C++存在一些强制性的安全机制, 这里的构造函数和析构函数就是这种安全机制的体现. 往往我们创建的类还是沿用传统的自定义初始化成员函数的模式, 其原因就在于这个强制性问题, 因为如果是缺省构造函数倒是无所谓, 而如果需要给构造函数传递参数或者需要处理返回值, 就有问题.
首先, 对于一些操作无法在声明的时候知道所需要的初始化参数, 这样就只能使用自定义的初始化函数了.
其次, 对于一些确实需要处理返回值的操作, 默认得不带返回值的构造函数无法满足需要.
所以, 构造函数和析构函数经常就是初始化一些成员变量的初始状态而已.
就近定义变量确实有好处, 不过从全局考虑, 如果使用的变量名称和最小范围以外的同名, 则有时候会造成混淆, 所以需要有一个最小范围和命名机制的保证.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -