31类和对象 析构函数 与构造函数相对应的是析构函数。析构函数是另一种特殊的C++成员函数, 它只是在类名称前面加上一个“”符号。每一个类只有一个析构函数,没有 任何参数,也不返回任何值。例如: lass MEter public MEter() //析构函数 析构函数一般在下列两种情况下被自动调用: (1)当对象定义在一个函数体中,函数调用结束后,析构函数被自动调用 (2)new为对象分配动态内存,用 delete释放对象时,析构函数被自动调用
3.1类和对象 ➢ 析构函数 与构造函数相对应的是析构函数。析构函数是另一种特殊的C++成员函数, 它只是在类名称前面加上一个“~”符号。每一个类只有一个析构函数,没有 任何参数,也不返回任何值。例如: class CMeter { public: ... ~CMeter( ) { } // 析构函数 ... } 析构函数一般在下列两种情况下被自动调用: (1) 当对象定义在一个函数体中,函数调用结束后,析构函数被自动调用。 (2) new为对象分配动态内存,用delete释放对象时,析构函数被自动调用
31类和对象 默认构造函数和析构函数 类定义时,如果没有定义任何构造函数,编译器自动生成一个不带参数的 默认构造函数,格式如下 类名>:<默认构造函数名> 按构造函数的规定,默认构造函数名同类名。默认构造函数的这样格式也 可由用户定义在类体中。在程序中定义一个对象而没有指明初始化时,则编 译器便按默认构造函数来初始化该对象 默认构造函数对对象初始化时,则将对象的所有数据成员都初始化为零或 空 如果一个类中没有定义析构函数,编译系统生成一个默认析构函数,格式 类名>:<默认析构函数名>() 默认析构函数名与该类的类名同名。是一个空函数
3.1类和对象 ➢ 默认构造函数和析构函数 ▪ 类定义时,如果没有定义任何构造函数,编译器自动生成一个不带参数的 默认构造函数,格式如下: <类名>::<默认构造函数名>() { } ▪ 按构造函数的规定,默认构造函数名同类名。默认构造函数的这样格式也 可由用户定义在类体中。在程序中定义一个对象而没有指明初始化时,则编 译器便按默认构造函数来初始化该对象。 ▪ 默认构造函数对对象初始化时,则将对象的所有数据成员都初始化为零或 空。 ▪ 如果一个类中没有定义析构函数,编译系统生成一个默认析构函数,格式: <类名>::~<默认析构函数名>() { } ▪ 默认析构函数名与该类的类名同名。是一个空函数
31类和对象 构造函数的重载 [例 Ex ConDefault]带默认参数的构造函数 #inc lude <iostream. h class cDate t public CDate (int year = 2002, int month =7, int day=30) t nYear= year, nMonth=month; nDay = day cout<<nYear<-<<nMonth<<-<<nDay<endl //其他公共成员 private int nYear, nMonth, nDay void main CDate dayl CDate day 2(2002, 8) 运行结果为: 2002-7-30 2002-8-30
3.1类和对象 ➢ 构造函数的重载 [例Ex_ConDefault] 带默认参数的构造函数。 #include <iostream.h> class CDate { public: CDate(int year = 2002, int month = 7, int day = 30) { nYear = year; nMonth = month; nDay = day; cout<<nYear<<"-"<<nMonth<<"-"<<nDay<<endl; } // 其他公共成员 private: int nYear, nMonth, nDay; }; void main() { CDate day1; CDate day2(2002, 8); } 运行结果为: 2002-7-30 2002-8-30
31类和对象 拷贝构造函数 [例 Ex ConCopy]拷贝构造函数的使用 #inc lude <iostream. h class cDate CDate (int year = 2002, int month =7, int day=30) cout<<"调用构造函数"<<endl; nYear= year, nMonth= month; nDay =day cout<<nYear<-<<nMonth<<"-<<nDay<endl CDate(const CDate &ymd) {cout<<"调用拷贝构造函数"<end1; cout<ymd nYear<"-"<<ymd n Month<< -"<<ymd nDay<endl private int nYear, nMonth, nDay void maino CDate day 1(2002, 8) CDate day2(day1)
3.1类和对象 ➢ 拷贝构造函数 [例Ex_ConCopy] 拷贝构造函数的使用。 #include <iostream.h> class CDate {public: CDate(int year = 2002, int month = 7, int day = 30) { cout<<"调用构造函数"<<endl; nYear = year; nMonth = month; nDay = day; cout<<nYear<<"-"<<nMonth<<"-"<<nDay<<endl; } CDate(const CDate &ymd) { cout<<"调用拷贝构造函数"<<endl; cout<<ymd.nYear<<"-"<<ymd.nMonth<<"-"<<ymd.nDay<<endl; } private: int nYear, nMonth, nDay; }; void main() { CDate day1(2002, 8); CDate day2(day1); }
31类和对象 [例 Ex Con Copy Default]默认拷贝构造函数的使用。 #include < iostream. h> class cdate CDate (int year= 2002, int month =7, int day= 30) cout<<"调用构造函数"<<endl nYear year, nMonth= month; nDay da void output o t cout<<nYear<< -<<nMonth<<"-"<<nDay<<end 1: private int nYear, nMonth, nDay void maino t CDate day1(2002, 8) CDate day 2 (day1) //调用默认的拷贝函数 dayl output day2. output 运行结果为: 调用构造函数 2002-8-30 2602-8-30
3.1类和对象 [例Ex_ConCopyDefault] 默认拷贝构造函数的使用。 #include <iostream.h> class CDate {public: CDate(int year = 2002, int month = 7, int day = 30) { cout<<"调用构造函数"<<endl; nYear = year; nMonth = month; nDay = day; } void output() { cout<<nYear<<"-"<<nMonth<<"-"<<nDay<<endl; } private: int nYear, nMonth, nDay; }; void main() { CDate day1(2002, 8); CDate day2(day1); // 调用默认的拷贝函数 day1.output(); day2.output(); } 运行结果为: 调用构造函数 2002-8-30 2002-8-30