219-10-计算机程序计-1类和对象2(赵老师).ppt_第1页
219-10-计算机程序计-1类和对象2(赵老师).ppt_第2页
219-10-计算机程序计-1类和对象2(赵老师).ppt_第3页
219-10-计算机程序计-1类和对象2(赵老师).ppt_第4页
219-10-计算机程序计-1类和对象2(赵老师).ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、0,计算机程序设计C+ 第10章 类和对象(二),西安交通大学 计算机教学实验中心,1,本章内容,10.1 构造函数 10.2 析构函数 10.3 对象与指针,2,引言,/Example 9-6 日期类 #include using namespace std; class Date int day, month, year; public: void init(int,int,int);/初始化数据成员 void print_ymd(); void print_mdy(); ;,3,void Date:init(int yy, int mm, int dd) month = ( mm = 1

2、 ,4,int main() Date date1,date2; date1.print_ymd(); date1.init(2006,3,28); date1.print_ymd(); date1.print_mdy(); date2.init(2006,13,38); date2.print_ymd(); date2.print_mdy(); return 0; ,5,初始化,变量的初始化: int a; a=10; int a=10; 类的初始化 class Date int day=5, month=5, year=2009; ; /?,6,公有成员的初始化,公有成员的初始化 clas

3、s Date public: int day, month, year; void main() Date d1=5,5,2009; . ,7,有一种在声明对象时初始化数据成员的方法,构造函数 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; ,8,10.1构造函数,构造函数(constructor

4、) 用于对 对象进行初始化的一个或一组函数。 构造函数是特殊的公有成员函数,其特征如下: 1.函数名与类名相同。 2. 无返回类型。 3.在新的对象被建立时,该对象所属的类的构造函数自动被调用。 4.构造函数可以重载。它们由不同的参数表区分。,9,一、对象的初始化和构造函数,例10-1 定义一个带构造函数的日期类。 #include using namespace std; class Date int day,month,year; public: Date();/构造函数 void init(int,int,int);/对数据成员赋值 void print_ymd(); void prin

5、t_mdy(); ;,Date:Date() year = 1900; month = 1; day = 1; ,10,二、构造函数的重载,构造函数重载时,这些构造函数的参数的个数或类型不同 例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(); ;,11,构造函数的重载,D

