C++类和对象——(对象的析构和动态建立和释放)

文章讲述了C++中的析构函数在对象销毁时自动调用,用于清理资源,特别是在处理动态分配的内存时。析构函数与构造函数对应,确保对象生命周期结束时正确释放内存。同时对比了C++的new/delete与C语言的malloc/free在内存管理上的区别,强调new/delete的高效性、安全性以及与类型相关的构造和析构功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象的析构:

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则不能
* 总结:更安全,便利,能重载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值