目录
1、构造函数概念:
构造函数是一个特殊的成员函数,名字与类名相同,创建类对象时由编译器自动调用,可以初始化对象的成员变量,并且在对象的生命周期内只调用一次。
2、构造函数性质:
构造函数是特殊的成员函数,虽然名称有构造,但是主要并不是开辟了空间,而是初始化对象。
特征如下:
1、函数名与类名相同。
2、无返回值
3、对象实例化时自动调用对应的构造函数
4、构造函数可以重载
class Date{public :// 1. 无参构造函数Date (){}// 2. 带参构造函数Date ( int year , int month , int day ){_year = year ;_month = month ;_day = day ;}private :int _year ;int _month ;int _day ;};void TestDate (){Date d1 ; // 调用无参构造函数Date d2 ( 2015 , 1 , 1 ); // 调用带参的构造函数
无参的构造函数、全缺省的构造函数,编译器默认生成的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
3、析构函数的概念:
析构函数与构造函数功能相反,析构函数不是对对象本身进行销毁,这个功能是由编译器自动完成,销毁时会调用析构函数,完成对象中资源的清理工作。
4、析构函数性质:
1、析构函数是在类名前加上字符~。
2、析构函数无参数无返回值类型
3、一个类只能有以恶搞析构函数,若未显式定义,系统会自动生成默认的析构函数,析构函数不可以重载。
4、对象生命周期结束时,编译器会自动调用析构函数。
class Time{public :~Time (){cout << "~Time()" << endl ;}private :int _hour ;int _minute ;int _second ;};class Date{private :// 基本类型 ( 内置类型 )int _year = 1970 ;int _month = 1 ;int _day = 1 ;// 自定义类型Time _t ;};int main (){Date d ;return 0 ;}
程序运行结束后输出:~Time() ,在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的析构函数? 因为:main方法中创建了Date对象d,而d中包含4个成员变量,其中_year, _month, _day三个是内置类型成员,销毁时不需要资源清理,最后系统直接将其内存回收即可;而_t是Time类对象,所以在d销毁时,要将其内部包含的Time类的_t对象销毁,所以要调用Time类的析构函数。但是main函数中不能直接调用Time类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函数,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数,目的是在其内部 调用Time类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁 main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数。