
(二)第10章类和对象10.1构造函数10.2析构函数10.3对象与指针
0 第10章 类和对象(二) 10.1 构造函数 10.2 析构函数 10.3 对象与指针

10.1构造函数类是一种抽象的数据类型,其数据成员不能在声明时初始化。错误示例:ClassDateint day=10;Yint month=3;int year=2017; );对象也要先赋值,后使用在使用一个对象时,它的每个数据成员都应该有确定的值。对象的初始化体现在对数据成员的赋值
1 10.1构造函数 ◆ 类是一种抽象的数据类型,其数据成员不能在声明时初 始化。 错误示例: Class Date { int day=10; int month=3; int year=2017; }; ◆ 对象也要先赋值,后使用。 ◆ 在使用一个对象时,它的每个数据成员都应该有确定 的值。 ◆ 对象的初始化体现在对数据成员的赋值

10.1构造函数如果一个类中所有的成员(包括数据成员和成员函数都是公有的,那么在定义对象时,可以同时对其数据成员进行初始化。示例:Class Date1public: int day;int month;int year; );Dated1={10,3,2017};/将d1初始化为2017年3月10号注意:如果类中有私有或保护成员就不能这样进行初始化,只能使用公有成员函数对它们赋值
2 10.1构造函数 ◆ 如果一个类中所有的成员(包括数据成员和成员函数) 都是公有的,那么在定义对象时,可以同时对其数据成 员进行初始化。 示例: Class Date { public: int day; int month; int year; }; Date d1={10, 3, 2017}; //将d1初始化为2017年3月10号 注意:如果类中有私有或保护成员就不能这样进行初始化,只能使 用公有成员函数对它们赋值

10.1构造函数构造函数(constructor)用于对对象进行初始化的一个或一组函数声明格式:()构造函数是特殊的公有成员函数,其特征如下:1.函数名与类名相同2.构造函数无返回值类型3.在新的对象被创建时,自动调用该对象所属的类的构造函数4.构造函数可以重载,提供初始化类对象的不同方法5.构造函数即可以作为内联函数在类内定义,也可以在类外定义
3 10.1构造函数 构造函数(constructor) 用于对对象进行初始化的一个或一组函数。 声明格式: (); 构造函数是特殊的公有成员函数,其特征如下: 1.函数名与类名相同。 2.构造函数无返回值类型。 3.在新的对象被创建时,自动调用该对象所属的类的构造 函数。 4.构造函数可以重载,提供初始化类对象的不同方法。 5.构造函数即可以作为内联函数在类内定义,也可以在类外 定义

对象的初始化和构造函数例10-1定义一个带构造函数的日期类。#includeusingnamespacestdclass DateDate::Date()YJint day,month,year;public:year = 1900;Date();I构造函数,无返回值类型month = 1;voidinit(int,int,int);I/对数据成员赋值day = 1;void print_ymd();void print_mdy();
4 一、对象的初始化和构造函数 例10-1 定义一个带构造函数的日期类。 #include using namespace std; class Date { int day,month,year; public: Date(); //构造函数,无返回值类型 void init(int,int,int); //对数据成员赋值 void print_ymd(); void print_mdy(); }; Date::Date() { year = 1900; month = 1; day = 1; }

void Date::init(int yy, int mm, int dd)month=(mm>=1 &&mm= 1900 &&yy = 1 && dd <= 31 ) ? dd : 1;void Date::print_ymd()cout << year <<"," << month <<"," << day << endl;}void Date::print_mdyOcout << month <<"." << day <<"," << year << endl;}
5 void Date::init(int yy, int mm, int dd) { month = ( mm >= 1 && mm = 1900 && yy = 1 && dd <= 31 ) ? dd : 1; } void Date::print_ymd() { cout << year << "-" << month << "-" << day << endl;} void Date::print_mdy() { cout << month << "-" << day << "-" << year << endl;}

int main()Datedate1,date2;创建对象,自动调用构造函数对其初始化/输出使用init赋值前对象的内容date1.print_ymd()date2.print_ymd()1900-1-1正确的赋值数据date1.init(2017,3, 13);1900-1-12017-3-13date1.print_ymd()3-13-2017date1.print_mdy();2017-1-13Ⅱ错误的赋值数据date2.init(2017,13,13);-13-2017date2.print_ymd();date2.print_mdy();return 0;6
6 int main() { Date date1, date2; //创建对象,自动调用构造函数对其初始化 date1.print_ymd(); //输出使用init赋值前对象的内容 date2.print_ymd(); date1.init(2017, 3, 13); //正确的赋值数据 date1.print_ymd(); date1.print_mdy(); date2.init(2017,13,13); //错误的赋值数据 date2.print_ymd(); date2.print_mdy(); return 0; }

注意事项在创建对象时由系统自动调用构造函数,且只执行一次;广2构造函数不能被用户调用:例:date1.Date();非法3、构造函数无返回值:I错误,需删voidvoidDate::Date(year=1900;month=1;day=1;)4、构造函数的作用是对对象进行初始化,尽量别加无关内容;5、若用户未定义构造函数,则系统会自动生成一个默认的构造函数,但函数体是空的
注意事项 1、在创建对象时由系统自动调用构造函数,且只执行一次; 2、构造函数不能被用户调用; 例:date1.Date(); -非法 3、构造函数无返回值; void Date::Date() //错误,需删void {year = 1900;month = 1;day = 1;} 4、构造函数的作用是对对象进行初始化,尽量别加无关内容; 5、若用户未定义构造函数,则系统会自动生成一个默认的构 造函数,但函数体是空的。 7

构造函数的重载重载要求:构造函数的参数个数或类型不同例10-2定义一个带重载构造函数的日期类。#includeusingnamespacestd;class Dateintday,month,year;public:Date();构造函数Ⅱ构造函数Date(int,int,int);void init(int,int,int);void print_ymd();void print_mdy(0);3;
8 二、构造函数的重载 重载要求:构造函数的参数个数或类型不同 例10-2 定义一个带重载构造函数的日期类。 #include using namespace std; class Date { int day,month,year; public: Date(); //构造函数 Date(int,int,int); //构造函数 void init(int,int,int); void print_ymd(); void print_mdy(); };

Date:Date()year =1900;month=1;day = 1;Date::Date(int yy, int mm, int dd)init(yy,mm,dd);
9 Date::Date() { year = 1900; month = 1; day = 1; } Date::Date(int yy, int mm, int dd) { init(yy,mm,dd); }