c程序設(shè)計教程羅建軍 22080-00ch10_第1頁
c程序設(shè)計教程羅建軍 22080-00ch10_第2頁
c程序設(shè)計教程羅建軍 22080-00ch10_第3頁
c程序設(shè)計教程羅建軍 22080-00ch10_第4頁
c程序設(shè)計教程羅建軍 22080-00ch10_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、國家級精品課程網(wǎng)站(本書配套教學(xué)網(wǎng)站)第10章類和對象(二)10.1 構(gòu)造函數(shù)10.2 析構(gòu)函數(shù)10.3 對象與指針5310.1 構(gòu)造函數(shù)構(gòu)造函數(shù)(constructor)用于對對象進(jìn)行初始化的一個或一組函數(shù)。構(gòu)造函數(shù)是特殊的公有成員函數(shù),其特征如下:1. 函數(shù)名與類名相同。2. 構(gòu)造函數(shù)無函數(shù)返回類型說明。3. 在新的對象被建立時,該對象所屬的類的構(gòu)造函數(shù)自動被調(diào)用。4. 構(gòu)造函數(shù)可以重載。它們由不同的參數(shù)表區(qū)分。一、對象的初始化和構(gòu)造函數(shù)例10-1 定義一個帶構(gòu)造函數(shù)的日期類。#include using namespace std

2、; class Dateint day,month,year;public:Date();/構(gòu)造函數(shù)void init(int,int,int);/對數(shù)據(jù)成員賦值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 en

3、dl; void Date:print_mdy()cout month - day - year endl;int main()Date date1, date2;/創(chuàng)建2個日期類對象date1.print_ymd();/輸出使用init賦值前對象的內(nèi)容date2.print_ymd();date1.init(2006, 3, 28);/正確的賦值數(shù)據(jù)date1.print_ymd();date1.print_mdy();date2.init(2006,13,38);/錯誤的賦值數(shù)據(jù)date2.print_ymd();date2.print_mdy(); return 0;二、構(gòu)造函數(shù)的重載構(gòu)

4、造函數(shù)重載時,這些構(gòu)造函數(shù)的參數(shù)的個數(shù)或類型不同例10-2 定義一個帶重載構(gòu)造函數(shù)的日期類。#include using namespace std; class Dateint day,month,year; public:Date();/構(gòu)造函數(shù)Date(int,int,int);/構(gòu)造函數(shù)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);void

5、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()/使用2個不同的重載構(gòu)造函數(shù)創(chuàng)建2個日期類對象Date date1, date2(2006,3,28);date1.print_ymd(); date2.print_ymd(); date1.i

6、nit(2006,3,28); date1.print_ymd(); date2.init(2006,4,8); date2.print_ymd(); return 0;三. 數(shù)據(jù)成員的初始化1. 在構(gòu)造函數(shù)的函數(shù)體中進(jìn)行初始化。2. 在構(gòu)造函數(shù)的頭部初始化。3. 混合初始化4. 使用默認(rèn)參數(shù)初始化。1. 在構(gòu)造函數(shù)的函數(shù)體中初始化class Personchar public:Person()Name20;intAge;charSex;strcpy(Name, XXX);Age = 0;Sex = m;例如, 當(dāng)遇到聲明Person personl;Person person2;2. 在構(gòu)造

7、函數(shù)的頭部初始化。其格式為::():(), , ()例如Person:Person(): Age(0),Sex(m)3. 混合初始化。例如Person:Person(): Age(0),Sex(m)strcpy(m_strName, “XXX”);例10-3構(gòu)造函數(shù)中數(shù)據(jù)成員初始化的不同方法#include using namespace std; class Dateint day, month, year; public:Date():year(1900), month(1), day(1)/構(gòu)造函數(shù), 無參數(shù),使用參數(shù)初始化表Date(int yy, int mm=1, int dd=1

8、);/構(gòu)造函數(shù),3個參數(shù),2個有默認(rèn)值Date(Date& d)/拷貝構(gòu)造函數(shù)year = d.year;month = d.month; day = d.day;void print_ymd();Date:Date(int yy, int mm, int dd):year(yy), month(mm), day(dd) void Date:print_ymd()cout year - month - day endl;int main()Date date1;/使用無參數(shù)的構(gòu)造函數(shù)創(chuàng)建日期類對象cout date1:;date1.print_ymd();Date date2(2006);/使

9、用3參數(shù)的構(gòu)造函數(shù)創(chuàng)建日期類對象,2個默認(rèn)值cout date2:;date2.print_ymd();Date date3(2006, 4);/使用3參數(shù)的構(gòu)造函數(shù)創(chuàng)建日期類對象,1個默認(rèn)值cout date3:;date3.print_ymd();Date date4(2006, 4, 8);/使用3參數(shù)的構(gòu)造函數(shù)創(chuàng)建日期類對象cout date4:;date4.print_ymd();Date date5(date4);/使用拷貝構(gòu)造函數(shù)創(chuàng)建日期類對象cout date5:;date5.print_ymd(); return 0;10.2 析構(gòu)函數(shù)析構(gòu)函數(shù)(destructor)當(dāng)一個對

10、象的生命周期結(jié)束時,C+也會自動調(diào)用一個函數(shù)注銷該對象并進(jìn)行善后工作。1. 構(gòu)函數(shù)名與類名相同,但在前面加上字符,如CGoods()。2. 析構(gòu)函數(shù)無函數(shù)返回類型。3. 一個類有一個也只有一個析構(gòu)函數(shù)。4. 析構(gòu)函數(shù)不帶任何參數(shù),因此不能重載例10-4為類Person增加構(gòu)造函數(shù)和析構(gòu)函數(shù)#include #include using namespace std; class Personchar int charName20; Age;Sex;public:Person()/構(gòu)造函數(shù)strcpy(Name, XXX);Age = 0; Sex = m;Person()/析構(gòu)函數(shù)coutNow

