String类的学习
带指针成员的类必须重写拷贝构造函数和拷贝赋值函数,这些函数的参数接受自己类的引用 有指针 构造时需要做动态内存分配,析构时要释放内存。
拷贝构造函数:如果没有重写的话,系统提供的拷贝构造函数,浅拷贝 只是指针的拷贝,两个指针指向内存中的同一块区域,指向相同的内容。拷贝构造函数,新申请一块内存,把指针指向这块内存,并把数据内容拷贝到这块内存中,对象的深拷贝,两个指针指向内存中不同的地址,但两个地址所存放的内容是相同的。
拷贝赋值函数:1.检测自我赋值。2.先delete原来的指针,3.申请新的内存,4.把要拷贝的内容,复制到新的内存空间。
析构函数 :对象死亡的时候调用,清理内存
操作符<< 和 >>的重载 不能写成成员函数,必须写为全局函数。
堆,栈与内存管理
Stack 存在于某作用域的一块内存空间(memory space) 。调用函数时,函数本身会形成一个Stack来存放接收的参数,传回地址,局部变量等。
示例:Complex c1(1,2)。Stack object 在作用于结束时,由系统自动清理。static Complex c2(2,3)。static object 在作用于结束之后仍然存在,直到整个程序结束。写在任何作用域之外的对象,为全局对象,global object 作用域为整个程序,可以视为一种static object。
Heap堆,system heap 由操作系统提供的一块global内存空间,程序可以动态分配(dynamic allocated)其中的若干区块(blocks)。使用 new操作符,并由delete释放回系统。
示例:Complex *p = new Complex(1,2)。生命在delete时结束。如果没有delet就会造成内存泄漏(memory leak)。作用域之外也就没有办法访问p指针。
new操作符的过程:先分配内存memory,p指向这块内存。再调用构造函数constructor,创造对象,放在这块内存中。 mollac
delete操作符的过程:先调用析构函数,在调用delete指针,释放内存。free