高质量编程笔记

第6章
函数介绍:
输入参数:
输出参数:
返回值:
assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。
考虑return的效率,选择使用引用或者指针,而不是值。临时对象与局部对象的区别
尽量少用static局部变量
引用的一些规则如下:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?答案是“用适当的工具做恰如其分的工作”。

第7章
1、内存分配方式的三种方式:静态存储区域,栈区,堆区
2、常见的内存错误与对策:
内存分配未成功,却使用了它——解决办法,在使用之前检查指针是否为NULL
内存分配成功,但尚未初始化,就引用了它——解决办法,一定要初始化
内存分配成功并且已经初始化,但操作超过了内存的边界——解决办法,采用半开半闭区间
忘了释放内存,造成内存泄漏
释放了内存,却在使用它,存在三种情况
【规则7-2-1】用malloc 或new 申请内存之后,应该立即检查指针值是否为NULL。
防止使用指针值为NULL 的内存。
【规则7-2-2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右
值使用。
【规则7-2-3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”
操作。
【规则7-2-4】动态内存的申请与释放必须配对,防止内存泄漏。
【规则7-2-5】用free 或delete 释放了内存之后,立即将指针设置为NULL,防止
产生“野指针”。
3、指针与数组的对比
以字符串为例,进行说明:修改内容;比较内存复制与比较;计算内存容量。
4、指针参数是如何传递内存的,指针作为参数与指针的指针作为参数在函数中申请动态内存时的区别,以及返回值也可以传递内存。
5、free和delete的作用,内存是释放了, 但指针本身并没有被消灭。需要赋值NULL
6、(1)指针消亡了,并不表示它所指的内存会被自动释放。(2)内存被释放了,并不表示指针会消亡或者成了NULL 指针。
7、杜绝野指针-“野指针”不是NULL 指针,是指向“垃圾”内存的指针。“野指针”的成因主要有两种:(1)指针变量没有被初始化。(2)指针p 被free 或者delete 之后,没有置为NULL,让人误以为p 是个合法的指针。(3)指针操作超越了变量的作用范围。野指针,if语句无法识别这个错误。
8、有了malloc/free 为什么还要new/delete,malloc/free不能执行构造函数与析构函数的任务。不能执行,初始化和清除工作。
9、内存耗尽怎么办?三种选择:退出函数,退出程序,异常处理,win32不会出现内存耗尽,因为有虚拟内存技术
10、malloc/free的使用要点,类型转换和申请空间的长度
11、new/delete的使用要点,new比malloc简单,这是因为new 内置了sizeof、类型转换和类型安全检查功能。delete[]的使用。
12、一些心得体会

第8章
成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual
关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual
关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

C++ 语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操
作类的数据成员。
inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。存在三种使用的方式。

第9章
A(void); // 缺省的无参数构造
A(const A &a); // 缺省的拷贝构造函
~A(void); // 缺省的析构函数
A & operate =(const A &a); // 缺省的赋值函数

成员对象初始化的次序完全不受它们在初始化表中次序的影
响,只由成员对象在类中声明的次序决定。这是因为类的声明是唯一的,而类的构造函
数可以有多个,因此会有多个不同次序的初始化表。如果成员对象按照初始化表的次序
进行构造,这将导致析构函数无法得到唯一的逆序。

你可能感兴趣的:(C/C++,编程,null,delete,c++,语言,存储)