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

一、构造函数

1.1简介

当我们定义一个类,需要创建这个类并且初始化时需要用到构造函数。
构造函数与类名称相同,没有返回值。
C++重新认知:构造函数和析构函数_第1张图片
通常构造函数具有公共可访问性,以便类定义或者继承时外部的代码可以创建类的对象。

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

C++重新认知:构造函数和析构函数_第2张图片
可以看到先构造的基类,在构造的子类。

1.3 成员初始化表达式列表

写法:C++重新认知:构造函数和析构函数_第3张图片
构造函数名(参数1,参数2…) : 变量1(参数1),变量2(参数2)…{}
C++重新认知:构造函数和析构函数_第4张图片

优点:

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

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

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

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

1.4 默认构造函数

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

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

二、析构函数

2.1 简介

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

2.2声明析构函数

C++重新认知:构造函数和析构函数_第7张图片 1)波浪号~加上类名,析构函数与类同名。
2)不接受自变量
3)不返回值
4)无法声明为const、static或volatile。
5)可以声明为virtual,即无需知道对象的类型就可以销毁对象,析构函数也可以声明为抽象类的纯虚函数。

2.3 默认情况

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

2.4 自定义析构函数

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

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

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

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

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

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

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

C++重新认知:构造函数和析构函数_第8张图片

你可能感兴趣的:(C++重新认知系列,c++,开发语言)