构造函数
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。
注意: 在构造函数时,优先级为 全局对象 > 局部变量 ; 静态变量 > 普通变量。
struct Time
{
public:
Time()
{
_hour = 0;
_minute = 0;
_second = 0;
}
void print()
{
cout << _hour << "-" << _minute << "-" << _second << endl;
}
private:
int _hour;
int _minute;
int _second;
};
// Time 类是用来辅助演示 系统默认构造函数的
class Date
{
public:
// 1. 这是系统默认的构造函数,是不可见的,如果你没有自己定义构造函数,那么系统就会自动调用这个函数
Date(){} //不可见的,它不会初始化自身类中的成员变量,但是会去初始化自身类中嵌套的其他类的成员变量。
//2. 这是全缺省构造函数
Date(int year = 2020, int month = 4, int day = 12)
{
_year = year;
_month = month;
_day = day;
}
//3. 无参的构造函数
Date()
{
_year = 2020;
_month = 4;
_day = 12;
}
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
Time s;
//如果这里还有一个其他类 Time s; 那么调用系统默认构造函数则会将 Time 类中的成员变量初始化,而不会初始化自身的成员变量,所以这是 C++ 的一个坑
};
int main()
{
Date d1; //构造函数的3中: 1.系统默认构造函数(自己不定义则使用,否则会调自己定义的)
//2. 全缺省构建函数 3. 无参构造函数
d1.Display();
return 0;
}
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。
析构函数
概念
与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
特性
析构函数是特殊的成员函数。
其特征如下:
- 析构函数名是在类名前加上字符 ~。
- 无参数无返回值。
- 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
- 对象生命周期结束时,C++编译系统系统自动调用析构函数。
特点
从下往上进行析构,和构造函数顺序刚好相反。
class Stack
{
public:
void print()
{
cout << this << endl;
}
~Stack()
{
cout << "~Stack" << "-" << this << endl;
}
private:
int* _a;
int _size;
int _capacity;
};
int main()
{
Stack s1;
s1.print();
Stack s2;
s2.print();
}
// 由这个代码就能看出析构函数是从下往上进行清理的。