版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、類和對象及其封裝性第1頁,共143頁,2022年,5月20日,8點28分,星期二本章要點1 類的定義及其類對象的封裝性2 類成員函數(shù)的定義3 類對象的定義和使用4 類的構(gòu)造函數(shù)和析構(gòu)函數(shù)5 類對象的動態(tài)創(chuàng)建和釋放6 類對象的賦值與復(fù)制7 與類對象有關(guān)的指針8 類的靜態(tài)成員9 類對象成員、類對象數(shù)組和類對象參數(shù)10 友元(友元函數(shù)、友元成員和友元類)11 類的只讀成員函數(shù)定義第2頁,共143頁,2022年,5月20日,8點28分,星期二3.1 類的定義及其類對象的封裝性 無論采用哪種程序設(shè)計范型所設(shè)計的程序都是由數(shù)據(jù)處理這些數(shù)據(jù)的操作組成的。程序的運行就是按照特定的結(jié)構(gòu)和流程將操作施加在相應(yīng)的數(shù)
2、據(jù)上,完成程序需要實現(xiàn)的功能。 在傳統(tǒng)設(shè)計范型中,數(shù)據(jù)是使用語言所提供的簡單數(shù)據(jù)類型和構(gòu)造數(shù)據(jù)類型(例如 C 語言中的結(jié)構(gòu)類型 struct)定義生成的;而操作是通過過程或函數(shù)的形式定義提供的。第3頁,共143頁,2022年,5月20日,8點28分,星期二 在面向?qū)ο笤O(shè)計范型中,使用了數(shù)據(jù)抽象的概念,即數(shù)據(jù)總是與允許施加它們的操作綁定在一起的。這就要求編程語言能夠提供符合數(shù)據(jù)抽象的預(yù)定義數(shù)據(jù)類型,特別需要提供能構(gòu)造符合數(shù)據(jù)抽象用戶自定義類型的構(gòu)造數(shù)據(jù)類型(例如 C+ 和 Java 語言中的類類型 class)。程序中的數(shù)據(jù)和操作都是由按數(shù)據(jù)抽象封裝起來的對象提供的。第4頁,共143頁,2022
3、年,5月20日,8點28分,星期二3.1.1 C+ 的類類型定義 在 C+ 中,用戶可以使用類類型關(guān)鍵字 class 定義自己的抽象數(shù)據(jù)類型。這種定義方法和形式與使用結(jié)構(gòu)體類型關(guān)鍵字 struct 定義數(shù)據(jù)結(jié)構(gòu)類型十分相似。例如,可以用 struct 定義描述學(xué)生基本信息的數(shù)據(jù)結(jié)構(gòu)類型 Student:struct Student int num;char name20;char sex;第5頁,共143頁,2022年,5月20日,8點28分,星期二 同樣,可以用 class 定義描述學(xué)生基本信息和基本操作的數(shù)據(jù)類型 Student:class Student int num;char nam
4、e20;char sex;public:void display() cout “num: ” num endl;cout “name: ” name endl;cout “sex: ” sex endl;第6頁,共143頁,2022年,5月20日,8點28分,星期二比較兩種用戶自定義類型,它們的共同之處表現(xiàn)在: 類型定義首行的格式相同,由類型關(guān)鍵字(struct 或 class)與自定義類名組成。例如:“struct Student” 和 “class Student”。 類型定義體都使用左花括號 “” 表示開始,使用右 花括號 “” 表示結(jié)束,并用分號 “;” 表示整個自定義 類型定義工作
5、完成。 使用自定義類型(結(jié)構(gòu)或類)定義類型實體(結(jié)構(gòu) 變量或類對象)的格式相同。 在面向?qū)ο蟮某绦蛟O(shè)計中通常將所有的類型(包括 系統(tǒng)預(yù)定義的簡單數(shù)據(jù)類型)實體可以統(tǒng)一稱為對 象。例如,可使用自定義結(jié)構(gòu)類型 Student 定義結(jié)構(gòu) 對象:Student stud1, stud2; 也可使用自定義類類型 Student 定義類對象:Student stud1, stud2;第7頁,共143頁,2022年,5月20日,8點28分,星期二在面向?qū)ο蟮某绦蛟O(shè)計中通常將所有的類型(包括 系統(tǒng)預(yù)定義的簡單數(shù)據(jù)類型)實體可以統(tǒng)一稱為對 象。例如,可使用自定義結(jié)構(gòu)類型 Student 定義結(jié)構(gòu) 對象:Stud
6、ent stud1, stud2; 也可使用自定義類類型 Student 定義類對象:Student stud1, stud2;第8頁,共143頁,2022年,5月20日,8點28分,星期二二者的不同之處表現(xiàn)在: 使用 C 語言的 struct 定義的結(jié)構(gòu)類型的定義體中只 包含數(shù)據(jù)成員,而使用 class 定義類類型的定義體中 既包含數(shù)據(jù)成員,還包含了操作這些數(shù)據(jù)的成員函 數(shù)。注意,在 C+ 中,struct 定義能力被擴(kuò)展,也可 以 class 定義一樣包含操作數(shù)據(jù)成員的成員函數(shù)。 結(jié)構(gòu)類型的成員的缺省訪問權(quán)限均為公有,即可以 從結(jié)構(gòu)對象外直接訪問。例如:Student stud1;cout
7、 “num: ” stud1.num endl;第9頁,共143頁,2022年,5月20日,8點28分,星期二cout “name: ” endl;cout “sex: ” stud1.sex endl; 而類類型的成員的缺省訪問權(quán)限均為私有,例如, 類 Student 中的數(shù)據(jù)成員就不能從類外直接訪問,而 顯示這些數(shù)據(jù)只能通過調(diào)用成員函數(shù) display 實現(xiàn)。Student stud1;cout “name: ” endl; / 非法stud1.display();第10頁,共143頁,2022年,5月20日,8點28分,星期二3.1.2 類類型
8、成員的訪問權(quán)限 為了實現(xiàn)類對象的封裝性(數(shù)據(jù)隱藏和提供訪問接口)類類型定義為類成員提供了私有和公有兩種基本訪問權(quán)限供用戶選擇。1 私有成員 訪問權(quán)限:只限于類成員訪問。 關(guān)鍵字:private 聲明或從定義體開始的缺省聲 明。例如,下面的 Student 定義與前面的 Student 定義等價的:第11頁,共143頁,2022年,5月20日,8點28分,星期二class Studentprivate:int num;char name20;char sex;public:void display() cout “num: ” num endl;cout “name: ” name endl;c
9、out “sex: ” sex endl;第12頁,共143頁,2022年,5月20日,8點28分,星期二 私有段:從 private: 開始至其它訪問權(quán)限聲明之間 所有成員組成的代碼段。例如 Student 定義中從 private: 開始到 public: 之間的所數(shù)據(jù)成員。 成員種類:數(shù)據(jù)成員和成員函數(shù)。2 公有成員 訪問權(quán)限:允許類成員和類外的任何訪問。 關(guān)鍵字:public。 公有段:從 public: 至其它成員聲明之間所有成員 組成的代碼段。 成員種類:數(shù)據(jù)成員和成員函數(shù)。第13頁,共143頁,2022年,5月20日,8點28分,星期二 使用私有成員來隱藏由類對象操作的數(shù)據(jù),然后
10、提供相應(yīng)的公有成員函數(shù)來訪問和操作這些數(shù)據(jù),而訪問和操作這些數(shù)據(jù)實現(xiàn)細(xì)節(jié)通常是被隱藏起來的。 除了私有和公有兩種基本訪問權(quán)限外,類類型定義還提供了允許類成員和派生類成員訪問,而不允許類外訪問的保護(hù)成員訪問權(quán)限(protected),以滿足實現(xiàn)繼承性的需要。第14頁,共143頁,2022年,5月20日,8點28分,星期二 為了使 C+ 語言所設(shè)計程序中的數(shù)據(jù)都能實現(xiàn)數(shù)據(jù)抽象,并能與 C 語言設(shè)計的程序中的數(shù)據(jù)兼容, C+ 仿照類類型定義的功能,對 struct 定義的結(jié)構(gòu)體類型功能進(jìn)行如下擴(kuò)展: 定義體中也可以包括對數(shù)據(jù)成員進(jìn)行處理和操作的 成員函數(shù)。 添加了與類類型定義相同的成員訪問權(quán)限聲明功
11、 能,但仍然保留了缺省聲明表示成員的訪問權(quán)限為 公用的基本特點。 擴(kuò)展后的 struct 可以定義與類類型效果相同的結(jié)構(gòu)類型,例如:第15頁,共143頁,2022年,5月20日,8點28分,星期二 struct Studentprivate:int num;char name20;char sex;public:void display() cout “num: ” num endl;cout “name: ” name endl;cout “sex: ” sex endl;第16頁,共143頁,2022年,5月20日,8點28分,星期二該結(jié)構(gòu)類型與先前使用 class 定義的 Student
12、 類型的效果完全相同。請注意,這并不意味著可以用 struct 替代 class,因為使用 class 定義的類類型的缺省私有性質(zhì)能更方便、安全地實現(xiàn)面向?qū)ο蟪绦蛟O(shè)計對類對象的要求,因此強(qiáng)烈建議使用 class 建立數(shù)據(jù)類型;而只有希望所建立類型的全部成員都是公有訪問權(quán)限時,使用 struct 建立結(jié)構(gòu)類型比較方便。第17頁,共143頁,2022年,5月20日,8點28分,星期二3.1.3 類類型的構(gòu)造 類類型定義為所定義的數(shù)據(jù)類型建立了一個明確的邊界,類定義體中的私有成員(數(shù)據(jù)成員和成員函數(shù))和公有成員函數(shù)的實現(xiàn)細(xì)節(jié)均被封裝在此邊界內(nèi),使得這些類成員和實現(xiàn)細(xì)節(jié)無法從類對象外被訪問,從而受到保
13、護(hù)。同時對類公有成員(數(shù)據(jù)成員和成員函數(shù))的訪問和調(diào)用又為類對象之間的通訊提供了接口,使得類對象成為一個既訪問安全又操作方便的抽象數(shù)據(jù)實體。下面以一個簡單機(jī)器人類為例說明類類型的構(gòu)造:第18頁,共143頁,2022年,5月20日,8點28分,星期二 確定機(jī)器人狀態(tài)的屬性:是位置和面對的方向 改變、訪問和顯示機(jī)器人狀態(tài)的操作:有定位、 轉(zhuǎn)向、前進(jìn)、顯示狀態(tài)等。class Hominoid int dirction;/ 機(jī)器人的方向point location; / 機(jī)器人的位置 public:void turnLeft(); / 向左轉(zhuǎn)90度void turnRight();/ 向右轉(zhuǎn)90度bo
14、ol advance(); / 前進(jìn)一步point location(point loc);/ 定位bool facingWall();/ 判斷是否面對墻壁void display(); / 顯示當(dāng)前位置;第19頁,共143頁,2022年,5月20日,8點28分,星期二bool advance(); / 前進(jìn)一步point location(point loc);/ 定位bool facingWall();/ 判斷是否面對墻壁void display(); / 顯示當(dāng)前位置;該定義所建立的機(jī)器人類的構(gòu)造可以形象地用下圖表示,它很象一個封裝好的器件。第20頁,共143頁,2022年,5月20日,
15、8點28分,星期二directionlocation.turnLeftdislayturnRightfacingWalladvancelocation屬性操作邊界第21頁,共143頁,2022年,5月20日,8點28分,星期二 Java 的類定義與 C+ 的類定義在格式上基本相同,但有兩點是不一樣的: 成員的訪問權(quán)限必須逐個顯式說明; 類定義結(jié)束不要分號 “;”。例如:class User private String name;private int age;public User(String str int yy) name = str; age = yy; 返回第22頁,共143頁,2
16、022年,5月20日,8點28分,星期二3.2 類成員函數(shù)的定義1 成員函數(shù)的性質(zhì) 類的成員函數(shù)在聲明和定義的格式上以及用法和作 用上與一般函數(shù)基本一致。但由于成員函數(shù)是屬于 某一個類的成員,因此它與一般函數(shù)的區(qū)別表現(xiàn): 作用域在類定義體所確定的邊界內(nèi),即可以訪問 本類的任何成員(私有和公有的數(shù)據(jù)和函數(shù))。 需要根據(jù)功能和作用指定成員函數(shù)的訪問權(quán)限, 一般情況下,將向類外提供操作功能的成員函數(shù) 指定為 public,將只為類內(nèi)提供服務(wù)功能的成員函 數(shù)指定為 private,將只為類內(nèi)和派生類提供服務(wù) 功能的成員函數(shù)指定為 protected。 第23頁,共143頁,2022年,5月20日,8點
17、28分,星期二2 成員函數(shù)的聲明和定義形式 在類定義體內(nèi)定義成員函數(shù)的實現(xiàn)代碼。這種形 式下,函數(shù)定義的首部將起到函數(shù)原型的作用, 因此無須成員函數(shù)定義之前的原型聲明。例如:class point int x, y;public:void setpoint(int vx, int vy) x = vx; y = vy; ;第24頁,共143頁,2022年,5月20日,8點28分,星期二 在類定義體內(nèi)聲明成員函數(shù),而在類定義體外定 義成員函數(shù)的實現(xiàn)代碼。采用這種定義形式的 時,類定義體外的定義代碼必須滿足: 在成員函數(shù)名之前應(yīng)綴上所屬的類名:,“:”是 作用域運算符,以便說明函數(shù)的作用域。 成員
18、函數(shù)定義的首部(函數(shù)的返回類型、函數(shù) 名和參數(shù)表列)必須與在類定義體中聲明的該 函數(shù)的原型一致。例如:第25頁,共143頁,2022年,5月20日,8點28分,星期二class point int x, y;public:void setpoint(int, int);void point:setpoint(int vx, int vy) x = vx;y = vy; 由于第 種形式不僅可以減少類定義體的代碼長 度,使類定義體清晰、可讀性好;更重要的是有助 于類的操作接口與操作實現(xiàn)細(xì)節(jié)相分離,并隱藏細(xì) 節(jié)。因此,提倡采用該形式定義類成員函數(shù)。第26頁,共143頁,2022年,5月20日,8點2
19、8分,星期二3 類的內(nèi)置(內(nèi)聯(lián))成員函數(shù)定義方式: 隱式定義 函數(shù)定義在類定義體中,此時只 要函數(shù)的實現(xiàn)代碼符合內(nèi)置函數(shù)的定義要求,該 成員函數(shù)就會自動被定義內(nèi)置函數(shù),而說明內(nèi)置 函數(shù)的關(guān)鍵字 inline 可以忽略。例如:class point int x, y;public:void setpoint(int vx, int vy)/ 內(nèi)置函數(shù) x = vx; y = vy; ; 其中成員函數(shù) setpoint 定義的首部與加綴 inline 的 首部 “inline void setpoint(int vx, int vy)” 等效。第27頁,共143頁,2022年,5月20日,8點28
20、分,星期二 顯式定義 函數(shù)聲明在類定義體中,而函數(shù) 定義在類定義體外,此時函數(shù)定義的首部必須冠 以關(guān)鍵字 inline 說明此函數(shù)是內(nèi)置的。例如:class pointint x, y;public:inline void setpoint(int, int); / 內(nèi)置函數(shù)聲明;inline void point:setpoint(int vx, int vy) / 內(nèi)置函數(shù)定義x = vx;y = vy;第28頁,共143頁,2022年,5月20日,8點28分,星期二 需要特別注意的是:由于調(diào)用內(nèi)置函數(shù)需要將內(nèi)置函數(shù)的目標(biāo)代碼復(fù)制到它被調(diào)用的位置,因此編譯器在進(jìn)行內(nèi)置函數(shù)的調(diào)用編譯時,必須
21、能獲得被調(diào)內(nèi)置函數(shù)的目標(biāo)代碼。這就需要在調(diào)用內(nèi)置函數(shù)的源代碼文件中必須包含被調(diào)用內(nèi)置函數(shù)的定義代碼的源代碼文件。也就是說,如果某個被調(diào)用的內(nèi)置成員函數(shù)定義在類定義體中,該類定義體代碼被保存在一個頭文件中,例如 “student.h”,則調(diào)用該內(nèi)置函數(shù)的源文件應(yīng)添加預(yù)編譯命令 #include “student.h”。如果該內(nèi)置函數(shù)定義在類定義體外,代碼包含在類實現(xiàn)文件中,例如 “student.cpp”,則調(diào)用該內(nèi)置函數(shù)的源文件應(yīng)添加預(yù)編譯命令 #include “student.cpp”。第29頁,共143頁,2022年,5月20日,8點28分,星期二4 成員函數(shù)的存儲空間 從類類型的定義不
22、難看出,類的數(shù)據(jù)成員(對象屬 性)中保存的數(shù)據(jù)值代表了類對象的狀態(tài),決定了 該類的不同對象的差別,因此當(dāng)類對象創(chuàng)建時,每 個類對象都必須獨占一份(個數(shù)相同、類型相同) 數(shù)據(jù)成員存儲空間,用于保存區(qū)別于其他對象的狀 態(tài);而類的成員函數(shù)描述了該類所有對象的統(tǒng)一行 為操作,而操作結(jié)果(行為表現(xiàn))的差異取決于不 同對象的狀態(tài),因此,成員函數(shù)的運行代碼被存儲 在與數(shù)據(jù)成員存儲空間不同的代碼空間中,被該類 的所有對象共享。第30頁,共143頁,2022年,5月20日,8點28分,星期二 例如:由于語句 Student stud1, stud2, stud3; 執(zhí)行所創(chuàng) 建的 3 個 Student 對象在
23、程序運行空間中占用內(nèi)存的 大小和位置的狀態(tài)示意如下:返回程序數(shù)據(jù)區(qū)程序代碼區(qū)Student:Student()的運行代碼Student:Student()的運行代碼Student:display()的運行代碼num name sexstud1num name sexstud2num name sexstud3第31頁,共143頁,2022年,5月20日,8點28分,星期二3.3 類對象的定義和使用3.3.1 類與對象的關(guān)系 類是一組具有相同屬性和行為的對象的抽象,是創(chuàng) 建對象的模板,是用戶使用 class 創(chuàng)建的自定義類 型。類一旦創(chuàng)建,其作用可與系統(tǒng)預(yù)定義類型(例 如,int、double
24、等)類比。 對象是類的實例,創(chuàng)建類的對象可以與創(chuàng)建預(yù)定義 類型的變量(例如,int x;、double d; 等)類比。 類只是提供了該類對象的創(chuàng)建和使用的方法和規(guī) 則,因此類本身不占用內(nèi)存。創(chuàng)建類對象時將按類 定義提供的方法和規(guī)則,在內(nèi)存中為類對象分配空 間, 因此,封裝是對類對象而言的。第32頁,共143頁,2022年,5月20日,8點28分,星期二3.3.2 類對象的定義方法:1 先創(chuàng)建類類型,使用時再定義對象 大多數(shù)情況均采用該方法定義類對象。這樣創(chuàng)建的 類對象的生存周期取決于創(chuàng)建的位置。例如:class Student ;void main() Student Zhang, Li;/
25、 創(chuàng)建 Student 局部對象 雖然 C+ 也允許將上述的類對象定義語句寫成: class Student Zhang, Li; (C 風(fēng)格)但不能體現(xiàn) C+ 面 向?qū)ο蟮脑O(shè)計風(fēng)格,且不方便簡潔,所以不提倡。第33頁,共143頁,2022年,5月20日,8點28分,星期二2 在創(chuàng)建類類型的同時定義對象。 使用這種方法定義的類對象的生存周期取決于類類 型的創(chuàng)建位置。例如:class Studentint num;char name20;char sex;public:void display() cout “num: ” num endl;cout “name: ” name endl;cou
26、t “sex: ” sex 成員名;其中成員名必須是指針?biāo)笇ο蟮乃鶎兕惖墓袛?shù)據(jù)成員名或公有成員函數(shù)名。例如:class point int x, y;public:setpoint(int vx, int vy) x = vx; y = vy; ;void fun() point *p=new point;/ p 指向動態(tài)創(chuàng)建的 point 對象p-setpoint(10, 10); / 給 p 所指對象的坐標(biāo) x, y 賦值.第39頁,共143頁,2022年,5月20日,8點28分,星期二3 通過對象的引用訪問對象成員一般形式:對象引用名.成員名;其中成員名必須是對象引用名所引用對象的所
27、屬類的公有數(shù)據(jù)成員名或公有成員函數(shù)名。例如:class point int x, y;public:setpoint(int vx, int vy) x = vx; y = vy; ;void fun() point pt, &p = pt;/ p 引用 point 對象 ptp.setpoint(10, 10); / 給 p 引用的對象的坐標(biāo) x, y 賦值.第40頁,共143頁,2022年,5月20日,8點28分,星期二3.3.4 成員名解析 由于類成員作用域在該類定義體所限定的邊界內(nèi),因此,不同類中具有同名的成員是不會產(chǎn)生二義性。例如:class realSet/ 定義一個實數(shù)集合類pu
28、blic:void print();class intSet/ 定義一個整數(shù)集合類public:void print();第41頁,共143頁,2022年,5月20日,8點28分,星期二void fun()intSet is;realSet rs;is.print();/ 調(diào)用 intSet 類中的 print() 函數(shù)rs.print();/ 調(diào)用 realSet 類中的 print() 函數(shù)顯然不會引起二義性錯誤。返回第42頁,共143頁,2022年,5月20日,8點28分,星期二3.4 構(gòu)造函數(shù)使用類定義對象時,需要一種操作,使所定義的對象與類的定義域相關(guān)。實現(xiàn)這一操作的成員函數(shù)稱為構(gòu)造
29、函數(shù),該函數(shù)要完成的操作包括: 依據(jù)類數(shù)據(jù)成員的個數(shù)和類型為對象分配內(nèi)存; 根據(jù)需要為對象的數(shù)據(jù)成員進(jìn)行必要的初始化。構(gòu)造函數(shù)是類必須擁有的特殊成員函數(shù),該函數(shù)從定義形式到使用場合和方法上都與一般成員函數(shù)有所區(qū)別,這些差異表現(xiàn)在以下幾個方面:第43頁,共143頁,2022年,5月20日,8點28分,星期二 構(gòu)造函數(shù)名必須與類名相同,否則編譯器將會把它 當(dāng)作一般成員函數(shù)對待。例如:class Studentpublic: Student(); ;Student:Student() 第44頁,共143頁,2022年,5月20日,8點28分,星期二 構(gòu)造函數(shù)沒有返回值,因此,聲明和定義構(gòu)造函數(shù) 時都
30、不能說明它的返回類型; 構(gòu)造函數(shù)的功能是將對象初始化,因此構(gòu)造函數(shù)一 般只對數(shù)據(jù)成員進(jìn)行初始化和必要的輔助操作,而不提倡做與初始化無關(guān)的操作。 系統(tǒng)總會為類提供一個隱含的缺省構(gòu)造函數(shù)。該構(gòu) 造函數(shù)實際上是一個空定義體函數(shù),因此只能為對 象分配空間而不能為數(shù)據(jù)成員進(jìn)行初始化。 在大多數(shù)情況下,數(shù)據(jù)成員的初始化操作是十分必 要的,因此通常需要顯式定義構(gòu)造函數(shù)。構(gòu)造函數(shù) 一旦顯式定義,缺省構(gòu)造函數(shù)將被覆蓋。第45頁,共143頁,2022年,5月20日,8點28分,星期二 在程序運行過程中,類對象是在進(jìn)入其作用域時才 被創(chuàng)建的。也就是說,此時類對象的構(gòu)造函數(shù)被調(diào) 用。 構(gòu)造函數(shù)在類對象創(chuàng)建時由系統(tǒng)自動
31、執(zhí)行,不需要 用戶調(diào)用,也不能由用戶調(diào)用。例如:Student stud1;/ 系統(tǒng)調(diào)用構(gòu)造函數(shù)創(chuàng)建 stud1stud1.Student();/ 企圖用一般成員函數(shù)的調(diào)用方法/ 調(diào)用構(gòu)造函數(shù),因此是錯誤的。 不能為構(gòu)造函數(shù)定義函數(shù)指針,也不能獲取構(gòu)造函 數(shù)的調(diào)用地址。 基類的構(gòu)造函數(shù)不能被派生類繼承。 構(gòu)造函數(shù)不能聲明為虛函數(shù)。第46頁,共143頁,2022年,5月20日,8點28分,星期二例3-1 定義一個整數(shù)隊列類,使用由系統(tǒng)隱含提供的缺省構(gòu)造函數(shù)創(chuàng)建整數(shù)隊列,并測試隊列功能。1 問題分析 用例分析 類圖描述向隊列中裝入整數(shù)從隊列中取出整數(shù)用戶qurue-q2.*:int-head:in
32、t-tail:int+qput(in i:int)+qget():int第47頁,共143頁,2022年,5月20日,8點28分,星期二 2 詳細(xì)設(shè)計 類設(shè)計 qurue 類 類定義 class queue int q100;/ 隊列空間 int head, tail;/ 隊列頭、尾指示 public: void qput(int i);/ 隊列插入操作 int qget();/ 隊列取出操作 ;第48頁,共143頁,2022年,5月20日,8點28分,星期二算法描述 成員函數(shù) qput 的 N-S 流程圖: 成員函數(shù) qget 的 N-S 流程圖: tail=100 & tail-head=
33、100 ? 真 假 顯示隊列滿 trail = trail+1, 數(shù)據(jù)插入隊尾 head = tail ?真 假 顯示隊列空 head = head+1 從隊頭取數(shù)據(jù) tail = 100 ?真 假移動隊列數(shù)據(jù),修改隊列指針tail = tail head; head = 0; 第49頁,共143頁,2022年,5月20日,8點28分,星期二 類對象創(chuàng)建和使用main 函數(shù)的 N-S 流程圖:使用 queue 類創(chuàng)建實例 a, b向隊列實例 a, b 中分別插入:10,20 和 20,19從隊列實例 a, b 中分別順序取出數(shù)據(jù),并顯示第50頁,共143頁,2022年,5月20日,8點28分,
34、星期二3.4.1 參數(shù)化的構(gòu)造函數(shù) 與其他成員函數(shù)一樣,構(gòu)造函數(shù)也可以有參數(shù)。通過這些參數(shù)為類對象的數(shù)據(jù)成員傳遞初值。例如:class pointint x,y;public:point(int vx, int vy);/ 聲明帶參數(shù)的構(gòu)造函數(shù)void offset(int ax, int ay);第51頁,共143頁,2022年,5月20日,8點28分,星期二point:point(int vx, int vy)x = vx;/ 用傳遞來的實參對 x,y 賦初值y = vy;main()point p(10,20);/ 定義對象,并傳遞初值/注意,不要將使用參數(shù)創(chuàng)建類對象的代碼寫成:poin
35、t p = point(10, 20);第52頁,共143頁,2022年,5月20日,8點28分,星期二3.4.2 構(gòu)造函數(shù)的重載在一個類中允許定義多個參數(shù)不同構(gòu)造函數(shù),即構(gòu)造函數(shù)重載。這樣就為在不同情況下創(chuàng)建對象的特定初始化需要提供了實現(xiàn)手段。也就是說,在類對象定義時,編譯器可以依據(jù)創(chuàng)建對象所需要的參數(shù)差異確定調(diào)用構(gòu)造函數(shù)的哪一個版本來創(chuàng)建類對象。例3-1-1 定義一個有兩個構(gòu)造函數(shù)的類,并使用不同構(gòu)造函數(shù)定義對象。第53頁,共143頁,2022年,5月20日,8點28分,星期二3.4.3 使用缺省參數(shù)值的構(gòu)造函數(shù) 與其他函數(shù)一樣,構(gòu)造函數(shù)的參數(shù)也可以具有缺省值,表示類對象的某些屬性在大多數(shù)
36、情況下是預(yù)先可以確定的缺省狀態(tài),例如計數(shù)器的初值一般為 “0”、戰(zhàn)士的性別多數(shù)為 “男”、大學(xué)教師的學(xué)位一般為 “碩士”等。構(gòu)造函數(shù)的缺省參數(shù)值的定義和使用規(guī)則與其他帶缺省參數(shù)值的函數(shù)相同。例3-1-2 描述了如何聲明,定義和使用帶有缺省參數(shù)值的類構(gòu)造函數(shù)。第54頁,共143頁,2022年,5月20日,8點28分,星期二歸納構(gòu)造函數(shù)使用缺省參數(shù)值的編程要點是: 指定缺省參數(shù)值只能在構(gòu)造函數(shù)的聲明中,而不能出現(xiàn)在構(gòu)造函數(shù)定義的首部。構(gòu)造函數(shù)定義在類定義體中的情況除外。 函數(shù)聲明中的參數(shù)可以省略參數(shù)名,此時指定缺省參數(shù)值的格式為:類型名 = 缺省值。例如:Box(int = 10, int = 1
37、0, int = 10); 如果構(gòu)造函數(shù)的全部參數(shù)都指定了缺省值,應(yīng)該避免再定義一個無參數(shù)的構(gòu)造函數(shù)。因為在定義構(gòu)造函數(shù)時,編譯器會認(rèn)為可能是重復(fù)定義。例如:Box();Box(int = 10, int = 10, int = 10);第55頁,共143頁,2022年,5月20日,8點28分,星期二更重要的是定義類對象時,遇到如下情況:Box box1;編譯器無法確定調(diào)用哪一個構(gòu)造函數(shù)版本來創(chuàng)建類對象。 如果構(gòu)造函數(shù)的全部參數(shù)都指定了缺省值,就容易在重載構(gòu)造函數(shù)時造成二義性。例如:Box(int = 10, int = 10, int = 10);Box();Box(int, int);因此
38、,應(yīng)避免全部參數(shù)都指定了缺省值。例如:Box();Box(int, int = 10, int = 10);Box(int, int);第56頁,共143頁,2022年,5月20日,8點28分,星期二3.4.4 用參數(shù)初始化表對數(shù)據(jù)成員初始化 所謂參數(shù)初始化是指系統(tǒng)在為類對象的各個數(shù)據(jù)成員分配內(nèi)存空間的同時能按照用戶通過參數(shù)指定的值為數(shù)據(jù)成員賦值,而不是在各個數(shù)據(jù)成員的內(nèi)存空間分配完成后,再對它們進(jìn)行賦值。這就需要通過一種語法格式,即參數(shù)初始化表,使編譯器能按照上述要求實現(xiàn)對類對象的各個數(shù)據(jù)成員的初始化。構(gòu)造函數(shù)參數(shù)初始化表的一般形式為:: 基類初始化列表,屬性初始化列表第57頁,共143頁,
39、2022年,5月20日,8點28分,星期二其中基類初始化列表只有在派生類的構(gòu)造函數(shù)初始化表才會存在,這一部分將在第五章中介紹。屬性初始化列表由若干個屬性初始化項組成,項間用 “,” 隔開:屬性初始化項1, 屬性初始化項2, 屬性初始化項n每個屬性初始化項的一般格式為:屬性名(參數(shù)列表)不難看出,屬性初始化項的含義是調(diào)用相應(yīng)的屬性類的具有參數(shù)的構(gòu)造函數(shù)用于屬性對象的創(chuàng)建和賦初值操作。第58頁,共143頁,2022年,5月20日,8點28分,星期二這從另一個角度告訴我們,一個構(gòu)造函數(shù)的定義中沒有出現(xiàn)初始化表意味著使用了隱含的初始化表,該表的功能是分別調(diào)用了相應(yīng)類的無參數(shù)(或有缺省參數(shù)值)構(gòu)造函數(shù)完
40、成類對象的基類部分和各個屬性對象創(chuàng)建和賦初值。例3-1-3 是將例3-1-1中的類構(gòu)造函數(shù)改寫為使用參數(shù)初始化表實現(xiàn)類對象各數(shù)據(jù)成員的初始化。雖然兩個實例中對類對象的數(shù)據(jù)成員初始化的結(jié)果是完全相同的,但兩種初始化方法對數(shù)據(jù)成員的賦值的時間和方法是完全不同的。第59頁,共143頁,2022年,5月20日,8點28分,星期二在構(gòu)造函數(shù)定義中使用初始化表另一個非常重要的原因就是對于類對象的常數(shù)據(jù)成員、引用數(shù)據(jù)成員的初始化就必須在創(chuàng)建的同時進(jìn)行賦值操作,而不能在函數(shù)體中進(jìn)行賦值。例如:class A public:A(int i);const int& ref;/ 常引用數(shù)據(jù)成員private:con
41、st int a;/ 常數(shù)據(jù)成員;A:A(int i) : a(i), ref(a) 第60頁,共143頁,2022年,5月20日,8點28分,星期二3.4.5 拷貝構(gòu)造函數(shù) 拷貝構(gòu)造函數(shù)是一個特定的構(gòu)造函數(shù)。該構(gòu)造函數(shù)與其他構(gòu)造函數(shù)在形式上的差別僅在于函數(shù)的參數(shù)必須是同類型對象的常引用??截悩?gòu)造函數(shù)的原型格式如下:類型名(const 類型名& 引用名);拷貝構(gòu)造函數(shù)的功能是創(chuàng)建一個新對象,并將參數(shù)所引用對象的各個數(shù)據(jù)成員值復(fù)制到新對象的對應(yīng)的數(shù)據(jù)成員域中。第61頁,共143頁,2022年,5月20日,8點28分,星期二 系統(tǒng)會為每個類缺省定義一個拷貝構(gòu)造函數(shù),也允許用戶定義一個拷貝構(gòu)造函數(shù),
42、用以取代缺省的拷貝構(gòu)造函數(shù)。一般情況下,使用系統(tǒng)定義的缺省拷貝構(gòu)造函數(shù)就可以滿足類對象的復(fù)制操作,但在有些情況下,用戶必須定義自己的拷貝構(gòu)造函數(shù)。例如:class string int length;char *str;/ 指針數(shù)據(jù)成員public:string(int len); ;第62頁,共143頁,2022年,5月20日,8點28分,星期二string:string(int len) length = len; str = new charlen + 1;/ 指針數(shù)據(jù)成員指向動態(tài)分配的內(nèi)存空間main() string s1(10);/ 創(chuàng)建一個 string 對象 s1string
43、s2(s1);/ 復(fù)制 s1 到新 string 對象 s2第63頁,共143頁,2022年,5月20日,8點28分,星期二 在這種情況下,s1 和 s2 的指針數(shù)據(jù)成員 str 指向了同一內(nèi)存空間,使得通過 str 對該內(nèi)存空間的任何操作都不能保持應(yīng)有的獨立性。更嚴(yán)重的是當(dāng) s1 和 s2 之中有一個被撤消時,在堆中分配的內(nèi)存空間被撤消回收,使得另一個 string 對象的指針數(shù)據(jù)成員 str 成為無效指針,任何通過該指針的操作均為非法操作,會導(dǎo)致嚴(yán)重的運行錯誤。造成這一問題的原因是系統(tǒng)提供的缺省拷貝構(gòu)造函數(shù)不能復(fù)制 string 對象。因此,在這種情況下必須定義自己的拷貝構(gòu)造函數(shù):leng
44、thstrs1lengthstrs2第64頁,共143頁,2022年,5月20日,8點28分,星期二string:string(const string &s)length = s.length;str = new charlength + 1;strcpy(str, s.str);Java 沒有 C+ 那種含義的指針,也沒有拷貝構(gòu)造函數(shù)。同時,對象的撤消是由垃圾收集器完成的,因此也不會產(chǎn)生像 C+ 中那樣的問題。當(dāng)然在 Java 中也可以用賦值運算符 “=” 來進(jìn)行對象賦值,但是,這并不意味著一個簡單賦值操作所具有的直覺含義。例如:第65頁,共143頁,2022年,5月20日,8點28分,星
45、期二class Userpublic string name;class Test public static void main(String args) User u1 = new User(“ariel”, 112);();/ arielUser u2 = u1; = “muriel”;();/ muriel第66頁,共143頁,2022年,5月20日,8點28分,星期二 顯然,這里的 u2 = u1 只是對對象引用的復(fù)制。由于 u1 和 u2 引用同一個 User 對象,所以才會導(dǎo)致修改 實際上等價于 對 的修改
46、(這與 C+ 中兩個指針指向同一個對象的情況類似)。如果要完成直覺意義上的復(fù)制,就必須通過實現(xiàn) User 類的克隆接口 Cloneable 后,調(diào)用逐字節(jié)復(fù)制的克隆函數(shù) clone() 完成。例如:第67頁,共143頁,2022年,5月20日,8點28分,星期二class User implements Cloneable public string name;class Test public static void main(String args) User u1 = new User (“ariel”, 112); System.out.println ();/ arie
47、lUser u2 = (User)u1.clone(); = “muriel”; System.out.println ();/ ariel 第68頁,共143頁,2022年,5月20日,8點28分,星期二3.5 析構(gòu)函數(shù)對象撤消時,也需要一種操作,使被撤消的對象從程序的數(shù)據(jù)區(qū)中合法消失。實現(xiàn)這一操作的成員函數(shù)稱為析構(gòu)函數(shù),該函數(shù)要完成的操作包括: 回收被撤消對象數(shù)據(jù)成員所占用的內(nèi)存; 根據(jù)需要完成回收被撤消對象數(shù)據(jù)成員所占內(nèi)存之 前的必要操作。析構(gòu)函數(shù)也是類必須擁有的特殊成員函數(shù),該函數(shù)從定義形式到使用場合和方法上都與構(gòu)造函數(shù)相似,主要特點表現(xiàn)在以下幾個方面:第6
48、9頁,共143頁,2022年,5月20日,8點28分,星期二 析構(gòu)函數(shù)名必須是類名加字符 “” 前綴,否則編譯器將會把它當(dāng)作一般成員函數(shù)對待。例如:class Studentpublic: Student(); ;Student:Student() 第70頁,共143頁,2022年,5月20日,8點28分,星期二 析構(gòu)函數(shù)沒有返回值,因此,聲明和定義析構(gòu)函數(shù) 時都不能說明它的返回類型; 系統(tǒng)總會為類提供一個隱含的缺省析構(gòu)函數(shù)。該析 構(gòu)函數(shù)實際上是一個空定義體函數(shù),因此只能撤消 回收對象所占用的空間。 如果在對象被撤消之前無須做必要的預(yù)處理操作, 則可以放心使用缺省析構(gòu)函數(shù)。但在有些情況下, 則
49、必須定義自己析構(gòu)函數(shù)。析構(gòu)函數(shù)一旦顯式定義,缺省析構(gòu)函數(shù)將被覆蓋。例如:第71頁,共143頁,2022年,5月20日,8點28分,星期二 class string int length;char *contents; public:string(char *s);/ 聲明構(gòu)造函數(shù)string();/ 聲明析構(gòu)函數(shù) ; 類 string 的對象在撤消之前需要先檢查指針類型屬性 contents 是否指向有效的內(nèi)存空間,如果是,則應(yīng)回收所占用的內(nèi)存空間。因此,必須重新定義析構(gòu)函數(shù),取代系統(tǒng)隱含定義的缺省析構(gòu)函數(shù)。 string 類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的操作可以按如下定義:第72頁,共143頁,20
50、22年,5月20日,8點28分,星期二 string:string(char *s)/ 定義構(gòu)造函數(shù) if(s) length = strlen(s); contents = new charlength + 1;/ 分配存儲 strcpy(contents, s);/ 字串賦值 else length = 0; contents = 0;/ 設(shè)置指針數(shù)據(jù)成員為空 第73頁,共143頁,2022年,5月20日,8點28分,星期二 string:string()/ 定義析構(gòu)函數(shù) if(contents) delete contents;/ 釋放 contents 指向的內(nèi)存空間 在程序運行過程中
51、,類對象是在退出其作用域時才 被析構(gòu)的。也就是說,此時類對象的析構(gòu)函數(shù)被調(diào) 用。 析構(gòu)函數(shù)在類對象撤消時由系統(tǒng)自動執(zhí)行,不需要 用戶調(diào)用,也不能由用戶直接調(diào)用。第74頁,共143頁,2022年,5月20日,8點28分,星期二 不能為析構(gòu)函數(shù)定義函數(shù)指針,也不能獲取析構(gòu)函 數(shù)的調(diào)用地址。 基類的析構(gòu)函數(shù)不能被派生類繼承。 析構(gòu)函數(shù)可以聲明為虛函數(shù),并且提倡聲明為虛函 數(shù)(詳細(xì)原因在第六章 運行多態(tài)性中講述)。返回第75頁,共143頁,2022年,5月20日,8點28分,星期二3.6 對象的動態(tài)創(chuàng)建和釋放 與預(yù)定義類型一樣,自定義類型也可以使用運算符new 動態(tài)創(chuàng)建對象和使用運算符 delete
52、撤消類對象。例3-2 描述了動態(tài)創(chuàng)建、撤消和使用 point 類對象。注意:1 使用無參數(shù)或具有缺省參數(shù)值的構(gòu)造函數(shù)動態(tài)創(chuàng)建類對象(即創(chuàng)建對象時不傳遞初始值)的格式為:new 類型名; 例如, point *p = new point;而不應(yīng)寫成:new 類型名(); 例如, point *p = new point();上述格式與動態(tài)創(chuàng)建系統(tǒng)預(yù)定義類型變量的格式完全一致(預(yù)定義類型無缺省初始值)。例如:int *p = new int;第76頁,共143頁,2022年,5月20日,8點28分,星期二2 使用有參數(shù)的構(gòu)造函數(shù)動態(tài)創(chuàng)建類對象(即創(chuàng)建對象時傳遞初始值)的格式為:new 類型名(初始
53、值); 例如,point *p = new point(10,20);上述格式與動態(tài)創(chuàng)建系統(tǒng)預(yù)定義類型變量并傳遞初始值的格式完全一致。例如:int *p = new int(10);第77頁,共143頁,2022年,5月20日,8點28分,星期二例3-3 通過構(gòu)造函數(shù)對對象數(shù)組進(jìn)行初始化。對象數(shù)組初始化的方法一般有兩種:1 使用缺省構(gòu)造函數(shù)創(chuàng)建對象數(shù)組后,調(diào)用一個專門用于初始化的成員函數(shù)對數(shù)組中的每個對象分別進(jìn)行初始化。該方法雖然必須分兩步完成對象數(shù)組的創(chuàng)建和初始化,但可以將對象數(shù)組中的元素初始化為任意值。2 定義一個帶缺省值參數(shù)的構(gòu)造函數(shù)。使得在創(chuàng)建對象數(shù)組的同時,由構(gòu)造函數(shù)的缺省參數(shù)值完成
54、數(shù)組中的每個對象對象的初始化。使用該方法創(chuàng)建和初始化對象數(shù)組簡單、方便,但只能將對象數(shù)組中的每個元素初始化為固定的缺省值。返回第78頁,共143頁,2022年,5月20日,8點28分,星期二3.7 對象的賦值與復(fù)制1 對象的賦值對象的賦值只能發(fā)生在同類型對象之間的,這與系統(tǒng)預(yù)定義類型變量的賦值是一致的。對象賦值的一般格式為:對象名1 = 對象名2;賦值操作是由賦值運算符 “=” 完成的,該運算符(函數(shù))的功能是將對象名2 所指示對象的各個數(shù)據(jù)成員值依次傳遞給對象名1 所指示對象的各個數(shù)據(jù)成員,使對象1 與對象2 完全相同。第79頁,共143頁,2022年,5月20日,8點28分,星期二系統(tǒng)會為
55、每一個自定義類型自動添加一個隱含的缺省賦值運算符,因此一般的自定義類型不必顯式定義賦值運算符。但如果類定義中包含有指針類屬性( 拷貝構(gòu)造函數(shù)中已經(jīng)討論這種情況),則必須顯式定義賦值運算符用于取代隱含的缺省賦值運算符。如何定義賦值運算符將在第五章中討論。例3-2-1 描述了使用缺省賦值運算符完成對象的賦值操作。第80頁,共143頁,2022年,5月20日,8點28分,星期二2 對象的復(fù)制對象的復(fù)制是指按照一個已經(jīng)存在的對象創(chuàng)建一個與該對象完全相同的新對象。顯然對象的復(fù)制操作是由類的拷貝構(gòu)造函數(shù)完成的,復(fù)制一個已有對象的一般形式為:類型名 對象2(對象1);例如,Box box2(box1);在
56、C+ 中上述復(fù)制也適用于預(yù)定義類型,即每個預(yù)定義類型都有一個隱含的拷貝構(gòu)造函數(shù)。例如,int a(10), b(a);第81頁,共143頁,2022年,5月20日,8點28分,星期二C+ 還提供了另外一種方便用戶的復(fù)制表達(dá)式,即用賦值運算符代替括號調(diào)用類的拷貝構(gòu)造函數(shù):類型名 對象2 = 對象1;例如,Box box2 = box1; 顯然,這種復(fù)制形式與預(yù)定義類型變量賦值定義形式是一致的。例如,int a = 10, b = a;程序中需要對象復(fù)制操作的情況有三種: 用戶需要定義與已有對象完全一致的新對象。 函數(shù)調(diào)用時,系統(tǒng)需要復(fù)制被傳遞的實參對象。 函數(shù)返回時,系統(tǒng)會復(fù)制被返回的操作結(jié)果。
57、返回第82頁,共143頁,2022年,5月20日,8點28分,星期二3.8 與對象有關(guān)的指針指針變量可以用于指向任何預(yù)定義類型變量,當(dāng)然也可以指向自定義類型對象。不僅如此,指針變量還可以指向?qū)ο蟮念惓蓡T。1 指向?qū)ο蟮闹羔樁x指向?qū)ο蟮闹羔樧兞康囊话阈问剑侯愋兔?*對象指針名;例如,Box *pt;顯然,這與定義預(yù)定義類型指針的形式是完全一致的。同樣,指針的使用形式也是相同的。例如:pt = new Box;pt-volume();/ 與 (*pt).volume(); 等價第83頁,共143頁,2022年,5月20日,8點28分,星期二2 指向?qū)ο蟪蓡T的指針對象的成員有數(shù)據(jù)成員和成員函數(shù)兩種
58、,因此指向?qū)ο蟪蓡T的指針也有兩種。 指向數(shù)據(jù)成員的指針 定義指向數(shù)據(jù)成員的指針變量的一般形式: 類型名 *指針變量名; 顯然,這與定義預(yù)定義類型指針是完全一致的。 同樣,指針的使用形式也是相同的。例如: class Time public:int hour, minute, sec;void show(); ;第84頁,共143頁,2022年,5月20日,8點28分,星期二 void Time:show() cout hour “:” minute “:” sec *成員函數(shù)指針)(實參列表); 例如,Time *pt = &time;(pt-*pf)();第86頁,共143頁,2022年,5
59、月20日,8點28分,星期二3 this 指針 this 指針是類成員函數(shù)擁有的一個隱含指針,它指向 該成員函數(shù)被調(diào)用時,操作所施加的類對象地址, 實現(xiàn)不同對象的相同行為的表現(xiàn)差異。如圖所示:成員函數(shù) this數(shù)據(jù)成員類對象1數(shù)據(jù)成員類對象2數(shù)據(jù)成員類對象n第87頁,共143頁,2022年,5月20日,8點28分,星期二成員函數(shù)通過 this 指針可以訪問所指對象中的類成員,數(shù)據(jù)成員的訪問格式可寫為:this-數(shù)據(jù)成員名成員函數(shù)的訪問格式可寫成:this-成員函數(shù)名(參數(shù)列表)例如:第88頁,共143頁,2022年,5月20日,8點28分,星期二class exth int i;public:
60、void load(int val) this-i = val; / 與 i = val; 等價int get() return this-i; / 與 return i; 等價;void main()exth obj;obj.load(100);cout x = x;this-y = y;當(dāng)然,這種問題也可以用如下方法解決:point:point(int x, int y)point:x = x;point:y = y;第90頁,共143頁,2022年,5月20日,8點28分,星期二 為了進(jìn)一步了解成員函數(shù)被調(diào)用時 this 指針是如何 在 “幕后” 工作的,我們再來分析一段程序: clas
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年教育環(huán)境下《馬鈞傳》教案設(shè)計
- 互聯(lián)網(wǎng)工程專家之路:2024培訓(xùn)課程
- 2023年中級注冊安全工程師之安全生產(chǎn)管理綜合檢測試卷A卷含答案
- 專題02 可數(shù)名詞的復(fù)數(shù)變化形式精講課件初中英語語法課件
- 2024年教育技術(shù)展望:基于AI的《六國論》課件革新
- 2024年教育創(chuàng)新:《母雞》互動游戲設(shè)計
- 《晚春》教案設(shè)計新趨勢與2024教學(xué)策略預(yù)測
- 2023年度淄博市職業(yè)技能大賽競賽方案(網(wǎng)站設(shè)計與開發(fā))
- 2024年OBD遠(yuǎn)程培訓(xùn)與技術(shù)交流
- 2024新趨勢:Photoshop去水印技能全面解析
- 腹腔鏡手術(shù)操作技巧
- 品牌礦泉水物質(zhì)表
- 2024年中國移動重慶分公司招聘筆試參考題庫含答案解析
- 污水源熱泵方案
- QCT 1037-2016 道路車輛用高壓電纜
- 現(xiàn)代交換原理與通信網(wǎng)技
- 全科醫(yī)生臨床常見病門急診病歷模板(范例)
- GH/T 1421-2023野生食用菌保育促繁技術(shù)規(guī)程塊菌(松露)
- 商業(yè)綜合體停車收費管理詳細(xì)規(guī)定
- 健康管理專業(yè)職業(yè)生涯規(guī)劃書
- 滑膜炎的知識宣教
評論
0/150
提交評論