构造函数
什么是构造函数
C++是基于C的基础上的,但是为了提升C 语言,C++在类中引用了构造函数。
构造函数是为了将类初始化
构造函数的特点
1、名字与类名相同
2、创建类类型对象时由编译器自动调用,且只调用一次
3、可重载
4、无返回值
怎样写构造函数
class Date {
public:
void printDate();
//构造函数
Date(int year = 2000, int month = 1, int day = 1);
//此处全缺省的意义:使编译器混淆函数与构造函数
//全缺省或部分缺省只能用于声明,而不能用于定义。
//因为在定义中写将会混淆(声明只与定义值不一致)
private:
int _day ;
int _year ;
int _month ;
};
//在另一个CPP文件里
Date::Date(int year, int month, int day) {
_day = day;
_year = year;
_month = month;
}
void test1() {
Date d1;
Date d2(2023, 1, 20);
//这样做不可以
//Date d3()
d1.printDate();
d2.printDate();
}
什么时候写构造函数
内置的类:int类型, char类型等。还有指针。
自定义类:class/ struct /union
系统对内置的类不做处理
对于自定义类会调用默认构造函数
当默认构造函数不能满足需求时则需要自己写构造函数
构造函数可重载,但是默认构造函数有且只有一个。只要用户自己写了构造函数,编译器就不会再调用默认构造函数。
最好在成员变量声明时就给缺省值
举例:
假如Date类不写构造函数,不可以满足对日期的初始化
另一个例子:Stack类
写构造函数
不写构造函数,没有给栈开辟空间,没有省定初始容量
编译器其实可以自动生成构造函数
class Stack
{
public:
Stack(int capacity = 4)
{
cout << "Stack(int capacity = 4)" << endl;
_a = (int*)malloc(sizeof(int) * capacity);
if (_a == nullptr)
{
perror("malloc fail");
exit(-1);
}
_top = 0;
_capacity = capacity;
}
private:
int* _a;
int _top;
int _capacity;
};
析构函数
什么是析构函数
完成资源清理工作
比如:释放之前开辟的空间,将数值置为0等
析构函数的特点
- ~+类名
- 无参(无重载)
- 无返回值
- 在类对象生命周期结束后自动调用
class Stack
{
public:
Stack(int capacity = 4)
{
cout << "Stack(int capacity = 4)" << endl;
_a = (int*)malloc(sizeof(int) * capacity);
if (_a == nullptr)
{
perror("malloc fail");
exit(-1);
}
_top = 0;
_capacity = capacity;
}
~Stack()
{
cout << "~Stack()" << endl;
free(_a);
_a = nullptr;
_top = _capacity = 0;
}
private:
int* _a;
int _top;
int _capacity;
};
什么时候写析构函数
- 是否有空间需要释放
- 默认析构函数是否够用
只要自己写了析构函数,编译器自动生成的默认析构函数就不会再被调用。