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

使用方法:

全部打开


一条一条声明

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