C++面向对象高级编程
第二周结构框图:
7.三大函数:拷贝构造,拷贝赋值和析构函数
8.堆,栈与内存管理
9.复习String的实现过程
10.扩展补充:类模板,函数模板及其他
7.三大函数:拷贝构造,拷贝赋值和析构函数:
String class:
默认编译器会给出一套拷贝构造和拷贝赋值定义(这份特别标准),但带指针的class编译器给的不够用,需自己定义,所以,只要class中带指针,不能用编译器默认给的,依下图讲解拷贝构造和拷贝赋值:
下面讲解Big Three:
(笔记注释都下在图里面了)
构造函数与析构函数:
程序结束之前必须释放动态分配到的堆内存(写到析构函数中)
拷贝构造函数:
拷贝赋值函数:
(笔记在图上)
注意要写检测自我赋值语句,如果不写可能会导致下图:
如果没写检测自我赋值语句,可能会出错!
侯捷老师总结:写检测自我赋值语句不止为了效率高,而且是为了防止出错!
8.堆,栈与内存管理:
output函数:
cout这种东西本来就可以接收字符串的地址以打印出字符串
所谓堆栈:
堆对象的生命期
注意:new先分配memory,再调用ctor
delete:先调用dtor,在释放memory
动态分配所得的内存块,in VC:
调试模式下,多出来的内存是一种必要的浪费,因为以后回收时需要靠某些东西顺利回收。
上下cookie最重要的作用是记录整块给你的大小(以便回收时让编译器知道要回收的大小)
array new一定要搭配array delete
要使用array delete否则会出现内存泄漏
10.扩展补充:类模板,函数模板及其他
进一步补充:static
1.调用相同的函数,传给他们不同的地址,这样才有机会去处理不同的数据。
2.静态函数没有this pointer
3.静态函数只能处理静态数据。
4.class中的静态数据一定要在class外面写上定义!!!
5.调用static函数的方式有二:
a.通过object调用
b.通过class name调用
class templete 类模板:
类模板会造成代码必要的膨胀