構造析構的調用順序_第1頁
構造析構的調用順序_第2頁
構造析構的調用順序_第3頁
構造析構的調用順序_第4頁
構造析構的調用順序_第5頁
已閱讀5頁,還剩17頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

0/44Review構造析構的調用順序對象數組—注意只含帶參構造函數的情況對象指針、對象數據成員指針、對象成員函數指針、this共用數據的保護常數據成員常對象:都是常數據、不能調用非常成員函數常成員函數1/44Content3.6共用數據的保護常指針常引用3.7對象的動態建立和釋放3.8對象的賦值與復制2/44Content3.6共用數據的保護常指針常引用3.7對象的動態建立和釋放3.8對象的賦值與復制3/443.6共用數據的保護5、指向對象的常指針什么時候需要常指針讓其指向對象?

特點:指向始終不變但指向的內容可變定義一個指向對象的常指針的格式為:

?類名*?指針變量名

=對象地址;

Time*constt=newTime;

t=newTime;6、指向常對象的指針定義指向常對象的指針格式:const類名*指針名;特點:指向可變但指向的內容不可變const

Timeconst*t=newTime;

t=newTime;t->settime(1,2,3);4/443.6共用數據的保護如果一個對象被聲明為常對象,只能用指向常對象的指針指向它。如:constTimet1(12,22,32);//常對象

Time*pt=&t1;//如何定義該指針指向常對象的指針如果指向了非const對象如:Timet2(13,23,34);//非常對象

constTime*pt=&t2;pt->hour=11;t2.hour=11;7、指向常對象的常指針

如何寫?

constTime*pt=&t1;其指向的對象值不能用指針改變,可以用非指針方式改變。5/443.6共用數據的保護當對象指針做形參時,需注意:形參實參是否合法指針所指變量值能否改變非const對象的指針非const對象的地址合法可以const對象的地址非法/常對象的指針非const對象的地址合法不可以const對象的地址合法不可以6/443.6共用數據的保護指向常對象的指針最常用于函數的形參,目的是保護形參指針所指的對象不被修改。例7/44Content3.6共用數據的保護常指針常引用3.7對象的動態建立和釋放3.8對象的賦值與復制8/443.6共用數據的保護對象的常引用 如果不希望在函數中修改參數,可以把引用型形參定義成const型: 函數返回類型函數名(const形參類型

&形參名);

什么時候使用常指針和常引用?想保證數據安全,不被修改;想不必建立實參的拷貝,提高程序效率,節省內存。9/443.6共用數據的保護const數據小結

形式含義Timeconstt1;constTimet1;t1是常對象,其值在任何情況下不能改變voidTime::func()constfunc是Time類中的常成員函數,可以引用,但不能修改本類中的數據成員Time*constp;p是指向Time對象的常指針,p的值,即p的指向不能改變ConstTime*p;p是指向Time類常對象的指針,其指向的對象的值不能通過指針來改變constTime&t1=t;t1是Time類對象t的常引用,函數中不能改變實參值10/44Content3.6共用數據的保護常指針常引用3.7對象的動態建立和釋放3.8對象的賦值與復制11/443.7對象的動態建立和釋放1、為什么要動態建立和釋放對象(前述、實際、語言)2、動態建立對象的方法設存在Box類,則

newBox;即為建立一個動態對象開辟內存空間-運行構造函數-返回指向該對象的地址

Box*pt;pt=newBox;cout<<pt->height<<endl;

說明:new動態創建的對象,一般只能通過指針訪問

注意:內存不足,創建失敗的情況(返回0)“無名對象”

12/443.7對象的動態建立和釋放3、動態撤消對象的方法:

deletept;//只是釋放內存并不銷毀指針思考:在執行delete運算符時,在釋放空間之前,系統會調用什么函數,完成清理工作。注意:動態撤銷對象指針數組時,要有[]Box*pt=newBox[3];delete[]pt;13/44Content3.6共用數據的保護常指針常引用3.7對象的動態建立和釋放3.8對象的賦值與復制14/443.8對象的賦值與復制在C語言中,可以用已定義的變量初始化同類型變量。如:

inta=5;intb=a;在C++中,也可用已定義的對象初始化同類對象。如:例

TDated1(2,10,1997);TDated2(d1);

也可以寫做:

TDated1(2,10,1997);TDated2=d1;用一個對象初始化另一個對象,通常意味著數據成員的逐個復制。復制TDated1(2,10,1997),d3(3,23,2010);Dated2=d1;…..d2=d3;賦值15/443.8對象的賦值與復制根據已有對象構造新的對象C++中提供了拷貝構造函數的機制:特殊的構造函數:帶有一個參數,參數為本類的對象且參數采用常引用方式

作用是將實參對象的各個數據成員值一一賦予給新的對象中對應的數據成員。16/443.8對象的賦值與復制

1.拷貝構造函數定義的一般形式//自定義

類名::函數名(類名&對象名){//函數名

//拷貝構造函數的函數體

}classT{

inta;public:

T(){a=0;}

... };T(T&t);//拷貝構造函數T::T(T&t){a=t.a;}1、是構造函數,函數名與類名相同,且無返回值;2、函數只有一個參數,且是同類對象的引用;3、每個類必須有一個拷貝構造,若無顯示定義,則系統自動添加。17/443.8對象的賦值與復制執行classTDate{public: TDate(int,int,int);

voidshowDate();private: intyear; intmonth; intday;};TDate(TDate&);TDate::TDate(inty,intm,intd):year(y),month(m),day(d){}TDate::TDate(TDate&td){

}year=td.year;month=td.month;day=td.day;思考:用拷貝構造函數創建出的對象在釋放時是否會執行析構函數18/443.8對象的賦值與復制在下列情況下,會自動調用拷貝構造函數:

a)用一個已經存在的對象初始化一個新創建的同類對象。

TDatet1(1,2,3);TDatet2(t1);b)對象作為函數參數,采用傳值調用時

voidfunc(TDatet1,TDatet2);func(t1,t2);c)某個函數的返回值是一個對象,也要創建對象副本,此時也需要自動調用拷貝構造函數。例子19/443.8對象的賦值與復制默認拷貝構造函數如果沒有為類定義拷貝構造函數,編譯程序會自動定義默認拷貝構造函數。默認拷貝構造:語義是(數據)成員逐個依次拷貝。TDate::TDate(TDate&td){year=td.year;month=td.month;day=td.day;}思考:既然默認拷貝構造函數,已經可以實現數據成員的復制,為什么還要自定義呢?20/443.8對象的賦值與復制在某些情況下,默認拷貝構造函數會引發錯誤。例子例:

若類中有指針成員,且該指針指向了一片動態分配的存儲空間classPerson{public:Person(char*);~Person();protected:

char*pName;};Person::Person(char*pn){

pName=newchar[strlen(pn)+1];if(pName!=NULL)

溫馨提示

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

評論

0/150

提交評論