




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
9.1構造函數9.2析構函數9.3調用構造函數和析構函數的順序9.4對象數組9.5對象指針9.6共用數據的保護9.7對象的動態建立和釋放9.8對象的賦值和復制9.9靜態成員9.10友元9.11類模板本章內容提要9.1構造函數9.1.1對象的初始化
在建立一個對象時,常常需要作某些初始化的工作,例如對數據成員賦初值。類的數據成員是不能在聲明類時初始化的。如果一個類中所有的成員都是公用的,則可以在定義對象時對數據成員進行初始化。classTime{public://聲明為公用成員
hour;minute;sec;};Timet1={14,56,30};
//將t1初始化為14:56:30
29.1.2構造函數的作用
C++提供了構造函數(constructor)來處理對象的初始化。構造函數是一種特殊的成員函數,與其他成員函數不同,不需要用戶來調用它,而是在建立對象時自動執行。構造函數的名字必須與類名同名它不具有任何類型,不返回任何值。39.1.2構造函數的作用例9.1設計鐘,具有校正和報時功能,在構造函數初始化時間。#include<iostream>usingnamespacestd;classClock//聲明鐘類{public://聲明鐘類構造函數,函數名與類名相同
Clock(void);protected://鐘的時
intnHour;
intnMinute;
intnSecond
;public://校正 voidCheck(void);//報時 voidGiveTheCorrectTime(void);};49.1.2構造函數的作用//校正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構造函數的作用程序運行的情況為:北京時間:1:3:8//鐘clock報時168↙
//通過鍵盤校正鐘clock的時間北京時間:1:6:8//鐘clock報時北京時間:1:3:8//鐘watche報時668↙
//通過鍵盤校正表watche的時間北京時間:6:6:8//鐘watche報時構造函數使用說明
在類對象進入其作用域時調用構造函數。構造函數沒有返回值,因此也不需要在定義構造函數時聲明類型構造函數不需用戶調用,也不能被用戶調用一般不提倡在構造函數中加入與初始化無關的內容如果用戶自己沒有定義構造函數,則C++系統會自動生成一個構造函數,只是這個構造函數的函數體是空的,也沒有參數,不執行初始化操作。89.1.3帶參數的構造函數構造函數首部的一般格式為構造函數名(類型1形參1,類型2形參2,…)定義對象的一般格式為類名對象名(實參1,實參2,…);99.1.3帶參數的構造函數例9.2汽車和桌子的長、寬、高分別為:(1)1,3,8;(2)1,6,8。求它們的體積。編一個基于對象的程序,在類中用帶參數的構造函數。#include<iostream>usingnamespacestd;9.1.3帶參數的構造函數//聲明長方體類classRectangular{protected:
//長方體的長 doublefLength;
//長方體的寬 doublefWidth;
//長方體的高 doublefHeight;9.1.3帶參數的構造函數public:
//聲明帶參數的構造函數,
//建立指定長、寬和高的長方體 Rectangular(doublelength,doublewidth,doubleheight);
//聲明求長方體的體積的函數 doubleVolume(void);};//項目:Therectangular9.1.3帶參數的構造函數//定義帶參數的構造函數,//建立指定長、寬和高的長方體Rectangular::Rectangular(doublelength,doublewidth,doubleheight){ fLength=length; fWidth=width; fHeight=height;}//項目:Therectangular9.1.3帶參數的構造函數//定義求長方體的體積的函數doubleRectangular::Volume(void){
returnfLength*fWidth*fHeight;}//項目:Therectangular9.1.3帶參數的構造函數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帶參數的構造函數程序運行結果如下:汽車的體積為24立方米。桌子的體積為48立方米。9.1.3帶參數的構造函數可以知道:(1)帶參數的構造函數中的形參,其對應的實參在定義對象時給定。(2)用這種方法可以方便地實現對不同的對象進行不同的初始化。9.1.4用參數初始化表對數成員初始化在9.1.3節中介紹的是在構造函數的函數體內通過賦值語句對數據成員實現初始化。//定義帶參數的構造函數,//建立指定長、寬和高的長方體Rectangular::Rectangular(doublelength,doublewidth,doubleheight){ fLength=length; fWidth=width; fHeight=height;}189.1.4參數初始化表對數成員初始化C++還提供另一種初始化數據成員的方法——參數初始化表來實現對數據成員的初始化。這種方法不在函數體內對數據成員初始化,而是在函數首部實現。例9.2中定義構造函數可以改用以下形式://定義帶參數的構造函數,//建立指定長、寬和高的長方體Rectangular::Rectangular(doublelength,doublewidth,doubleheight):fLength(length),fWidth(width),fHeight(height){}199.1.5構造函數的重載在一個類中可以定義多個構造函數,以便對類對象提供不同的初始化的方法,供用戶選用。這些構造函數具有相同的名字,而參數的個數或參數的類型不相同。20構造函數的重載舉例#include<iostream>usingnamespacestd;//聲明長方體類classRectangular{protected: doublefLength;//長方體的長
doublefWidth;
//長方體的寬 doublefHeight;
//長方體的高21構造函數的重載舉例public:
//聲明無參數的構造函數
Rectangular(void);
//聲明帶參數的構造函數,
//建立指定長、寬和高的長方體 Rectangular(doublelength,doublewidth,doubleheight);
//聲明求長方體的體積的函數 doubleVolume(void);};//項目:Therectangular構造函數的重載舉例//定義無參數的構造函數Rectangular::Rectangular(void){ fLength=6; fWidth=6; fHeight=8;}//項目:Therectangular構造函數的重載舉例//定義帶參數的構造函數,//建立指定長、寬和高的長方體Rectangular::Rectangular(doublelength,doublewidth,doubleheight):fLength(length),fWidth(width),fHeight(height){}//項目:Therectangular構造函數的重載舉例//定義求長方體的體積的函數doubleRectangular::Volume(void){
returnfLength*fWidth*fHeight;}//項目:Therectangular構造函數的重載舉例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;}構造函數的重載說明無參的構造函數屬于默認構造函數。一個類只能有一個默認構造函數。對于每一個對象來說,建立對象時只執行其中一個構造函數,279.2析構函數析構函數(destructor)也是一個特殊的成員函數它的作用與構造函數相反,它的名字是類名的前面加一個“~”符號當對象的生命期結束時,會自動執行析構函數289.2析構函數的執行時機自動局部對象釋放前自動執行析構函數static局部對象在函數調用結束時對象并不釋放,也不調用析構函數,在main函數結束或調用exit時釋放全局對象,在程序的流程離開其作用域時釋放299.2析構函數的執行時機用new運算符動態地建立對象,用delete運算符釋放該對象時,先調用該對象的析構函數。注意:析構函數并不是刪除對象,而是在撤銷對象占用的內存之前完成一些工作沒有返回及參數,并且不能被重載30析構函數用法舉例#include<iostream>#include<string>usingnamespacestd;classStudent//聲明學生類Student{
public:
//聲明帶2個默認參數的構造函數 Student(intNumber=138168,string
Name="JackDonson"); ~Student(void);
//聲明析構函數
31析構函數用法舉例protected://以下為類中的保護部分
//保護成員變量保存學生的準考證號
intnNumber;
stringstrName;//保護成員變量保存學生姓名public://以下為類中的公用部分
//學生說話
voidSpeak(void);};//類的聲明結束32析構函數用法舉例//定義帶2個默認參數的構造函數Student::Student(intNumber,stringName):nNumber(Number),strName(Name){
//輸出信息學生strName入學... cout<<"學生"<<strName<<"入學..."<<endl;}33析構函數用法舉例//定義析構函數Student::~Student(void){
//輸出信息學生strName畢業... cout<<"學生"<<strName<<"畢業..."<<endl;}34析構函數用法舉例//學生說話voidStudent::Speak(void){
//輸出提示信息cout<<"Iam"<<strName;cout<<".Mynumberis"<<nNumber<<endl;}35int_tmain(intargc,_TCHAR*argv[]){
//入學2個學生Jack和RoseStudentJack,
Rose(138668,"RoseDonson");
//調用學生Jack的公共成員函數SpeackJack.Speak();
//調用學生Jack的公共成員函數SpeackRose.Speak(); return0;}//項目:Studentspeacks程序運行結果如下:學生JackDonson入學…
//執行Jack的構造函數學生RoseDonson入學…
//執行Rose的構造函數//執行Jack的Speaks函數IamJackDonson.Mynumberis138168//執行Rose的Speaks函數IamRoseDonson.Mynumberis138668學生JackDonson畢業…
//執行Jack的析構函數學生RoseDonson畢業…
//執行Rose的析構函數調用構造函數和析構函數的順序38調用析構函數的次序正好與調用構造函數次序相反先構造的后解析;后構造的先解析調用構造函數和析構函數的順序39調用析構函數的次序正好與調用構造函數次序相反先構造的后解析;后構造的先解析9.4對象數組對象數組的每一個元素都是同類對象如果構造函數有多個參數,在定義對象數組時應當在花括號中分別寫出構造函數并指定實參StudentStudents[3]={//調用第1個元素的構造函數,為它提供3個實參Student(1001,18,87),//調用第2個元素的構造函數,為它提供3個實參Student(1002,19,76),//調用第3個元素的構造函數,為它提供3個實參Student(1003,18,72)};40對象數組的使用方法#include<iostream>#include<string>usingnamespacestd;//聲明長方體類classRectangular{protected:
stringstrName;//長方體的名稱
//長方體的長
doublefLength;
//長方體的寬
doublefWidth;
//長方體的高
doublefHeight;41public: //聲明帶4個默認參數的構造函數,
//建立指定名稱、長、寬和高的長方體
Rectangular(stringName="Car",doublelength=6,doublewidth=6,doubleheight=8); ~Rectangular(void); //聲明取長方體的名稱的函數
stringGetName(void); //聲明求長方體的體積的函數
doubleVolume(void);};//項目:Somerectangulars//定義帶4個默認參數的構造函數,//用參數的初始化表初始化名稱、長、寬和高Rectangular::Rectangular(stringName,doublelength,doublewidth,doubleheight):strName(Name),fLength(length),fWidth(width),fHeight(height){}//項目:SomerectangularsRectangular::~Rectangular(void){}//定義取長方體的名稱的函數stringRectangular::GetName(void){
returnstrName;}//定義求長方體的體積的函數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對象指針(指向對象的指針)如果有一個類:classClock//聲明鐘類Clock{
protected:intnHour;intnMinute;intnSecond;public:voidGiveTheCorrectTime();};46指向對象的指針voidTime∷GiveTheCorrectTime(){cout<<nHour<<":"<<nMinute<<":"<<nSeccond<<endl;}Clockclock;//制作一個鐘clock//聲明pClock為指向鐘的指針變量,//并將鐘clock的地址初始化指針變量pClockClock*pClock=&clock;//這樣,pClock就是指向鐘的指針變量,它指向鐘clock。47指向對象的指針定義指向類對象的指針變量的一般形式為類名*對象指針名[=&同一類的對象名];//可以通過對象指針訪問對象和對象的成員。如*pClock//pClock所指向的對象,即鐘clock//調用pClock所指向的對象中GiveTheCorrectTime//公共成員函數,即clock.GiveTheCorrectTime(*pClock).GiveTheCorrectTime();//調用pt所指向的對象中的GiveTheCorrectTime//公共成員函數,即clock.GiveTheCorrectTimepClock->GiveTheCorrectTime();48指向對象的指針定義指向類對象的指針變量的一般形式為類名*對象指針名[=&同一類的對象名];//可以通過對象指針訪問對象和對象的成員。如*pClock//pClock所指向的對象,即鐘clock//調用pClock所指向的對象中GiveTheCorrectTime//公共成員函數,即clock.GiveTheCorrectTime(*pClock).GiveTheCorrectTime();//調用pt所指向的對象中的GiveTheCorrectTime//公共成員函數,即clock.GiveTheCorrectTimepClock->GiveTheCorrectTime();49指向對象數據成員的指針和定義指向普通變量的指針變量方法相同定義指向對象數據成員的指針變量的一般形式為數據類型名*指針變量名;例如:
int*pInteger;//定義指向整型數據的指針變量50指向對象成員函數的指針定義指向普通函數的指針變量方法:類型名(*指針變量名)(參數表列)例如:void(*p)(int,int);p=fun;(*p)(a,b);定義指向公用成員函數的指針變量:數據類型名(類名::*指針變量名)(參數表列);例如:void(Clock∷*pFunction)();pFunction=&Colck::GiveTheCorrectTime;一般形式:指針變量名=&類名∷成員函數名;51例.有關對象指針的使用方法。#include<iostream>usingnamespacestd;classClock//聲明鐘類{public:
//聲明有3個默認參數的鐘類構造函數
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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 輪胎行業可持續發展戰略考核試卷
- 南陽市桐柏縣2025年八年級《語文》上學期期末試題與參考答案
- 計算機二級Web考試重點難點試題及答案
- 2025年中國鋇鎘鋅穩定劑行業市場前景預測及投資價值評估分析報告
- 數字科技企業數據總監數據挖掘與分析聘用協議
- 抖音平臺賬號運營權分割與內容創作合作協議
- 2025年中國薄膜位置傳感器行業市場規模調研及投資前景研究分析報告
- 離婚房產稅費均攤及過戶實施合同
- 2025年中國棒球護具行業市場規模調研及投資前景研究分析報告
- 2025年中國鈑金模具行業市場前景預測及投資價值評估分析報告
- 幼兒園大班科學《痕跡》
- 靜脈用藥安全輸注藥護專家指引
- DB61T1755-2023放心消費示范創建認定與管理規范
- 企業借款申請書
- 乙醇管施工方案
- 項目七 信息素養與社會責任
- 電氣施工安全技術交底記錄范本
- 說課稿【全國一等獎】
- 急性扁桃體炎臨床診療指南
- 第七講 社會主義現代化建設的教育科技人才戰略PPT習概論2023優化版教學課件
- 室間質評記錄表
評論
0/150
提交評論