一、构造函数
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)深度优先(构造的子类到基类最深处的优先析构)。