版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年桂林師范高等專科學(xué)校單招職業(yè)技能考試參考題庫含詳細(xì)答案解析
- 2026年新疆建設(shè)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細(xì)解析
- 2026年包頭職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題及答案詳細(xì)解析
- 2026貴州醫(yī)科大學(xué)第三附屬醫(yī)院招聘10人考試重點試題及答案解析
- 2026年安慶醫(yī)藥高等??茖W(xué)校高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細(xì)解析
- 2026年青島濱海學(xué)院單招綜合素質(zhì)筆試模擬試題含詳細(xì)答案解析
- 2026年廣西水利電力職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試參考題庫含詳細(xì)答案解析
- 2026年云南錫業(yè)職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試備考題庫含詳細(xì)答案解析
- 2026年浙江工業(yè)職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試參考題庫含詳細(xì)答案解析
- 2026年包頭職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試模擬試題含詳細(xì)答案解析
- 裝修工程施工質(zhì)量檢查標(biāo)準(zhǔn)
- 供銷大集:中國供銷商貿(mào)流通集團(tuán)有限公司擬對威海集采集配商貿(mào)物流有限責(zé)任公司增資擴(kuò)股所涉及的威海集采集配商貿(mào)物流有限責(zé)任公司股東全部權(quán)益價值資產(chǎn)評估報告
- 干細(xì)胞臨床研究:知情同意的倫理審查要點
- 檢測實驗室安全管理與操作規(guī)程
- 2025云南保山電力股份有限公司招聘(100人)筆試歷年參考題庫附帶答案詳解
- (新教材)2026年人教版八年級下冊數(shù)學(xué) 21.1 四邊形及多邊形 課件
- 教師職業(yè)行為規(guī)范手冊
- 急性胸痛患者的快速識別與護(hù)理配合
- 法律研究與實踐
- 《智能物聯(lián)網(wǎng)技術(shù)與應(yīng)用》課件 第八章 數(shù)字孿生技術(shù)
- 單招第四大類考試試題及答案
評論
0/150
提交評論