面向對象程序設計語言C第章深入類與對象ppt課件_第1頁
面向對象程序設計語言C第章深入類與對象ppt課件_第2頁
面向對象程序設計語言C第章深入類與對象ppt課件_第3頁
面向對象程序設計語言C第章深入類與對象ppt課件_第4頁
面向對象程序設計語言C第章深入類與對象ppt課件_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、面向對象程序設計語言C+電子科技大學計算機學院1第四章 深入類和對象 4.1 構造函數 4.1.1 構造函數的作用 class Date int day, month, year; public: void InitDate(int d, int m, int y); /初始化? ; 程序員有的時候會忘記了調用初始化函數 或者調用了多次。這都是不好的現象。 2第四章 深入類和對象4.1 構造函數4.1.1 構造函數的作用 C+為類設計了構造函數(constructor)機制,它可以達到初始化數據成員的目的。 類的構造函數是類的一個特殊成員函數,它沒有返回類型void也不行),可以有參數,函數名

2、和類名一樣。 當創(chuàng)建類的一個新對象時,自動調用構造函數,完成初始化工作需要注意構造函數是否有參數,以及參數的個數、類型)。3第四章 深入類和對象4.1 構造函數4.1.1 構造函數的作用構造函數的作用為:分配一個對象的數據成員的存儲空間; (該功能由系統(tǒng)自動完成。)(2) 執(zhí)行構造函數(體),一般是初始化一個對象的部分或全體數據成員。4第四章 深入類和對象 4.1 構造函數 4.1.2 構造函數的定義 1. 構造函數的定義 class Date private: int year, month, day; public:Date(int y, int m, int d); /其它成員 ; 構造

3、函數的參數可以是缺省的。5第四章 深入類和對象 4.1 構造函數 4.1.2 構造函數的定義 2. 構造函數的初始化方式 構造函數有兩種方式初始化數據成員: 1在構造函數體內用賦值語句的方式; Date:Date(int y, int m, int d) year = y; month = m; day = d; 6第四章 深入類和對象4.1 構造函數4.1.2 構造函數的定義2構造函數的初始化列表的方式Date:Date(int y,int m,int d):year(y), month(m),day(d)7第四章 深入類和對象 4.1 構造函數 4.1.2 構造函數的定義 3. 缺省的構造

4、函數 用戶定義的類類型中,可以沒有構造函數。 編譯器會自動給該類類型生成一個沒有參數的構造函數,該函數不作任何初始化工作。 這種構造函數稱為缺省的構造函數。 留意: 一個類如果有顯式定義的構造函數,編譯器就不會生成缺省構造函數了。8第四章 深入類和對象 4.1 構造函數 4.1.2 構造函數的定義 4. 定義類對象時給構造函數提供參數 1僅僅只有一個參數: 類名 對象名 = 參數; 2有一個或多個參數: 類名 對象名(參數列表);9第四章 深入類和對象 4.1 構造函數 4.1.3 重載構造函數 一個類可以提供多個構造函數,用于在不同場合進行類對象的初始化工作。 構造函數的重載,它們的參數表必

5、須互不相同。 class Date int year, month, day; public:Date(int d, int m, int y); Date(int d, int m); Date(int d);Date();Date(const char * dateStr); ;10則下述定義對象的方式都是正確的。 Date today(8, 10, 2019); Date day1(9, 5); Date day2(8); Date Christmas(“Dec 25, 2019”); Date now;第四章 深入類和對象 4.2 析構函數 與構造函數對應的是析構函數。C+通過析構函數

6、來處理對象的善后工作。 析構函數沒有返回類型,沒有參數,函數名是類名前加“”。 析構函數的作用為: (1) 執(zhí)行析構函數一般沒有具體的工作); (2) 釋放對象的存儲空間。(該功能由系統(tǒng)自動完成。) 留意:析構函數需要負責釋放new申請的空間。12第四章 深入類和對象 4.2 析構函數 可以使用完全限定名方式顯式地調用析構函數;若沒有顯式調用,則在一個對象的作用域結束時,系統(tǒng)自動調用析構函數。 系統(tǒng)自動調用構造函數和自動調用析構函數的順序是相反的。 class X public:X() X() ; (ex4-8.cpp)13 考慮一個數組,數組的大小在定義時初始化,而且其大小在運行時可以改變。

7、 class Array int * p; int size; public: Array(int num) size=num; p=new intsize; Array( ) delete p; .;第四章 深入類和對象4.3 拷貝構造函數1. 什么是拷貝構造函數 構造函數的參數可以是任何類型參數,甚至可以將自己類對象的常量引用作為參數,稱它為拷貝構造函數。 拷貝構造函數有兩個含義: 首先,它是一個構造函數,當創(chuàng)建一個新對象時,系統(tǒng)自動調用它; 其次,它將一個已經定義過的對象參數代表的對象的數據成員逐一對應地拷貝給新對象。15第四章 深入類和對象 4.3 拷貝構造函數 class A int

