版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、面向?qū)ο蟪绦蛟O(shè)計(jì)語言C+電子科技大學(xué)計(jì)算機(jī)學(xué)院1第四章 深入類和對象 4.1 構(gòu)造函數(shù) 4.1.1 構(gòu)造函數(shù)的作用 class Date int day, month, year; public: void InitDate(int d, int m, int y); /初始化? ; 程序員有的時(shí)候會忘記了調(diào)用初始化函數(shù) 或者調(diào)用了多次。這都是不好的現(xiàn)象。 2第四章 深入類和對象4.1 構(gòu)造函數(shù)4.1.1 構(gòu)造函數(shù)的作用 C+為類設(shè)計(jì)了構(gòu)造函數(shù)(constructor)機(jī)制,它可以達(dá)到初始化數(shù)據(jù)成員的目的。 類的構(gòu)造函數(shù)是類的一個(gè)特殊成員函數(shù),它沒有返回類型void也不行),可以有參數(shù),函數(shù)名
2、和類名一樣。 當(dāng)創(chuàng)建類的一個(gè)新對象時(shí),自動調(diào)用構(gòu)造函數(shù),完成初始化工作需要注意構(gòu)造函數(shù)是否有參數(shù),以及參數(shù)的個(gè)數(shù)、類型)。3第四章 深入類和對象4.1 構(gòu)造函數(shù)4.1.1 構(gòu)造函數(shù)的作用構(gòu)造函數(shù)的作用為:分配一個(gè)對象的數(shù)據(jù)成員的存儲空間; (該功能由系統(tǒng)自動完成。)(2) 執(zhí)行構(gòu)造函數(shù)(體),一般是初始化一個(gè)對象的部分或全體數(shù)據(jù)成員。4第四章 深入類和對象 4.1 構(gòu)造函數(shù) 4.1.2 構(gòu)造函數(shù)的定義 1. 構(gòu)造函數(shù)的定義 class Date private: int year, month, day; public:Date(int y, int m, int d); /其它成員 ; 構(gòu)造
3、函數(shù)的參數(shù)可以是缺省的。5第四章 深入類和對象 4.1 構(gòu)造函數(shù) 4.1.2 構(gòu)造函數(shù)的定義 2. 構(gòu)造函數(shù)的初始化方式 構(gòu)造函數(shù)有兩種方式初始化數(shù)據(jù)成員: 1在構(gòu)造函數(shù)體內(nèi)用賦值語句的方式; Date:Date(int y, int m, int d) year = y; month = m; day = d; 6第四章 深入類和對象4.1 構(gòu)造函數(shù)4.1.2 構(gòu)造函數(shù)的定義2構(gòu)造函數(shù)的初始化列表的方式Date:Date(int y,int m,int d):year(y), month(m),day(d)7第四章 深入類和對象 4.1 構(gòu)造函數(shù) 4.1.2 構(gòu)造函數(shù)的定義 3. 缺省的構(gòu)造
4、函數(shù) 用戶定義的類類型中,可以沒有構(gòu)造函數(shù)。 編譯器會自動給該類類型生成一個(gè)沒有參數(shù)的構(gòu)造函數(shù),該函數(shù)不作任何初始化工作。 這種構(gòu)造函數(shù)稱為缺省的構(gòu)造函數(shù)。 留意: 一個(gè)類如果有顯式定義的構(gòu)造函數(shù),編譯器就不會生成缺省構(gòu)造函數(shù)了。8第四章 深入類和對象 4.1 構(gòu)造函數(shù) 4.1.2 構(gòu)造函數(shù)的定義 4. 定義類對象時(shí)給構(gòu)造函數(shù)提供參數(shù) 1僅僅只有一個(gè)參數(shù): 類名 對象名 = 參數(shù); 2有一個(gè)或多個(gè)參數(shù): 類名 對象名(參數(shù)列表);9第四章 深入類和對象 4.1 構(gòu)造函數(shù) 4.1.3 重載構(gòu)造函數(shù) 一個(gè)類可以提供多個(gè)構(gòu)造函數(shù),用于在不同場合進(jìn)行類對象的初始化工作。 構(gòu)造函數(shù)的重載,它們的參數(shù)表必
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 析構(gòu)函數(shù) 與構(gòu)造函數(shù)對應(yīng)的是析構(gòu)函數(shù)。C+通過析構(gòu)函數(shù)
6、來處理對象的善后工作。 析構(gòu)函數(shù)沒有返回類型,沒有參數(shù),函數(shù)名是類名前加“”。 析構(gòu)函數(shù)的作用為: (1) 執(zhí)行析構(gòu)函數(shù)一般沒有具體的工作); (2) 釋放對象的存儲空間。(該功能由系統(tǒng)自動完成。) 留意:析構(gòu)函數(shù)需要負(fù)責(zé)釋放new申請的空間。12第四章 深入類和對象 4.2 析構(gòu)函數(shù) 可以使用完全限定名方式顯式地調(diào)用析構(gòu)函數(shù);若沒有顯式調(diào)用,則在一個(gè)對象的作用域結(jié)束時(shí),系統(tǒng)自動調(diào)用析構(gòu)函數(shù)。 系統(tǒng)自動調(diào)用構(gòu)造函數(shù)和自動調(diào)用析構(gòu)函數(shù)的順序是相反的。 class X public:X() X() ; (ex4-8.cpp)13 考慮一個(gè)數(shù)組,數(shù)組的大小在定義時(shí)初始化,而且其大小在運(yùn)行時(shí)可以改變。
7、 class Array int * p; int size; public: Array(int num) size=num; p=new intsize; Array( ) delete p; .;第四章 深入類和對象4.3 拷貝構(gòu)造函數(shù)1. 什么是拷貝構(gòu)造函數(shù) 構(gòu)造函數(shù)的參數(shù)可以是任何類型參數(shù),甚至可以將自己類對象的常量引用作為參數(shù),稱它為拷貝構(gòu)造函數(shù)。 拷貝構(gòu)造函數(shù)有兩個(gè)含義: 首先,它是一個(gè)構(gòu)造函數(shù),當(dāng)創(chuàng)建一個(gè)新對象時(shí),系統(tǒng)自動調(diào)用它; 其次,它將一個(gè)已經(jīng)定義過的對象參數(shù)代表的對象的數(shù)據(jù)成員逐一對應(yīng)地拷貝給新對象。15第四章 深入類和對象 4.3 拷貝構(gòu)造函數(shù) class A int
8、 x;int y; public: A(int,int); /一般構(gòu)造函數(shù) A(const A & objA) / 拷貝構(gòu)造函數(shù) x=objA.x;y=objA.y; ; / 成員函數(shù)的實(shí)現(xiàn)16 void main( ) A obj1(10,20); /調(diào)用A(int,int) A obj2(obj1); /調(diào)用A(const A &); A obj3 = obj2; /調(diào)用A(const A &); 第四章 深入類和對象4.3 拷貝構(gòu)造函數(shù)1. 什么是拷貝構(gòu)造函數(shù) 如果一個(gè)類沒有顯式定義拷貝構(gòu)造函數(shù),C+編譯器可以為該類產(chǎn)生一個(gè)缺省的拷貝構(gòu)造函數(shù)。 缺省的拷貝構(gòu)造函數(shù)
9、,也將拷貝對象的各個(gè)數(shù)據(jù)成員拷貝給被拷貝對象的各個(gè)數(shù)據(jù)成員。 這樣一來,兩個(gè)對象的內(nèi)存映像是一模一樣的。18第四章 深入類和對象 4.3 拷貝構(gòu)造函數(shù) 2. 拷貝構(gòu)造函數(shù)的作用 拷貝構(gòu)造函數(shù)的作用是: 創(chuàng)建一個(gè)新對象,并將一個(gè)已存在的對象拷貝到這個(gè)新對象 對象本身做參數(shù)(將實(shí)參對象拷貝給形參對象) 函數(shù)返回對象(拷貝返回的對象給一個(gè)臨時(shí)對象) (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)建不同形式的各類對象: 命名的自動對象 每次進(jìn)入該對象的作用域,都調(diào)用構(gòu)造函數(shù); 每次退出該對象的作用域,都調(diào)用析構(gòu)函數(shù)。21第四章 深入類和對象 4.4 對象的創(chuàng)建、釋放和初始化 class Table ; void f(int a) Table aa;/aa的生命期到f函數(shù)返回Table bb;/bb的生命期到f函數(shù)返回if (a0) Table cc;/cc的
11、生命期到if語句結(jié)束 Table dd;/dd的生命期到f函數(shù)返回 ; /若調(diào)用函數(shù)f(10) 則調(diào)用構(gòu)造函數(shù)的順序是:aa、bb、cc、dd; 調(diào)用析構(gòu)函數(shù)的順序是:cc、dd、bb、aa。22第四章 深入類和對象 4.4 對象的創(chuàng)建、釋放和初始化 自由對象動態(tài)對象) 使用new創(chuàng)建對象實(shí)際上調(diào)用構(gòu)造函數(shù)),使用delete釋放對象實(shí)際上調(diào)用析構(gòu)函數(shù)); 當(dāng)delete釋放對象后,該對象就不能再被使用。 如果構(gòu)造函數(shù)有參數(shù),也必須給出實(shí)參。(ex4-13.cpp)23留意 全局對象: 在程序運(yùn)行前,調(diào)用構(gòu)造函數(shù)創(chuàng)建它們 整個(gè)程序結(jié)束時(shí),調(diào)用析構(gòu)函數(shù)釋放它們第四章 深入類和對象 4.4 對象的
12、創(chuàng)建、釋放和初始化 2. 對象的初始化 初始化有許多表示法,C+語言允許下述三種表示方法。 C風(fēng)格的初始值表的方法 賦值表達(dá)式的方法 表達(dá)式表的方法 Class_Name Object(); Class_Name Object = ;25第四章 深入類和對象4.5 對象和指針4.5.1 this指針 C+為所有非靜態(tài)成員函數(shù)提供了一個(gè)稱為this的指針,因此,常常稱成員函數(shù)擁有this指針。 this是一個(gè)隱含的指針,不能被顯式聲明 它只是一個(gè)形參,一個(gè)局部變量 在任何一個(gè)非靜態(tài)成員函數(shù)里都存在 它局部于某一對象。 this指針是一個(gè)常指針,可以表示為(但不能顯式聲明): X * const
13、this;26第四章 深入類和對象4.5 對象和指針4.5.1 this指針 可以使用const說明符將this聲明為指向常量的常指針。 在類中,一個(gè)成員函數(shù)的原型后跟一個(gè)const,該函數(shù)稱為const成員函數(shù),它的特點(diǎn)是該函數(shù)不能修改this所指的對象的成員。例 int GetInt() const; this 指針主要用在運(yùn)算符重載、自引用等場合。(ex4-15.cpp)27class INT int num; public: void set(int x) num=x; void out() coutnum類的公有成員 的方式在類外訪問一個(gè)類的成員。(ex4-16.cpp)31第四章
14、深入類和對象4.5 對象和指針4.5.3 指向類的成員的指針 C+語言中,可以說明指向類的數(shù)據(jù)成員的指針和指向類的成員函數(shù)的指針。 這兩種指針必須與對象或指向?qū)ο蟮闹羔樈Y(jié)合使用。32第四章 深入類和對象 4.5 對象和指針 4.5.3 指向類的成員的指針 1. 指向類的數(shù)據(jù)成員的指針 指向類的數(shù)據(jù)成員的指針定義格式為: 類型名 類名:*指針; 這種說明不是說指針是屬于類的 而是說明指針只能指向指定類的指定類型的成員 (ex4-17.cpp)33第四章 深入類和對象 4.5 對象和指針 4.5.3 指向類的成員的指針 2. 指向類的成員函數(shù)的指針 指向類的成員函數(shù)的指針定義的格式為: 類型名 (
15、類名:*指針)(參數(shù)表); 函數(shù)指針并不屬于類, 而是只能指向類的指定原型的函數(shù)。(ex4-18.cpp)34第四章 深入類和對象4.6 友元關(guān)系 一個(gè)對象的私有數(shù)據(jù),只能通過成員函數(shù)進(jìn)行訪問,這是一堵不透明的墻。 這種限制性的用法給兩個(gè)類必須共享同一函數(shù)的情形帶來了較大的開銷。 出于效率而非技術(shù)上必須思索,C+提供了一種輔助手段,允許外面的類或函數(shù)去訪問一個(gè)類的私有數(shù)據(jù)。 35class INTEGER private:int num; public: void Set(int n) num=n; ;void Print( INTEGER obj) coutobj.num; / 錯(cuò)誤 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的友元可以是一個(gè)函數(shù)(或是一個(gè)類) 它不是X的成員函數(shù), 但能訪問X的私有成員和
17、保護(hù)段的成員,除了具有這一訪問權(quán)限外 F在作用域、聲明和定義等方面都是一普通的函數(shù)或類)。第四章 深入類和對象4.6 友元關(guān)系4.6.1 友元函數(shù) 友元函數(shù)不屬于類,友元函數(shù)沒有this 指針 這是友元函數(shù)與成員函數(shù)的主要區(qū)別。 友元函數(shù)的聲明可以放在類的任何段里。39第四章 深入類和對象4.6 友元關(guān)系4.6.2 友元類class Printer;class INTEGER private:int num1; friend Printer; ; 類Printer的成員函數(shù)全都是類INTEGER的友元函數(shù); 可以訪問類INTEGER的任何成員。40第四章 深入類和對象4.6 友元關(guān)系4.6.3
18、 友元關(guān)系的總結(jié)友元具有如下的特性: 非傳遞性。即A是B的友元,B是C的友元,但A不一定是C的友元除非將A聲明 為C的友元); 非對稱性。即A是B的友元,但B不一定是A的友元除非將B聲明為A的友元)。41第四章 深入類和對象4.7 與類和對象相關(guān)的問題4.7.1 對象數(shù)組 可以像創(chuàng)建任何其他數(shù)據(jù)類型的數(shù)組一樣的方式來創(chuàng)建一個(gè)類的對象數(shù)組。 創(chuàng)建對象數(shù)組,每個(gè)數(shù)組元素都是一個(gè)對象,所以需要多次調(diào)用構(gòu)造函數(shù);釋放對象數(shù)組,也需要多次調(diào)用析構(gòu)函數(shù)。 One_Class_Name obj_array10;42第四章 深入類和對象 4.7 與類和對象相關(guān)的問題 4.7.1 對象數(shù)組 C+語言不允許初始化
19、對象數(shù)組,所以,要創(chuàng)建一個(gè)類的對象數(shù)組,該類的構(gòu)造函數(shù)必須滿足下列三個(gè)條件之一: 沒有構(gòu)造函數(shù); 有構(gòu)造函數(shù),但要有一個(gè)構(gòu)造函數(shù)不帶參數(shù); 有構(gòu)造函數(shù),但要有一個(gè)構(gòu)造函數(shù)具有的參數(shù)全是缺省參數(shù)。(ex4-22.cpp)43第四章 深入類和對象4.7 與類和對象相關(guān)的問題4.7.2 類類型做參數(shù)類型 由于類是一個(gè)數(shù)據(jù)類型,也可以將對象作為參數(shù)傳遞給函數(shù) 參數(shù)傳遞遵循傳值或傳地址的方式,這同所有其他的數(shù)據(jù)類型是相同的。類類型做形參類型,一般有3種方式:對象本身做參數(shù)傳值)對象引用做參數(shù)傳地址)對象指針做參數(shù)傳值)(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( ); 結(jié)果為 10 100 100第四章 深入類和對象4.7 與類和對象相關(guān)的問題4.7.2 類類型做參數(shù)類型 對象本身做參數(shù),對形參的任何修改都不影響用作實(shí)參的對象; 對象引用做參數(shù),對形參的任何修改就是對實(shí)參的對象的修改; 對象指針做參數(shù),對它指向的對象作任何修改就
21、是對實(shí)參對象的修改。49第四章 深入類和對象 4.7 與類和對象相關(guān)的問題 4.7.3 類類型常量 類類型常量的基本形式為: 類名常量表)(ex4-24.cpp)50第四章 深入類和對象4.7 與類和對象相關(guān)的問題4.7.4 一個(gè)類的對象作為另一個(gè)類的成員 一個(gè)類的對象可以作為另一個(gè)類的數(shù)據(jù)成員,簡稱為對象作為成員,實(shí)現(xiàn)的是整體和部分之間的關(guān)系(a part of),即對象的包含關(guān)系 , 有 時(shí) 也 稱 為 類 之 間 的 “ 復(fù) 合”(composition)??梢酝ㄟ^ 外部對象名.內(nèi)部對象名.內(nèi)部對象公有成員的方式來直接訪問內(nèi)部對象的公有成員。(ex4-25.cpp)51第四章 深入類和對
22、象4.7 與類和對象相關(guān)的問題4.7.4 一個(gè)類的對象作為另一個(gè)類的成員 一個(gè)復(fù)合類在構(gòu)造的時(shí)候,首先調(diào)用的是內(nèi)部類對象的構(gòu)造函數(shù)。 如果內(nèi)部類對象多于一個(gè),則它們的構(gòu)造函數(shù)的調(diào)用順序依照它們的定義順序。 以后,再調(diào)用外部類的構(gòu)造函數(shù)。 而在復(fù)合類對象析構(gòu)的時(shí)候,析構(gòu)函數(shù)的調(diào)用順序正好與構(gòu)造是相反。52考慮點(diǎn)和圓的關(guān)系。圓的屬性包括圓心和半徑,而圓心就是一個(gè)點(diǎn)。 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 與類和對象相關(guān)的問題4.7.5 非局部環(huán)境 在函數(shù)體外定義的變量如全局變量、類中的靜
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人心理咨詢與輔導(dǎo)服務(wù)合同3篇
- 2025年度林業(yè)權(quán)屬林權(quán)登記與林業(yè)碳匯項(xiàng)目實(shí)施合同4篇
- 2025年福建貨運(yùn)從業(yè)資格證新政
- 七夕節(jié)趣味活動策劃方案
- 二零二五年度高速鐵路鋁合金門窗安全檢測與安裝合同4篇
- 二零二五年度0號柴油環(huán)保油品居間服務(wù)合同3篇
- 2025年度個(gè)人房產(chǎn)交易過戶手續(xù)辦理協(xié)議3篇
- 二零二五年度土地租賃及經(jīng)營權(quán)轉(zhuǎn)讓合同樣本-@-1
- 二零二五年度離婚房產(chǎn)分割與子女醫(yī)療費(fèi)用承擔(dān)合同3篇
- 二零二五年度企業(yè)員工培訓(xùn)課程版權(quán)購買協(xié)議4篇
- 2024年社區(qū)警務(wù)規(guī)范考試題庫
- 2024年食用牛脂項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國戶外音箱行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
- 家務(wù)分工與責(zé)任保證書
- 消防安全隱患等級
- (新版)國民經(jīng)濟(jì)行業(yè)分類代碼表(八大行業(yè))
- 北京地鐵13號線
- 2023山東春季高考數(shù)學(xué)真題(含答案)
- 為加入燒火佬協(xié)會致辭(7篇)
- 職業(yè)衛(wèi)生法律法規(guī)和標(biāo)準(zhǔn)培訓(xùn)課件
- 高二下學(xué)期英語閱讀提升練習(xí)(二)
評論
0/150
提交評論