一、构造函数
1.1 概念
构造函数是一种特殊的成员函数,名字与类名相同,创建类类型对象时编译器自动调用——初始化对象,在对象整个生命周期内只调用一次。
PS: 1. 构造函数无返回值;2. 构造函数支持重载。
class Date { public: Date() // 1. 无参构造函数 { _year = 1; _month = 1; _day = 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(2013, 2, 22); // 调用带参构造函数 // Date d3(); // warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?) // 与函数声明无法区分 return 0; }
1.2 默认构造函数
默认构造函数,指可以不传参就直接调用的构造函数。
三类:
- 类中没有显示定义构造函数,C++编译器会自动生成一个无参的默认构造函数。
- 无参构造函数
- 全缺省
class Date { public: // 2. 全缺省构造函数 Date(int year = 2, int month = 2, int day = 2) { _year = 2; _month = 2; _day = 2; } private: // 1. C++11支持在声明时给缺省值 int _year = 1; int _month = 1; int _day = 1; };
PS:
- 一旦用户显示定义构造函数,则编译器不再自动生成。
- 默认构造函数只能有一个。
二、析构函数
2.1 概念
析构函数不是对对象本身进行销毁(局部变量的销毁由编译器完成),对象在销毁时会自动调用析构函数,完成对象中资源清理的工作。
- 析构函数名为类名前加上
~
- 无参数无返回值
- 一个类只能有一个析构函数;若未显示定义,系统会生成默认的析构函数;析构函数不支持重载。
- 对象生命周期结束,系统自动调用析构函数。
#include <iostream> using namespace std; class Stack { public: Stack(int capacity = 3) { _a = (int*)malloc(sizeof(int) * capacity); if (nullptr == _a) { perror("malloc"); } _capacity = capacity; _top = 0; } ~Stack() { free(_a); _top = _capacity = 0; _a = nullptr; } private: int* _a; int _capacity; int _top; };
PS: 如果类中没有申请资源,析构函数可以不写,使用编译器生成的默认析构,如:Date类;有资源申请时,一定要写,否则会造成资源泄露,如:Stack类。