第4章 深入類和對象(1)_第1頁
第4章 深入類和對象(1)_第2頁
第4章 深入類和對象(1)_第3頁
第4章 深入類和對象(1)_第4頁
第4章 深入類和對象(1)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第4章章 深入類和對象深入類和對象(I)4.1 構造函數(shù)構造函數(shù)【設置目的】 在建立相應類對象時,對對象進行初始化;在建立相應類對象時,對對象進行初始化;4.1 構造函數(shù)構造函數(shù)class Circleprivate: int x; int y; float fRadius;public: Circle() /構造函數(shù) x=0; y=0; void SetXY(int x,int y); void SetRadius(float r); void Move(int newx,int newy);Circle a;l一種創(chuàng)建對象的特殊的成員函數(shù)l創(chuàng)建一個類的新對象時,自動調(diào)用構造函數(shù),完成初始

2、化工作l 構造函數(shù)的作用:l構造函數(shù)為一個對象分配數(shù)據(jù)成員的存儲空間l 構造函數(shù)初始化一個對象的部分或全體數(shù)據(jù)成員l 構造函數(shù)為類對象請求其他資源class Circleprivate: int x; int y; float fRadius;public: Circle(int xc,int yc) /構造函數(shù) x=xc; y=yc; void SetXY(int x,int y); void SetRadius(float r); void Move(int newx,int newy);Circle a(10,10);class Circleprivate: int x; int y;

3、float fRadius;public: Circle(int xc=0,int yc=0) /構造函數(shù) x=xc; y=yc; void SetXY(int x,int y); void SetRadius(float r); void Move(int newx,int newy);Circle a(10,10);Circle b;4.1 構造函數(shù)構造函數(shù)l對于一些特殊的數(shù)據(jù)成員,如常量成員、引用成員等,不能在構造函數(shù)體內(nèi)用賦值語句初始化(為什么?)l用構造函數(shù)的初始化列表的方式進行初始化 構造函數(shù)名(參數(shù)列表):成員名(表達式)l成員被初始化的次序是成員定義的次序而不是初始化列表中的次

4、序struct structClasspublic: const int a; const int & r; structClass() a=9; /錯誤 r=a; /錯誤 ;struct structClass const int a; const int & r; structClass():a(9),r(a) ;class X int i; int j;public: X(int val):j(val), i(j);4.1 構造函數(shù)構造函數(shù)l創(chuàng)建對象時,自動調(diào)用構造函數(shù)l創(chuàng)建對象的方式:沒有參數(shù) 類名 對象名;僅有一個參數(shù) 類名 對象名參數(shù)值; 類名 對象名(參數(shù)值);有一個或多個參數(shù)

5、類名 對象名(參數(shù)列表);Class Date private: int day,month,year; public: Date(int d,int m,int y) day=d;month=m.year=y; ;Void main() Date today(1,7,2002); Date my_birthday; /錯誤 Date release1(10,12); /錯誤Class Date private: int day,month,year; public: Date() day=1;month=1;year=2010; ;Void main() Date my_birthday;

6、Class Date private: int day,month,year; public: Date(int y) day=1;month=1;year=y; ;Void main() Date today(2010); Date today=2010; Class Date private: int day,month,year; public: Date(int d,int m,int y) day=d;month=m.year=y; ;Void main() Date today(1,7,2002); Date my_birthday; /錯誤 Date release1(10,12

7、); /錯誤重載構造函數(shù)重載構造函數(shù)l提供多個構造函數(shù),用于不同情況下對象的初始化。創(chuàng)建類 X 的對象時,C+會根據(jù)參數(shù)選擇調(diào)用其中一個。構造函數(shù)的重載:參數(shù)列表必須互不相同class X public: X ( ) ; X( int ) ; X ( int, char ) ; X ( float, char ) ; . ; void f ( ) X a ; / 調(diào)用構造函數(shù) X() X b ( 1 ) ; / 調(diào)用構造函數(shù) X(int) X c ( 1, c ) ; / 調(diào)用構造函數(shù) X(int, char) X d ( 2.3 , d ) ; / 調(diào)用構造函數(shù) X(float, char)

8、 . 重載的構造函數(shù)重載的構造函數(shù)問題:如果一個類有一個所有參數(shù)都是缺省參數(shù)的構造函數(shù),能否重載一個不帶任何參數(shù)的構造函數(shù)?class X public: X ( ) ; X( int i = 0 ) ; . ;main ( ) X one(10) ; / 正確 X two ;/ 存在二義性。調(diào)用X:X(),還是調(diào)用X:X(int = 0) ? .不同構造函數(shù)的匹配不同構造函數(shù)的匹配class Tdate public: Tdate(); Tdate(int d); Tdate(int m, int d); Tdate(int m, int d, int y); protected: int

9、month; int day; int year;Tdate : Tdate() month = 10 ; day = 1; year = 2000 ; cout month /” day /” year endl ; Tdate : Tdate ( int d ) month = 10 ; day = d ; year = 2000 ; cout month /” day /” year endl ; Tdate : Tdate ( int m, int d ) month = m ; day = d; year = 2000 ; cout month /” day /” year endl

10、 ; Tdate : Tdate ( int m, int d, int y ) month=m; day=d; year=y; coutmonth/day/yearendl;void main ( ) Tdate aday ; Tdate bday ( 5 ) ; Tdate cday ( 2, 12 ) ; Tdate dday ( 1, 2, 1998 ) ;使使用默認參數(shù)的構造函數(shù)用默認參數(shù)的構造函數(shù)# include class Tdate public: Tdate ( int m=10, int d=1, int y=2000 ) ; protected: int month;