6、ate:Date() year = 1900; month = 1; day = 1; Date:Date(int yy, int mm, int dd) init(yy,mm,dd); /构造函数调用其他成员函数 ,Date:Date(int yy, int mm, int dd) year = yy; month = mm; day = dd; /合理性? ,12,成员函数,void Date:init(int yy, int mm, int dd) month = ( mm = 1 ,13,主函数,int main() /使用2个不同的重载构造函数创建2个日期类对象 Date date1

7、, date2(2006,3,28); date1.print_ymd(); date2.print_ymd(); date1.init(2006,3,28); date1.print_ymd(); date2.init(2006,4,8); date2.print_ymd(); return 0; ,Date:Date() year = 1900; month = 1; day = 1; Date:Date(int yy, int mm, int dd) init(yy,mm,dd); ,14,三. 构造函数中数据成员的初始化,1在构造函数的函数体中进行初始化。 2在构造函数的头部初始化。

8、3混合初始化 4. 使用默认参数初始化。,15,1. 在构造函数的函数体中初始化,class Person char Name20;int Age;charSex; public: Person() strcpy(Name, XXX); Age = 0; Sex = m; ; 例如, 当遇到声明 Person person1; Person person2;,16,2.在构造函数的头部初始化。,Person:Person(): Age(0),Sex(m) . 在类的声明中 Date():day(1),month(1),year(2011) ; /大括号不能省 其格式为: :():(), (),

9、 , () ,17,3.混合初始化,Person:Person(): Age(0),Sex(m) strcpy(m_strName, “XXX”); ,18,例10-3 构造函数中数据成员初始化的不同方法,#include using namespace std; class Date int day, month, year; public: Date():year(1900), month(1), day(1)/构造函数,无参数,使用参数初始化表 ,demo,19,拷贝构造函数,Date(int yy, int mm=1, int dd=1);/构造函数,3个参数,2个有默认值 Date(

10、 Date ,20,构造函数定义,Date:Date(int yy, int mm, int dd):year(yy), month(mm), day(dd) void Date:print_ymd() cout year - month - day endl;,21,主函数(1),int main() Date date1; /使用?构造函数创建日期类对象 cout date1:; date1.print_ymd(); Date date2(2006); /使用?构造函数创建日期类对象 默认? cout date2:; date2.print_ymd(); Date date3(2006,

11、4); /使用?造函数创建日期类对象 默认?,22,主函数(2),cout date3:; date3.print_ymd(); Date date4(2006, 4, 8); /使用3参数的构造函数创建日期类对象 cout date4:; date4.print_ymd(); Date date5(date4); /使用拷贝构造函数创建日期类对象 cout date5:; date5.print_ymd(); return 0; ,demo,23,使用构造函数的注意事项,(1)构造函数在创建对象时被调用,且只执行一次。 (2)构造函数不能被用户显式调用。 (3)构造函数一般为public类型

12、。 (4)构造函数的作用是初始化数据成员,所以一般为赋值语句。不推荐在构造函数中编写功能程序。 (5)只有在没有定义构造函数的情况下,系统才会自动生成默认的构造函数,但此函数不做任何事情。,24,10.2 析构函数,析构函数(destructor) 当一个对象的生命周期结束时,C+也会自动调用一个函数注销该对象并进行善后工作。 1.析构函数名与类名相同,但在前面加上字符,如CGoods()。 2.析构函数无返回类型。 3. 一个类有一个也只有一个析构函数。 4. 析构函数不带任何参数,因此不能重载,25,例10-4 为类Person增加构造函数和析构函数,#include #include u

13、sing namespace std; class Person char Name20; /姓名 int Age; /年龄 charSex; /性别,26,构造函数和析构函数,public: Person() /构造函数 strcpy(Name, XXX); Age = 0; Sex = m; Person() /析构函数 coutNow destroying the instance of Personendl; void Register(char *name, int age, char sex); void ShowMe(); ;,27,成员函数,void Person: Regis

14、ter(char *name, int age, char sex) strcpy(Name, name); Age = age; Sex = (sex = m?m:f); void Person: ShowMe() cout Name t Age t Sex endl;,28,主函数,int main() Person person1, person2;/对象调用构造函数 cout person1: t; person1.ShowMe(); person1.Register(Zhang3, 19, m); cout person1: t; person1.ShowMe(); cout per

15、son2: t; person2.ShowMe(); person2 = person1;/对象之间的赋值 cout person2: t; person2.ShowMe(); return 0; ,demo,29,10.3 对象与指针,指针的类型? 一、指向对象的指针 1、定义格式: 类名 *指针变量名; 例: Person person1; Person *ptr; ptr=,30,2、动态存储,对象的动态存储动态申请对象 指针变量new 类名(初始化值); delete 指针变量; 例: Person *p=new Person; p-ShowMe(); delete p; 声明对象数组

16、? 动态对象数组?,31,例10-5 使用动态存储实现例10-4程序的功能。,#include #include using namespace std; int main() Person *p1,*p2; /声明两个指向对象的指针 p1=new Person;/动态生成一个Person对象 cout ShowMe(); p1-Register(Zhang3, 19, m); cout ShowMe(); p2=new Person;/动态生成一个Person对象,32,cout ShowMe(); *p2 = *p1; /对象之间的赋值 cout ShowMe(); delete p1;/

17、释放p1指针指向对象所占的空间 delete p2;/释放p2指针指向对象所占的空间 return 0; ,demo,33,二、指向对象成员的指针,1、指向对象数据成员的指针变量的声明与指向普通变量的指针完全一样 例:类Date有公有成员int year Date date1; int *p; p=,34,指向对象成员函数的指针,2、指向对象成员函数的指针变量声明时要指明它所属的类 指向函数的指针: int (*f)(int,int) 指向成员函数的指针 int (Date:*f)(int,int) (1)定义形式:数据类型名(类名:*指针变量名)(参数表) (2)指向成员函数:指针变量名=类

18、名:成员函数名 例:Date date1; void (Date:*p)(int,int,int); /声明指向成员函数的指针 p=Date:init; /指向成员函数 (date1.*p)(2007,4,8); /通过指针使用函数,35,例10-6 编写程序,演示对象指针的使用方法,#include using namespace std; class Date /类的定义 public: int day, month, year; void init(int,int,int); void print_ymd(); ;,36,成员函数,void Date:init(int yy, int m

19、m, int dd) year = yy; month = mm; day = dd; void Date:print_ymd() cout year - month - day endl;,37,主函数,int main() Date date1; Date *p1 = ,38,指向成员函数的指针,void (Date:*p3)(int,int,int); void (Date:*p4)(); p3 = Date:init; p4 = Date:print_ymd; (date1.*p3)(2006,4,8); (date1.*p4)(); return 0; ,demo,39,三、this

