GeekBand C++面向对象高级编程(上) 第二周学习笔记

检讨

第一周的笔记过于简陋,格式也很混乱.本周学习笔记将认真整理本周所学习的内容,列出自己的收获以及一些仍不清楚的问题.

本周学习内容回顾

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代替函数指针实现某个函数具有一系列功能?

你可能感兴趣的:(GeekBand C++面向对象高级编程(上) 第二周学习笔记)