C++的构造函数和析构函数
首先我们要了解,在C ++的类中,什么都不写时,编译器会生成6个默认成员函数
默认成员函数:就是用户不用显示实现,编译器会自动生成的成员函数(半自动化)
1.构造函数
1.1定义
构造函数:一种特殊成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。
//引入:为什么需要提出构造函数这个概念
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void print()
{
cout << _year << " " << _month << " " << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1.Init(2004, 10, 24);
d1.print();
return 0;
}
//如上述代码所示,对于Date类,可以单独设置一个成员函数,等每次穿件对象时都调用该方法进行设置信息,但是有些麻烦,所以我们希望在对象进行创建的时候,直接九江信息设置进去,所以引出了构造函数
1.2特性
注意:构造函数并没有开空间创建对象,只是初始化对象
- 函数名与类名相同
- 无返回值,不需要写void
- 对象实例化时编译器自动调用对应的构造函数。(这是与init函数的最大区别)
- 构造函数可以重载
//下面举例说明构造函数可以重载
class Date
{
public:
Date()
{}//1.无参构造函数
Date(int year, int month, int day)
{//2.带参构造函数
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;//调用无参函数
Date d2(2004, 10, 24);//调用有参构造
//Date();注意不要这样写,因为这样就变成了声明而非调用
return 0;
}
- 如果类中没有显示定义构造函数,则C++编译器会自动生成一个默认构造函数,但是一旦用户显示定义编译器将不再生成(如图所示,没有显示初始化他也会自动调用默认构造函数生成随机值)
1.3用途
C++类型=内置类型(int,char,floar....)+自定义类型(class,struct,union.....)
编译器生成的默认成员函数会对自定义类型成员调用他的默认成员函数(好好理解一下这句话)
注意:c++对于内置类型成员不初始化的缺陷,进行了修正:即内置成员变量在类中声明时可以给初始值
1.4小结
1.默认构造函数包括:无参构造函数,全缺省的构造函数,编译器默认生成的构造函数,但是默认构造函数只能有一个。
2.一般情况下,构造函数都需要我们显式的去实现
3.只有少数情况下可以让编译器自动生成构造函数
2.析构函数
2.1定义
对象在销毁的时候会自动调用析构函数,完成对象中的资源清理工作。
注意:析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。
2.2特性
- 析构函数名是在类名前加上字符~
- 无参数返回值类型
- 一个类只能有一个析构函数。同理构造函数,若未显示定义,编译器会生成默认析构函数
- 析构函数不能重载
- 对象生命周期结束时,C++编译系统会自动调用析构函数
class Stack
{
public:
~Stack()//析构函数
{
if (_array)
{
free(_array);
_array = NULL;
_capacity = 0;
_size = 0;
}
}
private:
int* _array;
int _capacity;
int _size;
};
- 编译器默认生成的析构函数,会对自定义类型成员调用它的析构函数
- 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,如Date
- 有资源申请时,一定要写,否则会造成资源泄露,比如Stack类