前言:当我们在C++中创建应该空类,你会不会以为里面啥也没有,就算运行也不会有任何波动。其实这种思想是错的,就算我们不写任何东西,编译器也会生成一些默认函数,这些函数由系统来自动调用,系统默认里面是“空”的,前提是我们不自己写,但是后面我们会知道其实不是“空”的。
一,构造函数
1)什么是构造函数
首先假如我们写一个简单日期类
class Date { int year; int month; int day; };
在使用这里面的数据的时候,我们是不是需要初始化,在C语言中我们是需要每次使用这个类/结构体时都要手动初始化,有时候我们经常忘记初始化导致报错,C++祖师爷考虑到这个很不方便,于是发明了构造函数,它是负责帮助我们初始化的,系统中通常有一个默认的构造函数,我们现在暂时看作里面是“空的”,我们想要真正初始化数据我们就需要手动化使用它,构造函数也是函数,它的函数名就是类名,但是没有返回值,可以有参数,而且可以函数重载(不懂看我上一篇文章),函数里面是你进行的初始化操作,注意这个在创建对象的时候就自动调用了,不需要我们显示调用。
构造函数
class Date { int year; int month; int day; Date(int year1, int month1, int day1) { year = year1; month = month1; day = day1; } };
2)构造函数的使用
我们先讲默认构造函数的调用方法,这个就是创建对象的时候就自动调用了,无需过多操作
自己写的构造函数的调用分两种,如果没有参数的话我们就不需要过多操作,和系统默认操作一样,注意当你自己写了构造函数,系统默认的构造函数不会再产生
Date A;//调用的是系统默认的构造函数或者无参构造函数
有参数的构造函数调用和函数调用类似,但是前面要加类名
Date A(2023,20,23);
3)系统默认构造函数真的无参吗?
这个其实是不太准确的,我们都知道类是可以嵌套的,类里面可以包含另一个类的对象,如果默认的构造函数真的什么也不做,那么类里面的类由谁来调用呢?这个是一个值得我们思考的问题,在实际使用中我们会发现类中类会执行自己的构造函数,因此其实系统的默认构造函数并不是一个懒鬼,其实它会调用嵌套类的构造函数。
二,析构函数
1)什么是析构函数
我们类比前面的构造函数,构造函数是负责初始化的,假如类是共享单车,我们使用共享单车就只管使用吗?我们如果不还会一直扣费的,因此我们需要去释放,而析构函数就是负责这个的,构造函数负责开头,而析构函数负责结尾,其他于构造函数类似,系统有默认的析构函数,而且是自动调用,系统默认的析构函数会调用嵌套类的析构函数。
2)析构函数的使用
析构函数与构造函数很像,但是区别在于析构函数名字前面要加一个 ~ 。
~Date() { year = 0; month = 0; day = 0; }
3)什么类需要使用析构函数
什么我们日期类的析构函数看似做了事情但是实则聊生于无,那什么类真正需要析构函数呢?当然是那些需要手动释放的空间,这些空间如果不手动释放就会造成内存泄漏,像我们写栈时,我们一般会在堆上开辟空间,这些是需要手动释放的,不然就会等到程序结束才会释放,有很多程序是一直运行的,那么就会一直开辟空间,直至程序崩溃。