C++面向对象高级编程(上)笔记二(Boolan)
1. Big Three
拷贝构造 拷贝赋值 析构函数
只要类里带指针,就必须带拷贝构造和拷贝赋值。
2.析构函数
释放掉动态分配的内存。
注意创建的指针要释放
3.拷贝构造(copy ctor)
如果没有特别写,编译器默认形成 两个指针指向同一块地方 即浅拷贝。
会造成内存泄漏,和别名。
先创建一块足够大小的内存,再进行拷贝。
4.拷贝赋值
先把原来的空间清空,重新分配足够的空间,再赋值过来。
检测自我赋值
先检查一下两个指针指的是不是同一个地方,效率高。
如果没有检测,结果可能会出错:假如两个指针指向同一个地方,第一步会删掉原有空间里的数据,接下来就无法正常进行。
5.stack(栈),heap(堆)
c1 用完会自动消失
p 要自己亲手delete
6.各对象的生命期
stack 生命期:只要离开作用域,它的生命就会结束,析构函数就会被调用。auto object
static local objects 生命期:作用域结束之后仍然存在,直到整个程序结束。
global objects生命期:整个程序结束之后才结束
heap objects生命期:delete之后结束,防止内存泄漏。
7.new:先分配memory,再调用ctor
第一步:调用内存,内部调用malloc(n)
第二步:把第一步得到的指针转型
第三步:调用其构造函数
8.delete:先调用dtor,再释放memory
第一步:调用析构函数
第二步:释放内存,其内部调用free()
9.动态分配所得的内存块
上下cookie:4*2,记录整块所给的大小,回收时方便知道要回收多少。
调试模式下:上面8,下面1, 8*4+1*4
本身分配的:complex 8 , string 4
总共分配16的倍数
10.动态分配所得的array
除了以上三个部分,VC会再用1个用来记录数组成员数,即+4
11.array new 一定要搭配 array delete
一定要加[ ],这样编译器才知道是一个数组,会调用三次;如果不加[ ],只调用一次。
补充:
1.static 静态
静态函数没有*this,只能处理静态的数据,静态的函数。
黄色的部分意为定义,是必要的。
2.把ctors放在private区
Sigleton
Meyers Singleton:把static放进函数中更好
3.cout
类型:ostream
4.class template,类模板
这么用
5.function template,函数模板
6.namespace
使用方法:
全部打开 一条一条声明