【类的默认成员函数】构造函数&&析构函数【C++】
任何一个类在我们不写的情况下,都会自动生成6个默认成员函数
构造函数:初始化(不是开空间!)
日常实操中最好自己写一个!!!!!!!!
Date()
{_year = 1;_month = 1;_day = 1;
}
特点
(1)函数名和类名相同
(2)无返回值
(3)对象实例化时编译器自动调用对应的构造函数
自动调用,不用手动写
(4)构造函数可以重载
Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}
【调用方式】
Date d2(2023, 10, 21);
推荐使用全缺省的构造函数:是否传参数可由你决定。传参数数量也是由你决定
(普通函数和全缺省函数在调用时会出现错误)
//普通的构造函数Date(){_year = 1;_month = 1;_day = 1;}
//全缺省的构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
(5)如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成
如果一个类中的成员全是自定义类型,我们就可以用默认生成的函数
如果有内置类型的成员,或者需要显示传参初始化,那么都要自己实现构造函数
可以不传参数就调用构造,都可以叫默认构造
C++默认生成的构造函数对于内置类型成员变量不做处理,对于自定义类型的成员变量才会处理
(1)内置类型/基本类型:int、char、double、指针……
(2)自定义类型:class、struct去定义的类型对象
class A
{
public:A(){cout << "A()" << endl;_a = 1;}
private:int _a;
};
class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;cout << endl;}
private:int _year = 2023;int _month = 11;int _day = 11;A _aa;
};int main()
{Date d1;d1.Print();return 0;
}
发现A的初始化被处理了,Date则没有被处理
(6)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数
不想自己再写构造函数也要对内置类型处理
class Date
{
public:// 我们不写,编译器会生成一个默认无参构造函数/*Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}*/void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:// C++11 打的补丁,针对编译器自己默认成员函数不初始化问题int _year = 2023;int _month = 10;int _day = 21;};
int main()
{// 没有定义构造函数,对象也可以创建成功,因此此处调用的是编译器生成的默认构造函数Date d;d.Print();
}
析构函数:清理(不是销毁!)~
如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类
有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类
~Date()
{cout << "~Date()" << endl;
}
class Date
{
public:Date(int year = 2023, int month = 10, int day = 21){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}~Date(){cout << "~Date()" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();return 0;
}
关于谁先构造谁先析构
int main()
{Stack st1;Stack st2;
}
st1和st2是在栈上的:先进后出
st2先析构,st1后析构