目录
构造函数
构造函数的概念
析构函数的作用
自定义构造函数与默认构造函数
自定义构造函数
默认构造函数
调用自定义构造函数
析构函
自定义析构函数和默认构造函数
自定义构造函数
默认析构函数
构造函数
构造函数的概念
我们通常的函数是都需要有返回值的,但是有这样一类函数不需要返回值,而且函数名必须与类名相同(类中的特有的函数),这就是构造函数。
构造函数的作用
由于我们使用类时,通常会忘记进行对成员变量进行初始化,这个问题时常困扰着祖师爷,所以构造函数应运而生,构造函数在类中承担着初始化成员变量的作用;
自定义构造函数与默认构造函数
自定义构造函数
我以日期类举例子,看招:
#include<iostream>
using namespace std;
class data
{
public:data()//构造函数{_year = 1;_month = 1;_day = 1;}
private:int _year;int _month;int _day;
};
一为函数名与类名相同,二为函数没有返回值,三在类中,三者俱全,是为构造函数。构造函数对成员变量进行初始化。
什么?没有传参怎么访问成员变量?在类中成员变量就相当于类中的全局变量,在类中函数访问成员变量不需要传参;
默认构造函数
自定义构造函数是我们自己定义的,但有时候我们甚至连构造函数都忘了写,这时不用着急,在C++中编译器会自动在类中产生一个构造函数,称为默认构造函数;
默认构造函数会自动产生并调用,操作对象是所有的成员变量,但是默认构造函数初始化的值与编译器有关,不同的编译器会有不同的随机值;所有成员变量初始化的是同一个随机值;
这时VS2022调用默认构造函数初始化的值:
VS自动初始化为了0,但是在其他别人的编译器上可能是其他的数;
调用自定义构造函数
构造函数在调用时是无法使用,成员访问符来调用的,与此不同,看代码:
#include<iostream>
using namespace std;
class date
{
public:date(int a=1, int b=2){_a = a;_b = b;}void print(){cout << _a << " " << _b << endl;}
private:int _a;int _b;
}s;
int main()
{date s1(5,66);s1.print();return 0;
}
对构造函数进行缺省处理,会自动初始化为默认值,同时我们也可以方便的给出初始化值,像date s1()这样。
需要注意的是,如果自己写了构造函数,编译器就不会自动生成了,像这样:
#include<iostream>
using namespace std;
class date
{
public:date(int a, int b){_a = a;_b = b;}void print(){cout << _a << " " << _b << endl;}
private:int _a;int _b;
}s;
int main()
{date s1(5,6);s1.print();return 0;
}
构造函数没有全缺省,那么我们就必须在定义s1时进行手动初始化,否则会报错。
析构函数
析构函数与构造函数的作用是相反的,析构函数是用来对部分的成员变量进行清理的;例如我们在类中有成员变量在堆区开辟了空间,我们如果忘记最后进行delete,那么就会造成内存泄漏。析构函数就解决了这个问题;
自定义析构函数和默认构造函数
自定义构造函数
下来写个构造函数叭,一看便知:
#include<iostream>
using namespace std;
class data
{
public:~data(){cout << "~data()" << endl;}
private:int* a;int b;int c;
}s;int main()
{}
析构函数与构造函数差不多,在函数名上有所区别,析构函数的名字必须是~类名,如上的~data,没有返回值,在类结束时会自动调用;通常进行释放在堆区的成员变量;
默认析构函数
与默认构造函数一家,都是因遗忘而诞生的,类中必有析构函数,你不写,编译器自己写,对部分成员进行清理。