⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 《c++编程思想》-- 第4章 笔记.txt

📁 C&C++论坛精华
💻 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 + -