在c++的类中存在着六大默认的成员函数,所谓的六大默认的成员函数,就是理论上如果代码中没有对应函数的显示表示,编译器会自动补充。
构造函数
构造函数不是开空间创造变量而是对变量进行初始化
- 构造函数与类名相同
- 无返回值
- 对象实例化自动调用
- 构造函数构造函数支持重载
一般情况,构造函数采用的是全缺省的写法
class Date {
public:
Date(int year = 2020, int month = 1, int day = 1) {
_month = month;
_year = year;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
全缺省的构造函数可以尽量减少代码量以及增加代码的可读性,还应注意的是,构造函数的声明和定义如果分离的话,声明可以全缺省,而定义不行
成员变量 | |
---|---|
内置类型 | int char double等c++规定的基础类型 |
自定义类型 | struct class等由程序员自己设计的自定类型 |
因此,如果类中的成员函数是内置类型,或者是自定义类型本身拥有构造函数,这样的话我们就不用显示的写构造函数,直接调用默认的构造函数即可
构造函数分为三种
1.默认构造函数
默认构造函数顾名思义就是当我们不写构造函数是编译器自动帮我们写的构造函数,就如上面所说如果类中的成员函数是内置类型,或者是自定义类型本身拥有构造函数,这样的话我们就不用显示的写构造函数。
2.拷贝构造函数,当我们在定义一个类的同时,我们需要将另一类的全部值赋值拷贝给当前类,这是就会调用拷贝函数
- 1.如果没有管理资源,采用默认的拷贝函数就行
- 2.如果都是自定义类型,内置类型成员没有指向资源,也类似默认拷贝,(MyQueue)
- 3.一般情况下,不需要写显示析构函数的,不需要写拷贝函数()
- 4.如果内部优质只能或者一些值指向资源,需要显示析构,通常需要深拷贝(Stack)
Date(const Date& d) {
_year = d._year;
_month = d._month;
_day = d._day;
}
在拷贝函数中有一个无穷递归的坑,我在上一篇博客中有提到,有需要的朋友可以自行去看,我自认为还是讲的含详细的
3.自定义的构造函数:这个没有什么说的就是自己根据自己的需求自定义一个构造函数
Attention:只要有一个显示的构造函数,系统就不会生成系统的默认拷贝构造函数
析构函数
首先我们必须明白的一个很重要的点就是,析构函数并不是完成对类的销毁,而是完成的事对类中相关资源的清理。比如说我的类中只有几个内置类型,系统是不需要对其进行析构的,如果是是一个栈或者一个堆之类的在堆中开辟了空间的类,因此,我们的析构函数的作用就是完成对其动态内存申请空间的释放。
- 1.析构函数在类名前加入~
- 2.没有返回值和参数
- 3.一个类只有一个析构函数
- 4.在生命周期结束时自动调用,可以避免内存的泄露等问题
- 析构函数可以显示调用
- 两种情况不需要写显示的析构函数
a.没有资源需要清理
b.MyQueue(类中自定义类型已经有了显示的析构函数,所以这个时候不用再写显示的析构函数)
最后总结:c++创建构造函数和析构函数的原因我认为是避免忘记对Init函数和destroy函数的调用。
在类创建时,系统自动调用构造函数对类惊醒初始化,在类的生命周期结束时,类也自动调用析构函数完成对类中资源的回收。