1.拷贝构造函数
如果没有自定义拷贝构造函数,则编译器默认构造一个,直接按位拷贝。
类中如果带指针则一定要自己写拷贝构造函数和拷贝赋值(重载操作符=),否则只是复制指针(bitwise copy/浅拷贝),既将两个指针指向同一块内存。
拷贝构造函数采用深拷贝,首先要分配足够的内存,再将目标内容复制进开辟的内存空间中。
2.拷贝赋值(重载操作符=)
步骤:检测自我赋值 若不是则 a.清理自身 b.分配足够大空间 c.拷贝进去,若是自我赋值则直接返回自身
若没写自我赋值检测,则会造成错误,第一步a.清理自身时就把唯一的指针删掉,步骤b无法获得字符串长度,也就无法分配内存。
3.析构函数
对应构造函数,构造函数中分配了内存则析构函数中需要释放,否则会造成内存泄漏。
若使用new来生成对象,则需要手动delete掉
4.堆和栈,内存管理
栈:局部对象存在栈中,称为stack object 或 auto object,生存期只在作用域中,离开作用域既消亡,会自动析构,无需手动清理。
堆:自己new出来的对象存在堆中,在自己delete掉后生命结束。
全局空间:包括static 对象和全局对象,程序结束后才会消亡。
new的步骤:a.分配内存空间(operator new内部调用malloc(n));b.将void*指针转型为对象类型指针;c.调用构造函数
delete的步骤:a.调用析构函数;b.释放内存(operator delete)
array new 一定要搭配array delete(delete[]),若不加[],则只会调用1次析构函数,泄漏的内存为指针所指向的内存地址。
5.关于static
non-static member function可通过this指针调用non-static members
static data members 只有一份在全局空间,需要在类外部进行定义
static member functions 与non-static member functions 区别在于没有this指针,只能处理static data members