11、int day; int year;Tdate : Tdate ( int m, int d, int y ) month = m; day = d; year = y ; cout month “/” day “/” year endl ;void main() Tdate aday ; Tdate bday ( 5 ) ; Tdate cday ( 2 , 12 ) ; Tdate dday ( 1 , 2 , 1998 ) ;4.1.3 缺省的構造函數(shù)缺省的構造函數(shù)l編譯器自動給用戶定義的沒有定義構造函數(shù)的類生成一個無參數(shù)的構造函數(shù),稱為缺省構造函數(shù)l缺省構造函數(shù)的工作:l類類型成員:運

12、行各自的缺省構造函數(shù)進行初始化l內(nèi)置和復合類型成員:只對全局對象才初始化,當對象定義在局部作用域中時,不進行初始化l如果有常量成員或引用成員,不能使用缺省的構造函數(shù)4.2 析構函數(shù)析構函數(shù)【設置目的】類對象退出作用域時,回收存貯,作善后工作。類對象退出作用域時,回收存貯,作善后工作。4.2 析構函數(shù)析構函數(shù)l沒有返回類型,沒有參數(shù),函數(shù)名是 類名l退出對象作用域時,自動調(diào)用析構函數(shù)釋放對象存儲空間釋放對象所占用的資源l缺省的析構函數(shù):用戶沒有定義析構函數(shù)時,系統(tǒng)自動生成class X public: X() cout“In constructor”endl; X() cout“In destr

13、uctor”0) Table cc; Table dd; 調(diào)用aa的構造函數(shù)調(diào)用bb的構造函數(shù)調(diào)用cc的構造函數(shù)調(diào)用cc的析構函數(shù)調(diào)用dd的構造函數(shù)調(diào)用dd的析構函數(shù)調(diào)用bb的析構函數(shù)調(diào)用aa的析構函數(shù)#include using namespace std; class Teacher private: char * name; public: Teacher(char *input_name) /有參數(shù)的構造函數(shù) name=new char10; name=input_name; /這樣賦值是錯誤的 strcpy(name,input_name); Teacher() delete nam

14、e; void show(); ; void Teacher:show() coutnameendl; void main() Teacher a; /*這里是錯誤的,因為沒有 無參數(shù)的構造函數(shù)*/ Teacher a(test); a.show(); 4.3 拷貝構造函數(shù)拷貝構造函數(shù)l需要用按值傳遞的方式傳遞類對象時,用到拷貝構造函數(shù)創(chuàng)建一個新對象,希望用一個用類型的已存在對象初始化這個新對象時調(diào)用函數(shù)實參形參結合時函數(shù)返回值傳遞給對象時class Point;Point func(Point P) Void mainPoint pt1,pt2(pt1);Point pt3=func(pt1

15、);拷貝構造函數(shù)拷貝構造函數(shù)l是一個構造函數(shù),系統(tǒng)自動調(diào)用l實現(xiàn)用已有對象創(chuàng)建新對象l參數(shù)是對象的引用(為什么?)l缺省的拷貝構造函數(shù),用位拷貝方式將拷貝對象的內(nèi)存一個字節(jié)一個字節(jié)地拷貝給被拷貝的對象Class Point private: int x; int y; public: Point(int intx=0, int inty=0) x=intx; y=inty; Point(const Point & pt) x=pt.x; y=pt.y; ;Point a(10,20);Point b(a); /or Point b=a;Class Point private: int x; i

16、nt y; public: Point(int intx=0, int inty=0) x=intx; y=inty;Point a(10,20);Point b(a); /or Point b=a;拷貝構造函數(shù)拷貝構造函數(shù)l有些對象的傳值,不不能能夠通過簡單的位拷貝實現(xiàn)l禁止拷貝 可以在類內(nèi)聲明一個私有的拷貝構造函數(shù),不必定義 Class aClassprivate: int * p; public: aClass() ;l用已有對象初始化新創(chuàng)建對象class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y

17、= yy ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ;main ( ) Location A ( 1 , 2 ) ; Location B ( A ) ;/調(diào)用缺省構造函數(shù) cout “B:” B.GetX ( ) “,” B.GetY ( ) endl ;l用已有對象初始化新創(chuàng)建對象class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y = yy ; Location ( Location & p ) ; L

18、ocation ( ) cout X “,” Y “ Object destroyed.” endl ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ; ;Location : Location ( Location & p) X = p . X + 2 ; Y = p . Y + 2 ; cout “Copy_constructor called.” endl ; main ( ) Location A ( 1 , 2 ) ; Location B ( A ) ; / 等價于 B ( 3, 4 ) c

19、out “B:” B . GetX ( ) “,” B . GetY ( ) endl ;class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y = yy ;cout“Object constructed”endl; Location ( Location & p ) ; Location ( ) cout X “,” Y “ Object destroyed.” endl ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ; ;Location : Location ( Location & p)/ 拷貝構造函數(shù) X = p.X ; Y = p.Y ; cout “Copy_constructor called.” endl ; void f ( Location p ) cout “Funtion:” p.GetX() “,” p.GetY() endl ; main ( ) Location A ( 1 , 2 ) ; f ( A ) ; 當對象作函數(shù)參數(shù)時,因為要用實參初始化形參,也要調(diào)用拷 貝構造函數(shù)class Location public :

溫馨提示

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

評論

0/150

提交評論