二、构造 & 析构函数
2.1 构造和析构
2.1.1 功能
构造函数功能
构造函数在类实例化对象时用于完成对象成员的初始化,通常包括以下操作:
1. 为成员变量分配内存空间
2. 初始化成员变量
3. 执行类似打开文件、分配资源等额外操作
析构函数功能
主要作用在于对象 销毁前 系统自动调用,执行一些清理工作。
2.1.2 格式
构造函数
类名( ) { }
- 构造函数与类名同名。
- 构造函数没有返回值,也不能写
void
。- 构造函数通常设置为
public
权限,以便外部能够调用。- 构造函数可以有参数,因此==可以发生重载==
- 序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次
- 如果不写构造函数 , 编译器会默认提供一个==构造函数==
析构函数
~类名( ){ }
- 析构函数,没有返回值也不写void
- 函数名称与类名相同,在名称前加上符号 ~
- 析构函数不可以有参数,因此不可以发生重载
- 程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
2.1.3 调用时机
构造函数:在类实例化对象时 自动调用,不需要也不允许手动调用。
析构函数:在 对象销毁 或者 程序结束前 调用,不需要手动调用。
注意 :
1、析构函数可以手动调用 但是一般不这么干
MyClass obj;
obj.~MyClass(); // 手动调用析构函数
2、析构函数在堆区 和 栈区的释放方式是不同的
栈区中 程序结束前 系统自动调用
堆区中 程序结束不会调用 需要用户手动调用 delete 才能调用堆区空间
2.1.4 构造和析构调用顺序
2.1.1.1 对于堆区对象:
先new那个对象 就先构造那个对象
先delete 那个对象 就先析构那个对象
所以一般不考虑 堆区的构造函数
2.1.1.1 对于栈区对象:
构造函数的调用顺序: 按顺序调用
析构函数的调用顺序:按逆序调用 // 先进 后出 先构造 后析构(栈的顺序)
2.1.5 栈区与堆区的对象创建
栈区:
当在栈区创建对象时,构造函数会自动调用。
类名 对象名(构造函数的实参表); // 调用构造函数
堆区:
类名 *指针名; // 这一步不会调用构造函数
指针名 = new 类名(); // 这个时候才调用构造函数
在堆区创建对象时,需要使用