对象的析构:
1、析构函数的定义和调用
C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数
* 语法:~ClassName()
析构函数没有参数也没有任何返回类型的声明
析构函数在对象销毁的时候被自动调用
析构函数的调用机制:C++编译器自动调用
class A { public: char name[20]; int age; int a1; int a2; int a3; //假如类中成员变量为指针 int *p; A()//无参数构造函数 { p=(int *)malloc(40);//在堆上生成一块空间(C中常用在堆上创建空间的方法) cout << "A()." << endl; } A(int a,int b,int c):a1(10),a2(20),a3(30) { cout << "A(" << a1 << a2 << a3 << " ):a1(10),a2(20),a3(30)." << endl; cout << "a="<< a << endl; cout << "b="<< b << endl; cout << "c="<< c << endl; } //析构函数 ~A() { //在A对象销毁的时候,我们需要手动释放堆上的空间,放在析构函数当中 free(p);//(C中常用释放堆空间的方法) cout << "~A()" <<endl; } };
2、具体实现功能:
假如类中有成员变量为指针:
例如上图代码中的int *p;变量,在创建类对象的的时候自动构造函数在堆上创建了一个类型为int *大小为40的一块空间,在我们学习C语言的时候可知,堆的空间有限申请空间使用完后要及时释放,而堆上的空间需要手动申请手动释放,所以在A对象销毁的时候我们还需要手动释放堆上的空间,因此可以将这一过程放在析构函数当中
//析构函数 ~A() { //在A对象销毁的时候,我们需要手动释放堆上的空间,放在析构函数当中 free(p);//(C中常用释放堆空间的方法) cout << "~A()" <<endl; }
对象的动态建立和释放
1、new和delete的基本语法
#include <iostream> using namespace std; class A { public: // char name[20]; // int age; int a1; int a2; int a3; //假如类中成员变量为指针 int *p; A()//无参数构造函数 { // p=(int *)malloc(40);//在堆上生成一块空间(C中常用在堆上创建空间的方法) cout << "A()." << endl; } A(int a,int b,int c):a1(10),a2(20),a3(30) { cout << "A(" << a1 << a2 << a3 << " ):a1(10),a2(20),a3(30)." << endl; cout << "a="<< a << endl; cout << "b="<< b << endl; cout << "c="<< c << endl; } //析构函数 ~A() { //在A对象销毁的时候,我们需要手动释放堆上的空间,放在析构函数当中 // free(p);//(C中常用释放堆空间的方法) cout << "~A()" <<endl; } }; //对象动态建立和释放 void Build_release(void) { //在堆上申请一个int类型大小的空间(4Bytes),并将申请的堆空间内容初始化为10 int *p = new int(10); delete p; //在堆上申请4个int类型大小的空间(4*sizeof(int)==16Bytes) 4:数组的长度 int *p2 = new int[4]; for (int i = 0; i < 4; i++) { cout << *(p2 + i) << endl; //cout << p2[i] << endl; } delete[] p2; //在堆上申请一个Box类型大小的空间 A *p3 = new A; //调用无参的构造函数 delete p3; //在堆上申请四个Box类型大小的空间 A *p4 = new A[4]; //调用无参的构造函数 delete[] p4; //在堆上申请一个Box类型大小的空间 A *p5 = new A(10, 10, 10); //调用带参数的构造函数 delete p5; } int main() { Build_release(); return 0; }
打印结果:
2、与C语言中malloc/deleta的区别
与c语言中的malloc函数和free函数有相同的也有差异
* new与delete和malloc与free的区别: * 注意:new和delete是运算符,而不是函数,因此执行效率高。 * 虽然为了与C语言兼容,C++仍保留malloc和free函数, * 但建议用户不用malloc和free函数, * 而用new和delete运算符。 * new/delete 和 malloc/free有何取别呢? * 1、malloc/free为C的标准库函数,new、delete则为C++的操作运算符 * 2、new能自动计算需要分配的内存空间,而malloc需要手工计算字节数 * 3、new与delete直接带具体类型的指针,malloc和free返回void类型的指针。 * 4、new类型是安全的,而malloc不是。例如int *p = new float[2];就会报错; * 而int *p = malloc(2 *sizeof(int))编译时编译器就无法指出错误来。 * 5、new调用构造函数,malloc不能;delete调用析构函数,而free不能 * 6、new/delete是操作符可以重载,malloc/free则不能 * 总结:更安全,便利,能重载