11、 destroying the instance of Personendl;void void;Register(char *name, int age, char sex); ShowMe();void Person: Register(char *name, int age, char sex)strcpy(Name, name);Age = Sex =age;(sex = m?m:f);void Person: ShowMe()cout Name t Age t Sex endl;int main()Person person1, person2;/對象調(diào)用構(gòu)造函數(shù)cout perso

12、n1: t;person1.ShowMe(); person1.Register(Zhang3, 19, m); cout person1: t; person1.ShowMe();cout person2: t; person2.ShowMe();person2 = person1;/對象之間的賦值cout ShowMe();2、動態(tài)存儲指針變量new 名字(名字初始化值);delete指針變量;例: Person *p=new Person;p-ShowMe();delete p;例10-5使用動態(tài)存儲實現(xiàn)例10-4程序的功能。#include #include using namespa

13、ce std; int main()Person *p1,*p2;/聲明兩個指向?qū)ο蟮闹羔榩1=new Person;/動態(tài)生成一個Person對象cout ShowMe();p1-Register(Zhang3, 19, m); cout ShowMe();p2=new Person;/動態(tài)生成一個Person對象cout ShowMe();*p2 = *p1;/對象之間的賦值cout ShowMe();delete p1;/釋放p1指針指向?qū)ο笏嫉目臻gdelete p2;/釋放p2指針指向?qū)ο笏嫉目臻greturn 0;二、指向?qū)ο蟪蓡T的指針1、指向?qū)ο髷?shù)據(jù)成員的指針變量的聲明與指向普通

14、變量的指針完全一樣例:Date date1;int *p; p=&date1.year;*p=2007;2、指向?qū)ο蟪蓡T函數(shù)的指針變量聲明時要指明它所屬的類(1) 定義形式數(shù)據(jù)類型名(類名:*指針變量名)(參數(shù)表)(2) 指向成員函數(shù)指針變量名=類名:成員函數(shù)名例:Date date1;void (Date:*p)(int,int,int); p=Date:init; (date1.*p)(2007,4,8);例10-6編寫程序,演示對象指針的使用方法#include using namespace std; class Datepublic:int day, month, year; voi

15、d init(int,int,int); void print_ymd();void Date:init(int yy, int mm, int dd)year = yy;month = mm; day = dd;void Date:print_ymd()cout year - month - day init(2006,3,28);p1-print_ymd(); int * p2;p2 = &date1.year;/指向?qū)ο髷?shù)據(jù)成員的指針cout *p2 endl;void (Date:*p3)(int,int,int);/指向?qū)ο蟪蓡T函數(shù)的指針void (Date:*p4)();/指向?qū)ο?/p>

16、成員函數(shù)的指針p3 = Date:init;p4 = Date:print_ymd; (date1.*p3)(2006,4,8);(date1.*p4)(); return 0;三、this指針1、C+中每一個類的成員函數(shù)都包含一個指向本類對象的指針2、指針名為this3、該指針包含了當(dāng)前被調(diào)用的成員函數(shù)所在對象的起始地址。例10-7 編寫程序,演示this指針的使用。/ Example10-7 使用this指針#include class Testint x; public:Test( int = 0 ); void print();Test:Test( int a ) x = a; / 構(gòu)

17、造函數(shù)void Test:print()cout x = x x = x n(*this).x = ( *this ).x endl;int main()Test testObject( 12 ); testObject.print(); return 0;自學(xué)內(nèi)容例10-8擴(kuò)充例9-6的功能,使其能進(jìn)行簡單的日期計算。#include #includeusing namespace std; class Dateint day, month, year;void IncDay();/日期增加一天int DayCalc();/距基準(zhǔn)日期的天數(shù)public:Date( int y = 1900,

18、 int m = 1, int d = 1 ); /構(gòu)造函數(shù)void SetDate( int yy, int mm, int dd );/日期設(shè)置bool IsLeapYear();/ 是否閏年?bool IsEndofMonth();/是否月末?void print_ymd();/輸出日期yy_mm_ddvoid print_mdy();/輸出日期mm_dd_yyvoid AddDay(int);/日期增加任意天int Daysof2Date(Date ymd);/兩個日期之間的天數(shù);Date:Date(int y,int m,int d)SetDate(y,m,d);void Date:

19、SetDate( int yy, int mm, int dd )month = ( mm = 1 & mm = 1900 & yy = 1 & dd = 1 & dd = 1 & dd = 1 & dd = 31 ) ? dd : 1;void Date:AddDay( int days )for ( int i = 0; i days; i+ ) IncDay();bool Date:IsLeapYear()if ( year % 400 = 0 | ( year % 100 != 0 & year % 4 = 0 ) )return true;/ 閏年elsereturn false;/

20、 不是閏年bool Date:IsEndofMonth()switch(month)/每月的最后一天為月末case 4:case 6:case 9:case 11:case 2:return day = 30;if (IsLeapYear()return day = 29; else return day = 28;default:return day = 31;void Date:IncDay()if ( IsEndofMonth()if (month = 12)/ 年末day = 1;month = 1; year+;else / 月末day = 1;month+; else day+;v

21、oid Date:print_ymd()cout year - month - day endl; void Date:print_mdy()char *monthName 12 = January,February, March,April, May, June,July, August, September, October,November, December ;cout endl;monthName month-1 day , year int Date:DayCalc()int days;int yy = year - 1900;days = yy*365;/不計閏年的天數(shù)if(yy) days += (yy-1)/4;/每逢閏年增加一天switch(month)/當(dāng)前日期已過去月份的天數(shù)case 12:days = days + 30; case 11:days = days + 31;case 10:days = days + 30;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論