目录
目录:
1:构造函数
2:析构函数
前言:我们知道c++使用起来是比c语言方便的,那么为啥比他使用起来简单,这里我们就不得不提及我们c++中默认成员函数了,是它们默默的承担了所有。
下面让我们先来学习前两个默认成员函数:构造函数与析构函数。
1:构造函数
构造函数并不是来开辟空间创建对象的函数,而是用来对对象进行初始化的函数,它的作用类似于我们平常所使用的Init函数。
首先我们先来介绍构造函数的定义,然后在深入细节。
1:函数名与类名相同。
2:无返回值(并不是前面加void)。
3:对象实例化时编译器会自动调用对应的构造函数。
4:构造函数可以形成函数重载。
5:当我们没有定义构造函数的时候,c++编译器会自动生成一个无参的默认构造函数,这个默认成员函数并没有什么实际的作用,但是当我们定义了构造函数编译器就不会生成默认构造函数了。
6:编译器生成的默认构造函数并不只是编译器生成的那么简单,c++对于类型有两种分类,一种是内置类型,一种是自定义类型,当我们使用自定义类型去定义成员变量的时候,编译器会自动调用该对象的默认构造函数,而对于内置类型(int char 指针)编译器并不会处理,但是关于内置类型c++11打了一个补丁,可以给内置类型使用缺省值的语法。
7:对于默认构造函数其实并不是只有编译器默认生成的,还有全缺省参数,无参的构造函数,总的来说就是:只要构造函数没有形参,那么就可以把他当成默认成员函数,他们三种构造函数只能存在一种函数。
下面我们来通过代码与画图来分析上面的定义:
我们先通过Date类来介绍构造函数的定义,以及使用时要注意的点。
先上一个简单的代码
class Date
{
public:
Date()
{
cout << "Date函数的构造函数" << endl;
_year = 2023;
_month = 10;
_day = 27;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;//实例化出对象,并开辟空间
return 0;
}
从这个例子中我们也能证明语法1,2,3的存在。当对象实例化的时候编译器会自动调用成员函数,不需要人为的去调用。
这是我们定义的默认成员函数,那么当我们没写的时候编译器会生成什么样的默认成员函数呢?
语法5:
接下来我们来看看语法4函数的证明:
在这里我们需要注意的是,当构成函数重载时,默认的构造函数只能出现一种,并且在使用默认构造函数的时候我们需要注意的是,当我们想要使用具有形参的构造函数的时候,我们应该按照如下图所示的样例来调用此需要传实参的默认构造函数。
语法7的样例 只能出现一种默认的构造函数,并且编译器所形成的默认构造函数,是当我们没有定义构造函数时才会出现的。
接下来我们来学一学有点绕的第6个语法。
对于自定义类型来说,编译器会去调用它的默认构造,自定义类型编译器并不会做什么实际的操作。
到这里我们就将我们的构造函数给讲解完毕了,我们首先需要知道如何定义构造函数,并且知道一些想应的规则。
下面让我们来讲解另外一个重要的函数,析构函数。
2:析构函数
析构函数与构造函数的功能相反,其实与我们在c语言中使用的Destroy函数的用法一样,在对象作用域销毁的时候会自动调用析构函数,是完成对对象中资源进行清理工作。
语法定义:
1:函数名与类名相同并且在函数名前面加~(取反)符号,也说明了与构造函数相反。
2:无返回值类型,无函数的形参.
3:对象在销毁时编译器会自动调用它的析构函数。
4:不能构成函数的重载.
5:当我们没有定义析构函数的时候编译器会自动形成一个析构函数同样这个析构函数并不会起到什么作用。
6:对于自定义类型来说当对象销毁的时候,自定义类型的变量会自动调用它的析构函数,对于内置类型成员并不会做什么处理。
下面我们通过代码来讲解语法的意思:
语法1
语法2不能有函数的形参,如果有语法会报错
又因为析构函数没有形参,所有它也就没有函数重载的特性。
当对象销毁时,编译器会自动调用它的析构函数。
如下图
我们自己并没有去调用。
对于自定义类型的对象,默认情况下会调用它的析构函数,还是使用MyQueue这个类。
讲到这里我们的析构函数的语法也就讲解完毕了,感谢大家的耐心观看,如果博主有什么错误的地方希望大家指点。