检讨
第一周的笔记过于简陋,格式也很混乱.本周学习笔记将认真整理本周所学习的内容,列出自己的收获以及一些仍不清楚的问题.
本周学习内容回顾
classes的经典分类
class分为两类:
1.不带有指针的类
2.带有一个或多个指针作为成员的类
Big Three
即某个类的
拷贝构造函数
赋值运算符重载函数
析构函数
在 C++ Primer第十四章也将这三者称为 复制控制单元
自定义拷贝构造函数(和copy =)的意义所在
主要针对的是带有一个或多个指针成员的类
因为编译器默认合成出的拷贝构造函数是bit by bit的进行复制
只会把指针拷贝过来而不会把指针指向的内容进行拷贝
拷贝后副本类的成员的指针仍指向之前那个指针所指向的内容
如果不自定义拷贝函数会形成未定义操作 造成内存泄漏
new和delete的分析
对于 new操作符
分配内存空间
转型
调用构造函数
对于delete操作符
先调用析构函数
释放内存空间
self assignment检测的必要性
如果进行自我赋值
第一步会先调用析构把自身指针对象所指向的内容杀掉
第二步分配内存空间
第三步再想把该指针指向内容赋值时由于该内容已经在第一步中被杀掉,因此会造成类似越界读效果的操作
array new 和 array delete的一一对应
在构造函数中如果使用的是 new []
则在析构函数中需要调用 delete[] 否则会造成析构函数调用错误
使一部分内存不能够正确的归还
堆区\栈区的简要了解
在函数本体内声明的变量,其所使用的内存块取自于此函数作用域所有的"栈"
"堆"是系统提供的一块自由存储区,程序通过动态分配得到该区域中的部分内存空间
不同类型objects的生命期
stack object
也叫auto object 由于其在函数对应作用域的栈区,当函数作用域结束时,这个对象会被自动清理
static object 和 global object
static object的生命期在函数作用域声明处开始,直到整个程序结束终止
global object的生命期随程序开始而开始,也跟着程序的结束而终止
heap object
堆区的对象生命期从new这个对象开始到delete这个对象之时结束
在visual c++中动态分配所得的内存块
release版本和debug版本所得到的内存块大小不一样
每个分配出来的内存块前后带有cookie
分配所得的内存字节大小必定为16的倍数,若不是则进行填充
分配数组型变量时会有单独的一个记录数组大小的内存空间
本周作业过程中犯的一些问题
对于基类的成员进行了直接的调用
对于基类没有正确的构造
对于函数复制控制单元的性能没有合理的检测机制
一些相关的思考
扩展内容中关于account类的利率设置
可以直接用某个对象直接调用设置的函数
与实际生活不符
账户对象应该具体有特定的一个级别属性
然后根据该属性的判定结果决定是否能够更改利率
class Template更多用于数据类型
是否可以用T代替函数指针实现某个函数具有一系列功能?