版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
9.1構(gòu)造函數(shù)9.2析構(gòu)函數(shù)9.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序9.4對象數(shù)組9.5對象指針9.6共用數(shù)據(jù)的保護9.7對象的動態(tài)建立和釋放9.8對象的賦值和復制9.9靜態(tài)成員9.10友元9.11類模板本章內(nèi)容提要9.1構(gòu)造函數(shù)9.1.1對象的初始化
在建立一個對象時,常常需要作某些初始化的工作,例如對數(shù)據(jù)成員賦初值。類的數(shù)據(jù)成員是不能在聲明類時初始化的。如果一個類中所有的成員都是公用的,則可以在定義對象時對數(shù)據(jù)成員進行初始化。classTime{public://聲明為公用成員
hour;minute;sec;};Timet1={14,56,30};
//將t1初始化為14:56:30
29.1.2構(gòu)造函數(shù)的作用
C++提供了構(gòu)造函數(shù)(constructor)來處理對象的初始化。構(gòu)造函數(shù)是一種特殊的成員函數(shù),與其他成員函數(shù)不同,不需要用戶來調(diào)用它,而是在建立對象時自動執(zhí)行。構(gòu)造函數(shù)的名字必須與類名同名它不具有任何類型,不返回任何值。39.1.2構(gòu)造函數(shù)的作用例9.1設(shè)計鐘,具有校正和報時功能,在構(gòu)造函數(shù)初始化時間。#include<iostream>usingnamespacestd;classClock//聲明鐘類{public://聲明鐘類構(gòu)造函數(shù),函數(shù)名與類名相同
Clock(void);protected://鐘的時
intnHour;
intnMinute;
intnSecond
;public://校正 voidCheck(void);//報時 voidGiveTheCorrectTime(void);};49.1.2構(gòu)造函數(shù)的作用//校正voidClock::Check(void){ cout<<"校正鐘,輸入時、分和秒:"; cin>>nHour>>nMinute>>nSecond;}//報時voidClock::GiveTheCorrectTime(void){ //按時間格式輸出鐘的時、分和秒的值 cout<<"北京時間"<<nHour<<":"<<nMinute<<":"<<nSecond<<endl;}int_tmain(intargc,_TCHAR*argv[]){ Clockclock;//制造1個鐘clock
clock.GiveTheCorrectTime();//鐘clock報時 clock.Check();//校正鐘clock clock.GiveTheCorrectTime();//鐘clock報時 Clockwatche;//制造1個表watche watche.GiveTheCorrectTime();//表watche報時 watche.Check();//校正表watche watche.GiveTheCorrectTime();//表watche報時 return0;}
//項目:Atimesignalclock9.1.2構(gòu)造函數(shù)的作用程序運行的情況為:北京時間:1:3:8//鐘clock報時168↙
//通過鍵盤校正鐘clock的時間北京時間:1:6:8//鐘clock報時北京時間:1:3:8//鐘watche報時668↙
//通過鍵盤校正表watche的時間北京時間:6:6:8//鐘watche報時構(gòu)造函數(shù)使用說明
在類對象進入其作用域時調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)沒有返回值,因此也不需要在定義構(gòu)造函數(shù)時聲明類型構(gòu)造函數(shù)不需用戶調(diào)用,也不能被用戶調(diào)用一般不提倡在構(gòu)造函數(shù)中加入與初始化無關(guān)的內(nèi)容如果用戶自己沒有定義構(gòu)造函數(shù),則C++系統(tǒng)會自動生成一個構(gòu)造函數(shù),只是這個構(gòu)造函數(shù)的函數(shù)體是空的,也沒有參數(shù),不執(zhí)行初始化操作。89.1.3帶參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)首部的一般格式為構(gòu)造函數(shù)名(類型1形參1,類型2形參2,…)定義對象的一般格式為類名對象名(實參1,實參2,…);99.1.3帶參數(shù)的構(gòu)造函數(shù)例9.2汽車和桌子的長、寬、高分別為:(1)1,3,8;(2)1,6,8。求它們的體積。編一個基于對象的程序,在類中用帶參數(shù)的構(gòu)造函數(shù)。#include<iostream>usingnamespacestd;9.1.3帶參數(shù)的構(gòu)造函數(shù)//聲明長方體類classRectangular{protected:
//長方體的長 doublefLength;
//長方體的寬 doublefWidth;
//長方體的高 doublefHeight;9.1.3帶參數(shù)的構(gòu)造函數(shù)public:
//聲明帶參數(shù)的構(gòu)造函數(shù),
//建立指定長、寬和高的長方體 Rectangular(doublelength,doublewidth,doubleheight);
//聲明求長方體的體積的函數(shù) doubleVolume(void);};//項目:Therectangular9.1.3帶參數(shù)的構(gòu)造函數(shù)//定義帶參數(shù)的構(gòu)造函數(shù),//建立指定長、寬和高的長方體Rectangular::Rectangular(doublelength,doublewidth,doubleheight){ fLength=length; fWidth=width; fHeight=height;}//項目:Therectangular9.1.3帶參數(shù)的構(gòu)造函數(shù)//定義求長方體的體積的函數(shù)doubleRectangular::Volume(void){
returnfLength*fWidth*fHeight;}//項目:Therectangular9.1.3帶參數(shù)的構(gòu)造函數(shù)int_tmain(intargc,_TCHAR*argv[]){
//制造汽車,并指定汽車的長、寬和高分別為1,3,8 RectangularCar(1,3,8);
//輸出汽車的體積 cout<<"汽車的體積為"<<Car.Volume()<<"立方米。"<<endl;
//制作桌子,并指定桌子的長、寬和高分別為1,6,8 RectangularTable(1,6,8);
//輸出桌子的體積 cout<<"桌子的體積為"<<Table.Volume()<<"立方米。"<<endl; return0;}9.1.3帶參數(shù)的構(gòu)造函數(shù)程序運行結(jié)果如下:汽車的體積為24立方米。桌子的體積為48立方米。9.1.3帶參數(shù)的構(gòu)造函數(shù)可以知道:(1)帶參數(shù)的構(gòu)造函數(shù)中的形參,其對應的實參在定義對象時給定。(2)用這種方法可以方便地實現(xiàn)對不同的對象進行不同的初始化。9.1.4用參數(shù)初始化表對數(shù)成員初始化在9.1.3節(jié)中介紹的是在構(gòu)造函數(shù)的函數(shù)體內(nèi)通過賦值語句對數(shù)據(jù)成員實現(xiàn)初始化。//定義帶參數(shù)的構(gòu)造函數(shù),//建立指定長、寬和高的長方體Rectangular::Rectangular(doublelength,doublewidth,doubleheight){ fLength=length; fWidth=width; fHeight=height;}189.1.4參數(shù)初始化表對數(shù)成員初始化C++還提供另一種初始化數(shù)據(jù)成員的方法——參數(shù)初始化表來實現(xiàn)對數(shù)據(jù)成員的初始化。這種方法不在函數(shù)體內(nèi)對數(shù)據(jù)成員初始化,而是在函數(shù)首部實現(xiàn)。例9.2中定義構(gòu)造函數(shù)可以改用以下形式://定義帶參數(shù)的構(gòu)造函數(shù),//建立指定長、寬和高的長方體Rectangular::Rectangular(doublelength,doublewidth,doubleheight):fLength(length),fWidth(width),fHeight(height){}199.1.5構(gòu)造函數(shù)的重載在一個類中可以定義多個構(gòu)造函數(shù),以便對類對象提供不同的初始化的方法,供用戶選用。這些構(gòu)造函數(shù)具有相同的名字,而參數(shù)的個數(shù)或參數(shù)的類型不相同。20構(gòu)造函數(shù)的重載舉例#include<iostream>usingnamespacestd;//聲明長方體類classRectangular{protected: doublefLength;//長方體的長
doublefWidth;
//長方體的寬 doublefHeight;
//長方體的高21構(gòu)造函數(shù)的重載舉例public:
//聲明無參數(shù)的構(gòu)造函數(shù)
Rectangular(void);
//聲明帶參數(shù)的構(gòu)造函數(shù),
//建立指定長、寬和高的長方體 Rectangular(doublelength,doublewidth,doubleheight);
//聲明求長方體的體積的函數(shù) doubleVolume(void);};//項目:Therectangular構(gòu)造函數(shù)的重載舉例//定義無參數(shù)的構(gòu)造函數(shù)Rectangular::Rectangular(void){ fLength=6; fWidth=6; fHeight=8;}//項目:Therectangular構(gòu)造函數(shù)的重載舉例//定義帶參數(shù)的構(gòu)造函數(shù),//建立指定長、寬和高的長方體Rectangular::Rectangular(doublelength,doublewidth,doubleheight):fLength(length),fWidth(width),fHeight(height){}//項目:Therectangular構(gòu)造函數(shù)的重載舉例//定義求長方體的體積的函數(shù)doubleRectangular::Volume(void){
returnfLength*fWidth*fHeight;}//項目:Therectangular構(gòu)造函數(shù)的重載舉例int_tmain(intargc,_TCHAR*argv[]){ //制造汽車,并指定汽車的長、寬和高分別為1,3,8 RectangularCar(1,3,8);
//輸出汽車的體積 cout<<"汽車的體積為"<<Car.Volume()<<"立方米。"<<endl;
//制作桌子,并指定桌子的長、寬和高分別為1,6,8 RectangularTable(1,6,8);
//輸出桌子的體積 cout<<"桌子的體積為"<<Table.Volume()<<"立方米。"<<endl;
//建造房子,不指定房子的長、寬和高 RectangularHouse;
//輸出房子的體積 cout<<"房子的體積為"<<House.Volume()<<"立方米。"<<endl; return0;}構(gòu)造函數(shù)的重載說明無參的構(gòu)造函數(shù)屬于默認構(gòu)造函數(shù)。一個類只能有一個默認構(gòu)造函數(shù)。對于每一個對象來說,建立對象時只執(zhí)行其中一個構(gòu)造函數(shù),279.2析構(gòu)函數(shù)析構(gòu)函數(shù)(destructor)也是一個特殊的成員函數(shù)它的作用與構(gòu)造函數(shù)相反,它的名字是類名的前面加一個“~”符號當對象的生命期結(jié)束時,會自動執(zhí)行析構(gòu)函數(shù)289.2析構(gòu)函數(shù)的執(zhí)行時機自動局部對象釋放前自動執(zhí)行析構(gòu)函數(shù)static局部對象在函數(shù)調(diào)用結(jié)束時對象并不釋放,也不調(diào)用析構(gòu)函數(shù),在main函數(shù)結(jié)束或調(diào)用exit時釋放全局對象,在程序的流程離開其作用域時釋放299.2析構(gòu)函數(shù)的執(zhí)行時機用new運算符動態(tài)地建立對象,用delete運算符釋放該對象時,先調(diào)用該對象的析構(gòu)函數(shù)。注意:析構(gòu)函數(shù)并不是刪除對象,而是在撤銷對象占用的內(nèi)存之前完成一些工作沒有返回及參數(shù),并且不能被重載30析構(gòu)函數(shù)用法舉例#include<iostream>#include<string>usingnamespacestd;classStudent//聲明學生類Student{
public:
//聲明帶2個默認參數(shù)的構(gòu)造函數(shù) Student(intNumber=138168,string
Name="JackDonson"); ~Student(void);
//聲明析構(gòu)函數(shù)
31析構(gòu)函數(shù)用法舉例protected://以下為類中的保護部分
//保護成員變量保存學生的準考證號
intnNumber;
stringstrName;//保護成員變量保存學生姓名public://以下為類中的公用部分
//學生說話
voidSpeak(void);};//類的聲明結(jié)束32析構(gòu)函數(shù)用法舉例//定義帶2個默認參數(shù)的構(gòu)造函數(shù)Student::Student(intNumber,stringName):nNumber(Number),strName(Name){
//輸出信息學生strName入學... cout<<"學生"<<strName<<"入學..."<<endl;}33析構(gòu)函數(shù)用法舉例//定義析構(gòu)函數(shù)Student::~Student(void){
//輸出信息學生strName畢業(yè)... cout<<"學生"<<strName<<"畢業(yè)..."<<endl;}34析構(gòu)函數(shù)用法舉例//學生說話voidStudent::Speak(void){
//輸出提示信息cout<<"Iam"<<strName;cout<<".Mynumberis"<<nNumber<<endl;}35int_tmain(intargc,_TCHAR*argv[]){
//入學2個學生Jack和RoseStudentJack,
Rose(138668,"RoseDonson");
//調(diào)用學生Jack的公共成員函數(shù)SpeackJack.Speak();
//調(diào)用學生Jack的公共成員函數(shù)SpeackRose.Speak(); return0;}//項目:Studentspeacks程序運行結(jié)果如下:學生JackDonson入學…
//執(zhí)行Jack的構(gòu)造函數(shù)學生RoseDonson入學…
//執(zhí)行Rose的構(gòu)造函數(shù)//執(zhí)行Jack的Speaks函數(shù)IamJackDonson.Mynumberis138168//執(zhí)行Rose的Speaks函數(shù)IamRoseDonson.Mynumberis138668學生JackDonson畢業(yè)…
//執(zhí)行Jack的析構(gòu)函數(shù)學生RoseDonson畢業(yè)…
//執(zhí)行Rose的析構(gòu)函數(shù)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序38調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)次序相反先構(gòu)造的后解析;后構(gòu)造的先解析調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序39調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)次序相反先構(gòu)造的后解析;后構(gòu)造的先解析9.4對象數(shù)組對象數(shù)組的每一個元素都是同類對象如果構(gòu)造函數(shù)有多個參數(shù),在定義對象數(shù)組時應當在花括號中分別寫出構(gòu)造函數(shù)并指定實參StudentStudents[3]={//調(diào)用第1個元素的構(gòu)造函數(shù),為它提供3個實參Student(1001,18,87),//調(diào)用第2個元素的構(gòu)造函數(shù),為它提供3個實參Student(1002,19,76),//調(diào)用第3個元素的構(gòu)造函數(shù),為它提供3個實參Student(1003,18,72)};40對象數(shù)組的使用方法#include<iostream>#include<string>usingnamespacestd;//聲明長方體類classRectangular{protected:
stringstrName;//長方體的名稱
//長方體的長
doublefLength;
//長方體的寬
doublefWidth;
//長方體的高
doublefHeight;41public: //聲明帶4個默認參數(shù)的構(gòu)造函數(shù),
//建立指定名稱、長、寬和高的長方體
Rectangular(stringName="Car",doublelength=6,doublewidth=6,doubleheight=8); ~Rectangular(void); //聲明取長方體的名稱的函數(shù)
stringGetName(void); //聲明求長方體的體積的函數(shù)
doubleVolume(void);};//項目:Somerectangulars//定義帶4個默認參數(shù)的構(gòu)造函數(shù),//用參數(shù)的初始化表初始化名稱、長、寬和高Rectangular::Rectangular(stringName,doublelength,doublewidth,doubleheight):strName(Name),fLength(length),fWidth(width),fHeight(height){}//項目:SomerectangularsRectangular::~Rectangular(void){}//定義取長方體的名稱的函數(shù)stringRectangular::GetName(void){
returnstrName;}//定義求長方體的體積的函數(shù)doubleRectangular::Volume(void){
returnfLength*fWidth*fHeight;}int_tmain(intargc,_TCHAR*argv[]){
//制造3部汽車 RectangularCars[3]={Rectangular("奔馳",1,3,8),Rectangular("凱迪拉克",1,6,8),Rectangular("保時捷",6,6,8)};
//輸出3部汽車的名稱和體積 for(intIndex=0;Index<3;Index++) {
cout<<Cars[Index].GetName()<<"的體積為"<<Cars[Index].Volume()<<"立方米。"<<endl; } return0;}
//項目:Somerectangulars9.4對象指針(指向?qū)ο蟮闹羔槪┤绻幸粋€類:classClock//聲明鐘類Clock{
protected:intnHour;intnMinute;intnSecond;public:voidGiveTheCorrectTime();};46指向?qū)ο蟮闹羔榲oidTime∷GiveTheCorrectTime(){cout<<nHour<<":"<<nMinute<<":"<<nSeccond<<endl;}Clockclock;//制作一個鐘clock//聲明pClock為指向鐘的指針變量,//并將鐘clock的地址初始化指針變量pClockClock*pClock=&clock;//這樣,pClock就是指向鐘的指針變量,它指向鐘clock。47指向?qū)ο蟮闹羔樁x指向類對象的指針變量的一般形式為類名*對象指針名[=&同一類的對象名];//可以通過對象指針訪問對象和對象的成員。如*pClock//pClock所指向的對象,即鐘clock//調(diào)用pClock所指向的對象中GiveTheCorrectTime//公共成員函數(shù),即clock.GiveTheCorrectTime(*pClock).GiveTheCorrectTime();//調(diào)用pt所指向的對象中的GiveTheCorrectTime//公共成員函數(shù),即clock.GiveTheCorrectTimepClock->GiveTheCorrectTime();48指向?qū)ο蟮闹羔樁x指向類對象的指針變量的一般形式為類名*對象指針名[=&同一類的對象名];//可以通過對象指針訪問對象和對象的成員。如*pClock//pClock所指向的對象,即鐘clock//調(diào)用pClock所指向的對象中GiveTheCorrectTime//公共成員函數(shù),即clock.GiveTheCorrectTime(*pClock).GiveTheCorrectTime();//調(diào)用pt所指向的對象中的GiveTheCorrectTime//公共成員函數(shù),即clock.GiveTheCorrectTimepClock->GiveTheCorrectTime();49指向?qū)ο髷?shù)據(jù)成員的指針和定義指向普通變量的指針變量方法相同定義指向?qū)ο髷?shù)據(jù)成員的指針變量的一般形式為數(shù)據(jù)類型名*指針變量名;例如:
int*pInteger;//定義指向整型數(shù)據(jù)的指針變量50指向?qū)ο蟪蓡T函數(shù)的指針定義指向普通函數(shù)的指針變量方法:類型名(*指針變量名)(參數(shù)表列)例如:void(*p)(int,int);p=fun;(*p)(a,b);定義指向公用成員函數(shù)的指針變量:數(shù)據(jù)類型名(類名::*指針變量名)(參數(shù)表列);例如:void(Clock∷*pFunction)();pFunction=&Colck::GiveTheCorrectTime;一般形式:指針變量名=&類名∷成員函數(shù)名;51例.有關(guān)對象指針的使用方法。#include<iostream>usingnamespacestd;classClock//聲明鐘類{public:
//聲明有3個默認參數(shù)的鐘類構(gòu)造函數(shù)
Clock(intHour=1,intMinute=3,intSecond=8); ~Clock(void);//項目:Apointeroftimesignalclockprotected:
//鐘的時
intnHour;
//鐘的分
intnMinute;
//鐘的秒
intnSecond;public:
//校正
voidCheck(void);
//報時
voidGiveTheCorrectTime(void);};//項目:Apointeroftimesignalclock//定義有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025車禍私了和解協(xié)議書
- (2024)人造剛玉項目可行性研究報告寫作范本(一)
- 2024秋新滬科版物理八年級上冊課件 第六章 熟悉而陌生的力 第1節(jié) 力及其描述
- 2023年體外循環(huán)管路項目籌資方案
- 平安夜圣誕節(jié)介紹活動方案215
- 電工(初級工)模擬習題含答案
- 山東省棗莊市2023-2024學年七年級上學期期末考試數(shù)學試卷(含解析)
- 養(yǎng)老院老人生活設(shè)施定期檢查制度
- 養(yǎng)老院老人安全教育培訓制度
- 《家庭心理咨詢》課件
- 電纜橋架施工方案
- 吊車吊裝專項施工方案
- 小學生大隊委競選筆試題庫
- TFSRS 2.4-2019“撫松人參”加工技術(shù)規(guī)程 第4部分:生曬參片
- 烤煙種植心得體會
- YY/T 0471.6-2004接觸性創(chuàng)面敷料試驗方法 第6部分:氣味控制
- 工程征地移民實物指標調(diào)查工作程序
- 醫(yī)學英語 皮膚系統(tǒng)Skin#
- GB 22128-2019報廢機動車回收拆解企業(yè)技術(shù)規(guī)范
- 復讀生勵志主題班會
- 2023年復旦大學博士研究生科研計劃書-模板
評論
0/150
提交評論