一、构造函数
1、概念
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名叫做构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
2、特征
- 函数名与类名相同。
- 无返回值
- 对象实例化时编译器自动调用对应的构造函数
- 构造函数可以重载
- 如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显示定义编译器将不再生成。
下面代码构造函数与缺省参数结合,非常实用!
注意缺省参数只能在声明时给,不能定义给!!!(当声明和定义分离时)
不然会报错!!!
#include<iostream>
using namespace std;
class date
{
private:
int _year;
int _month;
int _day;
public:
//函数名与类名相同。无返回值
date(int year = 2023, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << '-' << _month << '-' << _day;
}
};
int main()
{
date a;
date _a(1, 2, 3);
a.Print();
return 0;
}
但此时如果把自己定义的构造函数删除,默认生成构造函数,但是不会自己初始化。
3、默认生成的构造函数,到底有什么用?
处理自定义(回去调用这个成员的默认构造函数),但对于内置类型不确定(看编译器),建议不处理。
比如上面是自定义类型,就会自己调用Stack的默认构造函数
默认构造函数的概念:
- 我们不写显示构造函数,编译器默认生成的构造函数,叫默认构造
- 无参构造函数也可以叫默认构造
- 全缺省也可以叫默认构造
小总结:
内置类型成员不做处理,自定义类型会去调用它的默认构造。
所以对于内置类型,还是需要程序员自己去创建构造函数,而对于自定义类型,会自动调用这个成员的默认构造函数,其实还是自己创建的构造函数
- 内置类型:int/double/……注意指针都是内置类型
- 自定义类型:class/struct
其实上面的构造函数并不好,对于自定义类型和构造类型区别对待,在C++11中,会支持对内置类型的初始化,在private声明的时候进行初始化。支持声明时给缺省值
总结:
- 一般情况下,我们都要自己写构造函数
- 内置类型都不处理
- 成员都是自定义类型,或者声明时给了缺省值,可以考虑让编译器自己生成构造函数
可以不传参数就调用构造,都可以叫默认构造,这三个函数不能同时存在,只能存在一个
析构函数:
1、概念
与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
2、特性
- 析构函数名是在类名前加上字符~
- 无参数无返回值类型
- 一个类只能有一个析构函数。若未显示定义,系统会自动生成默认的析构函数。注意析构函数不能重载
- 对象生命周期结束时,C++编译系统自动调用析构函数。
3、功能
对象销毁不需要析构函数,对象的销毁靠系统,更本质一点是函数栈帧的销毁,而析构函数的作用是处理动态开辟的空间,比如栈开辟的动态的空间。
我们如果不写析构函数,那系统自动默认生成的析构函数,不会把开辟的指针处理
默认生成析构函数,行为跟构造类似,内置类型成员不做处理,自定义类型成员会去调用他的析构
注意构造函数和析构函数都是可以显示调用的。构造函数用定位new显示调用。