8、 x;int y; public: A(int,int); /一般構造函數 A(const A & objA) / 拷貝構造函數 x=objA.x;y=objA.y; ; / 成員函數的實現16 void main( ) A obj1(10,20); /調用A(int,int) A obj2(obj1); /調用A(const A &); A obj3 = obj2; /調用A(const A &); 第四章 深入類和對象4.3 拷貝構造函數1. 什么是拷貝構造函數 如果一個類沒有顯式定義拷貝構造函數,C+編譯器可以為該類產生一個缺省的拷貝構造函數。 缺省的拷貝構造函數

9、,也將拷貝對象的各個數據成員拷貝給被拷貝對象的各個數據成員。 這樣一來,兩個對象的內存映像是一模一樣的。18第四章 深入類和對象 4.3 拷貝構造函數 2. 拷貝構造函數的作用 拷貝構造函數的作用是: 創(chuàng)建一個新對象,并將一個已存在的對象拷貝到這個新對象 對象本身做參數(將實參對象拷貝給形參對象) 函數返回對象(拷貝返回的對象給一個臨時對象) (ex4-9.10.cpp)19class string int length; char * contents; int who; public: string(int id) length=0;contents=NULL;who=id; ;strin

10、g fun(string arg) return (arg); void main( ) string s = 1; string t=fun(s); 第四章 深入類和對象4.4 對象的創(chuàng)建、釋放和初始化1. 對象的創(chuàng)建和釋放可以創(chuàng)建不同形式的各類對象: 命名的自動對象 每次進入該對象的作用域,都調用構造函數; 每次退出該對象的作用域,都調用析構函數。21第四章 深入類和對象 4.4 對象的創(chuàng)建、釋放和初始化 class Table ; void f(int a) Table aa;/aa的生命期到f函數返回Table bb;/bb的生命期到f函數返回if (a0) Table cc;/cc的

11、生命期到if語句結束 Table dd;/dd的生命期到f函數返回 ; /若調用函數f(10) 則調用構造函數的順序是:aa、bb、cc、dd; 調用析構函數的順序是:cc、dd、bb、aa。22第四章 深入類和對象 4.4 對象的創(chuàng)建、釋放和初始化 自由對象動態(tài)對象) 使用new創(chuàng)建對象實際上調用構造函數),使用delete釋放對象實際上調用析構函數); 當delete釋放對象后,該對象就不能再被使用。 如果構造函數有參數,也必須給出實參。(ex4-13.cpp)23留意 全局對象: 在程序運行前,調用構造函數創(chuàng)建它們 整個程序結束時,調用析構函數釋放它們第四章 深入類和對象 4.4 對象的

12、創(chuàng)建、釋放和初始化 2. 對象的初始化 初始化有許多表示法,C+語言允許下述三種表示方法。 C風格的初始值表的方法 賦值表達式的方法 表達式表的方法 Class_Name Object(); Class_Name Object = ;25第四章 深入類和對象4.5 對象和指針4.5.1 this指針 C+為所有非靜態(tài)成員函數提供了一個稱為this的指針,因此,常常稱成員函數擁有this指針。 this是一個隱含的指針,不能被顯式聲明 它只是一個形參,一個局部變量 在任何一個非靜態(tài)成員函數里都存在 它局部于某一對象。 this指針是一個常指針,可以表示為(但不能顯式聲明): X * const

13、this;26第四章 深入類和對象4.5 對象和指針4.5.1 this指針 可以使用const說明符將this聲明為指向常量的常指針。 在類中,一個成員函數的原型后跟一個const,該函數稱為const成員函數,它的特點是該函數不能修改this所指的對象的成員。例 int GetInt() const; this 指針主要用在運算符重載、自引用等場合。(ex4-15.cpp)27class INT int num; public: void set(int x) num=x; void out() coutnum類的公有成員 的方式在類外訪問一個類的成員。(ex4-16.cpp)31第四章

14、深入類和對象4.5 對象和指針4.5.3 指向類的成員的指針 C+語言中,可以說明指向類的數據成員的指針和指向類的成員函數的指針。 這兩種指針必須與對象或指向對象的指針結合使用。32第四章 深入類和對象 4.5 對象和指針 4.5.3 指向類的成員的指針 1. 指向類的數據成員的指針 指向類的數據成員的指針定義格式為: 類型名 類名:*指針; 這種說明不是說指針是屬于類的 而是說明指針只能指向指定類的指定類型的成員 (ex4-17.cpp)33第四章 深入類和對象 4.5 對象和指針 4.5.3 指向類的成員的指針 2. 指向類的成員函數的指針 指向類的成員函數的指針定義的格式為: 類型名 (

15、類名:*指針)(參數表); 函數指針并不屬于類, 而是只能指向類的指定原型的函數。(ex4-18.cpp)34第四章 深入類和對象4.6 友元關系 一個對象的私有數據,只能通過成員函數進行訪問,這是一堵不透明的墻。 這種限制性的用法給兩個類必須共享同一函數的情形帶來了較大的開銷。 出于效率而非技術上必須思索,C+提供了一種輔助手段,允許外面的類或函數去訪問一個類的私有數據。 35class INTEGER private:int num; public: void Set(int n) num=n; ;void Print( INTEGER obj) coutobj.num; / 錯誤 why