20、指针,1、C+中每一个类的成员函数都包含一个指向本类对象的指针 2、指针名为this 3、该指针包含了当前被调用的成员函数所在对象的起始地址。,40,例:class Date int year,month,day; public: Date(int year,int month,int day); print_ymd(); ;,void Date:Date(int year, int month, int day) this-year = year; this-month = month; this-day = day; ,41,例10-8 简单的日期计算 程序功能: 给定的一个日期,计算出增

21、加若干天后的日期。 日期:年、月、日,加X天 ? 根据题目完成的功能,算法设计如下: 定义一个日期类Date,数据成员:year,month,day;适当增加一些成员函数,如 构造函数,初始化函数,输出函数, 日期增加一天的函数, 日期增加任意天的函数, 判断闰年的函数,判断月末的函数等。,程序设计举例,42,class Date int day,month,year; void IncDay();/日期增加一天 public: Date( int y = 1900, int m = 1, int d = 1 );/构造函数 void SetDate( int yy, int mm, int

22、dd );/日期设置 bool IsLeapYear();/ 是否闰年? bool IsEndofMonth();/ 是否月末? void print_ymd();/输出日期yy_mm_dd void print_mdy();/输出日期mm_dd_yy void AddDay(int);/日期增加任意天 ;,日期类Date,43,Date:Date(int y,int m,int d) SetDate(y,m,d); void Date:SetDate( int yy, int mm, int dd ) month = ( mm = 1 ,构造函数,设置日期初值函数,44,switch(mon

23、th) /1,3 5, 7,8, 10 12; 4 6 9 11; 2 case 4: case 6: case 9: case 11: day = ( dd = 1 ,45,void Date:IncDay() if ( IsEndofMonth() if (month = 12) / 年末 day = 1; month = 1; year+; else / 月末 day = 1; month+; else day+; ,void Date:AddDay( int days ) for ( int i = 0; i days; i+ ) IncDay(); ,增加一天成员函数,增加任意天成员

24、函数,46,bool Date:IsEndofMonth() switch(month) case 4: case 6: case 9: case 11: return day = 30; case 2: if (IsLeapYear() return day = 29; else return day = 28; default:return day = 31; ,判断月末成员函数 哪天是月末?,47,int Date:DayCalc() int days; int yy = year - 1900; days = yy*365; if(yy) days += (yy-1)/4; switc

25、h(month) case 12:days = days + 30; case 11:days = days + 31; case 10:days = days + 30; case 9:days = days + 31; case 8:days = days + 31; case 7:days = days + 30; case 6:days = days + 31;,case 5:days = days + 30; case 4:days = days + 31; case 3:if(IsLeapYear() days = days + 29; else days = days + 28;

26、 case 2:days = days + 31; default:break; days = days + day; return days; ,48,int Date:Daysof2Date(Date ymd) int days; days = abs(this-DayCalc()-ymd.DayCalc(); return days; ,两个日期的间隔天数,int Date:Daysof2Date(Date ymd) int days; days = abs(DayCalc()-ymd.DayCalc(); return days; ,49,void Date:print_ymd() c

27、outyear“-”month“-”dayendl; void Date:print_mdy() char *monthName 12 = January,February, March, April, May, June,July, August, September, October,November, December ; cout monthName month-1 day , year endl; ,输出日期成员函数,bool Date:IsleapYear() if(year%400=0)|(year%100!=0 ,判断闰年成员函数,50,int main() Date date1; date1.print_ymd(); date1.print_mdy(); date1.SetDate(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论