【类的默认成员函数】构造函数&&析构函数【C++】
【类的默认成员函数】构造函数&&析构函数【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后析构

浙公网安备 33010602011771号