C++重新认知:构造函数和析构函数

一、构造函数

1.1简介

当我们定义一个类,需要创建这个类并且初始化时需要用到构造函数。
构造函数与类名称相同,没有返回值。
在这里插入图片描述
通常构造函数具有公共可访问性,以便类定义或者继承时外部的代码可以创建类的对象。

1.2 构造函数的构造过程:由顶层基类往下构造

在这里插入图片描述
可以看到先构造的基类,在构造的子类。

1.3 成员初始化表达式列表

写法:在这里插入图片描述
构造函数名(参数1,参数2…) : 变量1(参数1),变量2(参数2)…{}
在这里插入图片描述

优点:

1)提高效率:成员初始化表达式列表可以直接将初始值传递给成员变量,而不需要先调用默认构造函数再赋值。这样可以避免了不必要的构造和赋值操作,提高了代码的执行效率。

2)避免未初始化问题:通过成员初始化表达式列表,我们可以确保类的成员变量在对象创建时得到正确的初始值,避免了未初始化的问题。这对于内置类型或者没有默认构造函数的成员变量尤为重要。

3)支持常量成员的初始化:常量成员变量是在类定义中使用const关键字声明的成员变量。由于常量成员变量只能在初始化列表进行初始化,而不能在构造函数体内进行赋值,所以成员初始化表达式列表是初始化常量成员变量的唯一方式。

4)初始化顺序控制:成员初始化表达式列表可以显式指定成员变量的初始化顺序,而不是按照它们在类中定义的顺序进行初始化。这在某些情况下非常有用,特别是当一个成员变量的初始化依赖于另一个成员变量时。

1.4 默认构造函数

1)默认构造函数通常没有参数
2)默认构造函数是特殊成员函数之一,如果类中没有声明构造函数,则编译器隐式inline默认构造函数
3)可以将默认构造函数定义为已删除防止编译器产生它在这里插入图片描述 可以看到当我们删除后,在创建类时会产生错误,原因时编译器已经不会自动生成这个默认构造函数了
4)如果声明了任何非默认构造函数,编译器就不会提供默认构造函数。
在这里插入图片描述

1.5 拷贝构造函数

拷贝构造函数详细内容跳转

1.6 移动构造函数(先赖着吧。。后面会补冲这块内容)
。。。还有很多类型构造函数后面开一期新的讲吧

二、析构函数

2.1 简介

析构函数是一个成员函数,当创建的对象超出范围时或通过调用delete或者时delete[]显式销毁创建的对象时,会自动调用析构函数。

2.2声明析构函数

在这里插入图片描述 1)波浪号~加上类名,析构函数与类同名。
2)不接受自变量
3)不返回值
4)无法声明为const、static或volatile。
5)可以声明为virtual,即无需知道对象的类型就可以销毁对象,析构函数也可以声明为抽象类的纯虚函数。

2.3 默认情况

如果类中未定义析构函数时,编译器会提供一个默认的析构函数;

2.4 自定义析构函数

当类必须显式释放资源时(),程序员就必须自己定义一个析构函数了。

1) 使用了动态分配的内存:当一个类使用了new运算符进行动态内存分配(例如使用了指针或动态数组),那么就需要在析构函数中使用delete或delete[]来释放分配的内存,以防止内存泄漏。

2)使用了其他资源:除了内存之外,对象还可能使用其他资源,如文件句柄、网络连接等。在析构函数中,我们可以关闭文件、断开网络连接等来释放这些资源。

3)存在对象间的依赖关系:如果一个类持有其他对象的指针或引用,并且这些对象的生命周期不受该类控制,那么在析构函数中应该处理这些依赖关系,确保正确释放相关的资源或通知其他对象。

2.5 析构的顺序: 先构造的后析构,后构造的先析构。

1)非虚拟基类、虚拟基类的析构函数以声明的相反顺序被调用(也就是和构造的顺序相反)。

2)深度优先(构造的子类到基类最深处的优先析构)。

在这里插入图片描述

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rain_ZZX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值