16、?void mian( ) INTEGER INTobj; INTobj.set(100); Print(INTobj); class INTEGER private: int num;public: void Set(int n) num=n; friend void Print(INTEGER ); ; void Print( INTEGER obj) coutobj.num; / okvoid mian( ) INTEGER INTobj; INTobj.set(100); Print(INTobj); 類X的友元可以是一個函數(或是一個類) 它不是X的成員函數, 但能訪問X的私有成員和

17、保護段的成員,除了具有這一訪問權限外 F在作用域、聲明和定義等方面都是一普通的函數或類)。第四章 深入類和對象4.6 友元關系4.6.1 友元函數 友元函數不屬于類,友元函數沒有this 指針 這是友元函數與成員函數的主要區(qū)別。 友元函數的聲明可以放在類的任何段里。39第四章 深入類和對象4.6 友元關系4.6.2 友元類class Printer;class INTEGER private:int num1; friend Printer; ; 類Printer的成員函數全都是類INTEGER的友元函數; 可以訪問類INTEGER的任何成員。40第四章 深入類和對象4.6 友元關系4.6.3

18、 友元關系的總結友元具有如下的特性: 非傳遞性。即A是B的友元,B是C的友元,但A不一定是C的友元除非將A聲明 為C的友元); 非對稱性。即A是B的友元,但B不一定是A的友元除非將B聲明為A的友元)。41第四章 深入類和對象4.7 與類和對象相關的問題4.7.1 對象數組 可以像創(chuàng)建任何其他數據類型的數組一樣的方式來創(chuàng)建一個類的對象數組。 創(chuàng)建對象數組,每個數組元素都是一個對象,所以需要多次調用構造函數;釋放對象數組,也需要多次調用析構函數。 One_Class_Name obj_array10;42第四章 深入類和對象 4.7 與類和對象相關的問題 4.7.1 對象數組 C+語言不允許初始化

19、對象數組,所以,要創(chuàng)建一個類的對象數組,該類的構造函數必須滿足下列三個條件之一: 沒有構造函數; 有構造函數,但要有一個構造函數不帶參數; 有構造函數,但要有一個構造函數具有的參數全是缺省參數。(ex4-22.cpp)43第四章 深入類和對象4.7 與類和對象相關的問題4.7.2 類類型做參數類型 由于類是一個數據類型,也可以將對象作為參數傳遞給函數 參數傳遞遵循傳值或傳地址的方式,這同所有其他的數據類型是相同的。類類型做形參類型,一般有3種方式:對象本身做參數傳值)對象引用做參數傳地址)對象指針做參數傳值)(ex4-23.cpp)44class OBJ int num; public: vo

20、id set_num(int x) num=x; void out_num( ) coutnumout_num( ); objp- set_num(100); objp- out_num( ); void main( ) OBJ obj; obj.set_num(10); fun(&obj); obj.out_num( ); 結果為 10 100 100第四章 深入類和對象4.7 與類和對象相關的問題4.7.2 類類型做參數類型 對象本身做參數,對形參的任何修改都不影響用作實參的對象; 對象引用做參數,對形參的任何修改就是對實參的對象的修改; 對象指針做參數,對它指向的對象作任何修改就

21、是對實參對象的修改。49第四章 深入類和對象 4.7 與類和對象相關的問題 4.7.3 類類型常量 類類型常量的基本形式為: 類名常量表)(ex4-24.cpp)50第四章 深入類和對象4.7 與類和對象相關的問題4.7.4 一個類的對象作為另一個類的成員 一個類的對象可以作為另一個類的數據成員,簡稱為對象作為成員,實現的是整體和部分之間的關系(a part of),即對象的包含關系 , 有 時 也 稱 為 類 之 間 的 “ 復 合”(composition)??梢酝ㄟ^ 外部對象名.內部對象名.內部對象公有成員的方式來直接訪問內部對象的公有成員。(ex4-25.cpp)51第四章 深入類和對

22、象4.7 與類和對象相關的問題4.7.4 一個類的對象作為另一個類的成員 一個復合類在構造的時候,首先調用的是內部類對象的構造函數。 如果內部類對象多于一個,則它們的構造函數的調用順序依照它們的定義順序。 以后,再調用外部類的構造函數。 而在復合類對象析構的時候,析構函數的調用順序正好與構造是相反。52考慮點和圓的關系。圓的屬性包括圓心和半徑,而圓心就是一個點。 class Point int x, y; public: Point(int x1,int y1) x=x1; y=y1 ; void setxy(); ;class Circle float r; Point circle_point; public: Circle(float r1,int a,int b) :circle_point(a,b) r=r1; void set_point() circle_point.setxy(); ; void main()Circle cobj(5.6,1,2);cobj. set_point();第四章 深入類和對象4.7 與類和對象相關的問題4.7.5 非局部環(huán)境 在函數體外定義的變量如全局變量、類中的靜

溫馨提示

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

評論

0/150

提交評論