C++類的定義及其應(yīng)用_第1頁
C++類的定義及其應(yīng)用_第2頁
C++類的定義及其應(yīng)用_第3頁
C++類的定義及其應(yīng)用_第4頁
C++類的定義及其應(yīng)用_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

準(zhǔn)備知識:⑴命名空間(namespace一個軟件往往由多個模塊組成,其中會包括由不同程序員開發(fā)的組件以及類庫提供的組件,因此,在對標(biāo)識符命名時有可能發(fā)生沖突。一個命名空間將不同的標(biāo)識符集合在一個命名的作用域內(nèi),以防止命名沖突。比如以如下形式聲明一個命名空間s:namespaces{classA{};voidfun();}則引用標(biāo)識符的方式如下s::Aa;s::fun();即在標(biāo)識符前加命名空間名稱及“::”的前綴E1_1如果使用聲明:usingnamespace<已命名的命名空間名稱〉;比如:usingnamespaces;該命令用來打開命名空間的限制,則該命名空間中所有的標(biāo)識符在當(dāng)前作用域中都可以直接使用,不需要任何前綴。E1_2在C++標(biāo)準(zhǔn)程序庫中,使用了命名空間std,所有標(biāo)識符都聲明在命名空間std中。在使用C++標(biāo)準(zhǔn)程序庫中的任何標(biāo)識符時,可以直接指定標(biāo)識符所屬的命名空間,例如:std::cout,也可以使用using命令來打開命名空間的限制。C++標(biāo)準(zhǔn)程序庫中中的頭文件不再有“?h”的擴展名,因此,在程序開始處使用#include<iostream>、#include<cstdio>、#include<cstring>等包含命令時,可以使用usingnamespacestd;命令打開命名空間的限制。E1_3在VisualC++6.0編譯環(huán)境中要使用一系列的I/O流類,就應(yīng)該包含頭文件iostream。⑵對象:現(xiàn)實世界中的一切事物都是對象,對象可以是有形的,比如一間房間,一本書籍;也可以是無形的,比如一個計劃。對象可以是一個簡單的個體,比如一個學(xué)生;也可以是由其它對象組合而成,比如一個公司有多個部門,每個部門又由許多員工組成。對類似的對象進行抽象,找出共同的屬性就可以構(gòu)成一種類形。作為面向?qū)ο蟮某绦蛟O(shè)計語言,C++支持“抽象”。將抽象后的數(shù)據(jù)和函數(shù)“封

裝”在一起,就構(gòu)成了C++的“類”。⑶在面向過程的結(jié)構(gòu)化程序設(shè)計中,程序的模塊是由函數(shù)構(gòu)成的。函數(shù)將邏輯上相關(guān)的語句和數(shù)據(jù)封裝,用于完成特定的功能。在面向?qū)ο蟮某绦蛟O(shè)計中,程序的模塊是由類構(gòu)成的。類是對邏輯上相關(guān)的函數(shù)和數(shù)據(jù)的封裝,是對問題的抽象描述。即將抽象得到的數(shù)據(jù)和函數(shù)有機的結(jié)合成一個整體,形成“類”。其中的數(shù)據(jù)和函數(shù)都是類的成員。類實際上相當(dāng)于一種用戶自定義的類型,在定義一個類時要說明其數(shù)據(jù)和操作內(nèi)容。就象一個鐘表,是“鐘類”的一個實例。它調(diào)節(jié)時間的裝置是“外部接口”,同時,其內(nèi)部的各個部件有機的進行工作,但是外界是不能干預(yù)的。類的定義:class就象一個鐘表,是“鐘類”的一個實例。它調(diào)節(jié)時間的裝置是“外部接口”,同時,其內(nèi)部的各個部件有機的進行工作,但是外界是不能干預(yù)的。類的定義:class類名稱標(biāo)識符{成員列表:包括數(shù)據(jù)成員和成員函數(shù)的定義及存取控制類別。};類成員函數(shù)的實現(xiàn)其中:成員列表:數(shù)據(jù)成員(屬性),成員函數(shù)(行為方法)。成員的存取控制類別:private:除了友元函數(shù)外,類的外界(對象)不能直接訪問該類別成員,只有類定義中的成員函數(shù)或數(shù)據(jù)成員可以訪問該類別成員。在類定義中private:若緊接著類名稱,該關(guān)鍵字可以省略。※很好的體現(xiàn)了類的封裝特性。public:類的外界(對象)可以直接訪問該類別成員,并且可以通過該類別成員訪問private類別的類成員?!x了類的外部接口。protected:在涉及類繼承時使用。※類成員的存取控制類別定義沒有先后順序。作用域說明符:::用于說明類成員的歸屬。比如:類定義中的成員函數(shù)的定義在類定義中完成,而成員函數(shù)的實現(xiàn)通常是在類定義外完成的。所以,要使用作用域說明符來說明成員函數(shù)歸屬于那一個類。當(dāng)然,類定義中的成員函數(shù)的實現(xiàn)也可以在類定義中完成,但是,這樣的函數(shù)通常只包含簡單的順序結(jié)構(gòu)的語句(見內(nèi)聯(lián)函數(shù))?!禖++程序設(shè)計》一一類的定義及使用 丄類的使用:定義類的對象(類的對象是類定義的實例)。類對象的建立(分配存儲空間)需要構(gòu)造,釋放內(nèi)存空間需要析構(gòu)。構(gòu)造函數(shù):在創(chuàng)建對象時,利用特定值將對象初始化為一個特定的狀態(tài)。構(gòu)造函數(shù)在對象被創(chuàng)建時被自動調(diào)用,沒有函數(shù)返回值。在類的public成員中可以定義有多個參數(shù)數(shù)量及參數(shù)類型不同的構(gòu)造函數(shù),函數(shù)名稱即為類的名稱。YSC1-1、YSC1-2構(gòu)造函數(shù)執(zhí)行步驟:⑴按照初始化列表為相應(yīng)屬性賦初值,如果成員為對象,按照給定的初始值執(zhí)行該對象的構(gòu)造函數(shù)。⑵執(zhí)行構(gòu)造函數(shù)的函數(shù)體語句。YSC1-3、YSC1-4※若在類的定義中沒有定義構(gòu)造函數(shù),C++編譯器將自動產(chǎn)生缺省的構(gòu)造函數(shù)。該函數(shù)無參,也不做任何實質(zhì)性的工作。因為在對象被創(chuàng)建時自動調(diào)用構(gòu)造函數(shù)是“例行公事”。析構(gòu)函數(shù):用于完成對象生存期結(jié)束前的一些清理工作。函數(shù)調(diào)用結(jié)束,對象在內(nèi)存中所占內(nèi)存空間被釋放。析構(gòu)函數(shù)在對象的生存期即將結(jié)束時被自動調(diào)用,沒有參數(shù)和函數(shù)返回值。在類的public成員中可以定義一個(只能是一個)析構(gòu)函數(shù),函數(shù)名稱為在類的名稱前加符號“~”。YSC1-1、YSC1-2析構(gòu)函數(shù)執(zhí)行步驟:若程序中有多個類對象存在,對象析構(gòu)時的順序與構(gòu)造的順序相反。YSC1-5※若在類的定義中沒有定義析構(gòu)函數(shù),C++編譯器將自動產(chǎn)生缺省的析構(gòu)函數(shù)。該函數(shù)無參,也不做任何實質(zhì)性的工作。因為在對象被創(chuàng)建時自動調(diào)用析構(gòu)函數(shù)同樣是“例行公事”?!鶚?gòu)造函數(shù)和析構(gòu)函數(shù)無函數(shù)返回值,所以,該函數(shù)也無須定義函數(shù)類型?!粲袆討B(tài)分配內(nèi)存的操作,定義構(gòu)造函數(shù)和析構(gòu)函數(shù)是十分必要的還可以根據(jù)需要在類定義中定義拷貝構(gòu)造函數(shù)和賦值函數(shù)。拷貝構(gòu)造函數(shù):特殊的構(gòu)造函數(shù)。調(diào)用拷貝構(gòu)造函數(shù)的情況:⑴當(dāng)用已經(jīng)存在(構(gòu)造完畢)的同類對象(初始值對象)的引用作為參數(shù),初始化構(gòu)造新建立的對象時將調(diào)用拷貝構(gòu)造函數(shù)。函數(shù)是在構(gòu)造新的對象時被調(diào)用執(zhí)行的。函數(shù)的參數(shù)必須是同類對象的引用。出 《C++程序設(shè)計》一一類的定義及使用YSC1-6-1YSC1-6T程序中Ak(h);語句調(diào)用A(constA&a){x=a.x+2;y=a.y+4;}函數(shù)的執(zhí)行。const表示不能在函數(shù)語句中修改參數(shù)對象。⑵如果函數(shù)的形參是類的對象,調(diào)用函數(shù)時,實參給形參參數(shù)傳遞賦值時將調(diào)用拷貝構(gòu)造函數(shù)。YSC1-6-2⑶如果函數(shù)的返回值是類的對象,函數(shù)執(zhí)行結(jié)束完成返回時將調(diào)用拷貝構(gòu)造函數(shù)。YSC1-6-3YSC1-6-3程序中k對象是函數(shù)f()中的局部對象,函數(shù)f()執(zhí)行結(jié)束就不存在了。編譯系統(tǒng)會在主調(diào)函數(shù)的主函數(shù)中創(chuàng)建一個“臨時無名對象”,該臨時對象的生存期只在調(diào)用語句的表達式h=f()中。執(zhí)行returnk;語句時,實際上是調(diào)用拷貝構(gòu)造函數(shù)將k的值拷貝到臨時對象中。函數(shù)f()執(zhí)行結(jié)束時k對象釋放(注意:該對象要析構(gòu)),但是,臨時對象存在于表達式h=f()中。計算完該表達式后,臨時對象的工作也就完成而被釋放了(注意:該臨時對象要析構(gòu))。⑷如果被拷貝的對象本體與參數(shù)對象的實體是一致的,則無須定義拷貝構(gòu)造函數(shù),利用編譯系統(tǒng)生成的缺省函數(shù)即可完成拷貝構(gòu)造(淺拷貝)。而被拷貝的對象本體與參數(shù)對象的實體是不一致的,則必須定義拷貝構(gòu)造函數(shù)(深拷貝)。YSC1-7YSC1-7程序中類定義中包含指針成員,申請動態(tài)內(nèi)存空間,應(yīng)在類中定義拷貝構(gòu)造函數(shù),在拷貝數(shù)據(jù)時將調(diào)用拷貝構(gòu)造函數(shù)。這樣可以避免產(chǎn)生“兩次析構(gòu)”同一數(shù)據(jù)的錯誤產(chǎn)生?!粼陬惖亩x中沒有定義拷貝構(gòu)造函數(shù),C++編譯器將自動產(chǎn)生缺省的拷貝構(gòu)造函數(shù)。該函數(shù)的功能是把初始值對象的每個數(shù)據(jù)成員的值等值賦值給新建立對象的數(shù)據(jù)成員。類的組合:類的組合描述的是類定義中嵌有其它類的對象作為成員的情況,這是一種包含和被包含的關(guān)系。當(dāng)創(chuàng)建類的對象時,如果該類具有內(nèi)嵌對象成員,則各內(nèi)嵌對象將首先被自動創(chuàng)建。因此,在創(chuàng)建對象(組合類的對象)時,既要對本類的基本類型的數(shù)據(jù)進行初始化,又要對內(nèi)嵌對象的成員進行初始化。在創(chuàng)建一個組合類的對象時,不僅其自身的構(gòu)造函數(shù)將被調(diào)用,而且,還將調(diào)用其內(nèi)嵌對象的構(gòu)造函數(shù),構(gòu)造函數(shù)的調(diào)用順序是:⑴按照組合類中內(nèi)嵌對象的書寫順序調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)。⑵執(zhí)行組合類構(gòu)造函數(shù)的函數(shù)體。如果定義組合類對象時未指定對象的初值,則默認形式(無形參)的構(gòu)造函《C++程序設(shè)計》一一類的定義及使用 壬數(shù)被調(diào)用,此時內(nèi)嵌對象的默認形式構(gòu)造函數(shù)也被調(diào)用。析構(gòu)函數(shù)的調(diào)用執(zhí)行順序與構(gòu)造的調(diào)用執(zhí)行順序相反。如果定義組合類時未定義拷貝構(gòu)造函數(shù),則C++編譯器將自動產(chǎn)生缺省的拷貝構(gòu)造函數(shù),且調(diào)用缺省的拷貝構(gòu)造函數(shù)時系統(tǒng)將調(diào)用內(nèi)嵌對象成員的拷貝構(gòu)造函數(shù)。如果定義組合類時定義拷貝構(gòu)造函數(shù),則需要為內(nèi)嵌對象成員的拷貝構(gòu)造函數(shù)傳遞參數(shù)。YSC1-8賦值函數(shù):用已經(jīng)存在(構(gòu)造完畢)的同類對象的引用作為參數(shù),向已經(jīng)存在(構(gòu)造完畢)的同類對象做賦值操作時將調(diào)用賦值函數(shù)。該函數(shù)實際上是對“=”的操作符重載,尤其當(dāng)類中含有指針成員時,必須對對象的賦值操作定義賦值函數(shù)。YSC1-9、YSC1-10YSC1-9程序中h=g;語句調(diào)用A&operator=(constA&a)函數(shù)的執(zhí)行。const表示不能在函數(shù)語句中修改參數(shù)對象。h對象是調(diào)用該函數(shù)的對象,g對象是該函數(shù)的參數(shù)對象。該函數(shù)作為類的成員函數(shù)形式定義,必須有一個返回值。由于,函數(shù)定義時將函數(shù)定義為對象的引用(&),所以,語句return*this;返回h對象的引用值。該函數(shù)中的this指針是個隱含于每個成員函數(shù)中的特殊指針,他指向正在被該函數(shù)操作的對象,在YSC1-9程序中為對象h。YSC1-11YSC1-11程序中的語句if(this==&s)return*this;是在檢查是否為自賦值。語句delete[]p;先釋放指針變量p原指向的內(nèi)存單元,然后在后續(xù)語句中重新申請分配內(nèi)存?!粼陬惖亩x中沒有定義賦值函數(shù),C++編譯器將自動產(chǎn)生缺省的賦值函數(shù)。該函數(shù)的功能是把表達式賦值號右側(cè)對象的每個數(shù)據(jù)成員的值等值賦值給賦值號左側(cè)對象的數(shù)據(jù)成員(這樣做要慎重!)。內(nèi)聯(lián)函數(shù):類定義中成員函數(shù)可以定義成內(nèi)聯(lián)函數(shù),方法是在函數(shù)定義前加關(guān)鍵字inline。在普通函數(shù)調(diào)用時將程序轉(zhuǎn)到被調(diào)函數(shù)的內(nèi)存地址中,結(jié)束后再返回,這樣做存在有時間及空間上的開銷。函數(shù)內(nèi)聯(lián)是將函數(shù)體在編譯時來替換調(diào)用函數(shù)的語句,也就沒有“轉(zhuǎn)來轉(zhuǎn)去”的開銷了,但是這樣做增加了程序目標(biāo)代碼量。因此,內(nèi)聯(lián)函數(shù)是為解決函數(shù)調(diào)用的效率問題。在內(nèi)聯(lián)函數(shù)中不允許包含循環(huán)和開關(guān)語句,內(nèi)聯(lián)函數(shù)定義必須出現(xiàn)在第一次被調(diào)用之前。通常內(nèi)聯(lián)函數(shù)中只包括簡單的順序結(jié)構(gòu)語句。并且,編譯系統(tǒng)將成員函數(shù)的實現(xiàn)在類定義中完成的函數(shù)也看成是內(nèi)聯(lián)函數(shù)。rr~t.卜q靜態(tài)數(shù)據(jù)成員:某一類的所有對象具有相同的屬性(屬性的數(shù)量、名稱及數(shù)據(jù)類型相同),但各個對象的具體屬性值各不相同,這樣的屬性可以稱為對象屬性(實例屬性)。這樣的屬性(數(shù)據(jù)成員)默認的存儲類型屬于動態(tài)型。類屬性:是描述類的所有對象共同特征的數(shù)據(jù)項,對于任何對象實例,該屬性值是相同的,即該屬性值為整個類共有,不屬于任何一個具體的隊象??梢杂胹tatic關(guān)鍵字聲明成員為靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員屬于類,被類對象所共有,該類對象均可以訪問該靜態(tài)數(shù)據(jù)成員。※靜態(tài)成員的賦初值在類外進行,只能通過類名對其進行訪問。靜態(tài)成員函數(shù):用static關(guān)鍵字聲明的成員函數(shù)也屬于整個類,由同類的所有對象共有。對于public權(quán)限的靜態(tài)成員函數(shù)可以通過類名或?qū)ο竺麃碚{(diào)用。YSC2補充:E3_1、E3_2、E3_3思考題:輸入一組整數(shù),找出并顯示最大值、最小值;顯示類加和及平均值。友元函數(shù):由于類的成員函數(shù)是以對象為中心的,必須通過對象才能調(diào)用相應(yīng)的成員函數(shù),并且,某類對象的成員函數(shù)不能直接訪問其它類對象的private成員。但是,將類A的成員函數(shù)聲明為類B的友元函數(shù),類A的對象就可以通過該友元函數(shù)直接訪問類B的對象的private成員了。如上所述,對于類B而言,它的友元函數(shù)不是其成員函數(shù),但是,它的友元函數(shù)需要在其類定義中說明,并在函數(shù)說明語句前加關(guān)鍵字friend。YSC3-1YSC3T程序中Teacher類的成員函數(shù)voids_g(Student&s)在Student類中被定義成該類的友元函數(shù):friendvoidTeacher::s_g(Student&s);如果類A是類B的友元類,則類A的所有成員函數(shù)都是類B的友元函數(shù),都可以訪問類B的private成員。YSC3-2YSC3-2程序中Teacher類在Student類中被定義成該類的友元類:friendclassTeacher;,Teacher類的成員函數(shù)均是Student類的友元函數(shù)。友元的特點:⑴友元關(guān)系不能傳遞,即如果類B是類A的友元,類C是類B的友元,但沒有其它聲明,則類A和類C之間沒有友元關(guān)系。⑵友元關(guān)系是單向的,即如果類B是類A的友元,則類B的成員函數(shù)可以訪問類A的private成員,但反之不可以。⑶友元關(guān)系不能被繼承,即如果類B是類A的友元,則類B的派生類并不會自動成為類A的友元。指針:可以定義指向類的成員及指向類對象的指針變量。對象指針變量:用于存放對象指針的指針變量。對象指針變量在使用之前要先定義,并應(yīng)進行初始化賦值,讓該指針變量明確指向一個已經(jīng)定義過的對象。通過對象的指針變量可以訪問到對象的public成員。this指針變量:是隱含于每個類的成員函數(shù)中的特殊指針變量。this指針變量用于指向正在被成員函數(shù)操作的對象。指向類的非靜態(tài)成員的指針變量:指向?qū)ο蟪蓡T的指針變量在使用之前要先定義,說明該指針變量可以指向?qū)ο笏陬惖牡某蓡T,并應(yīng)進行初始化賦值,讓該指針變量明確指向類的哪一個成員。通過該指針變量只能訪問到對象的public成員。由于類的定義中只是確定了各個數(shù)據(jù)成員的數(shù)據(jù)類型及在類中的相對位置,并不為數(shù)據(jù)成員分配具體的內(nèi)存空間。因此,在定義了指向?qū)ο蟪蓡T的指針變量后,只是說明了被賦值的指針變量是專門用于指向哪個數(shù)據(jù)成員的,同時在該指針變量中存放該數(shù)據(jù)成員在類中的相對位置。在定義了類的對象后,只要將對象的指針與指針變量中存放的相對位置結(jié)合起來就可以訪問對象的數(shù)據(jù)成員了。指向類的靜態(tài)成員的指針變量:對類的靜態(tài)成員的訪問是不用依賴于對象的,因此,可以用普通的指針變量來指向和訪問靜態(tài)成員。YSC4YSC4程序中的intA::*p=&A::c;語句定義指針變量p指向類A的數(shù)據(jù)成員c。YSC4程序中的int(A::*q)(int)=&A::f;語句定義指針變量q指向類A的成員函數(shù)f。YSC4程序中的A*k1=&x;語句定義指針變量k指向類A的對象X。因為程序運行時應(yīng)該通過定義對象來訪問類的成員,所以,如上所用指針變量,需要先定義類A的對象,然后通過對象來使用上述指針變量。如YSC4程序中的語句X.*p=6;使得對象X的成員c的值為6。k1->*p=9;使得對象x的成員c的值為9。k2->c=1;使得對象y的成員c的值為1。cout<<"(k1->*q)⑸="<<(k1->*q[⑸<<endl;輸出對象x的成員函數(shù)f的返回值?!禖++程序設(shè)計》一一繼承與派生 2繼承與派生:繼承機制是利用已有的數(shù)據(jù)類型來定義新的數(shù)據(jù)類型,使得新定義的數(shù)據(jù)類型不僅擁有自定義的成員,同時還“有條件”的擁有“舊有”的成員,從而實現(xiàn)代碼的重用和擴充。若類B繼承類A,則稱類B是類A的派生類(子類),類A是類B的基類(父類)。可以在基類中抽象定義各種方法,而在派生類中增加擴充和改進的方法和屬性。繼承的種類:一個派生類可以有一個或多個基類。只有一個基類時稱為單繼承;有多個基類時稱為多繼承。繼承的特點:⑴繼承關(guān)系可以是多級的,如類Y繼承類X,類Z繼承類Y。⑵不允許循環(huán)繼承。⑶繼承是單向的。繼承的結(jié)果:派生類對象包含兩部分數(shù)據(jù):繼承自基類的數(shù)據(jù)部分(除了構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的所有成員,實現(xiàn)了代碼的重用。)和派生類自身定義的數(shù)據(jù)部分(實現(xiàn)了代碼的擴充)。另外,還可以在派生類中定義和基類中同名的成員,從而達到對基類成員的隱藏控制。YSC5-1、YSC5-2YSC5-2程序中的類B繼承類A,B類對象g可以使用的方法除了類B中定義的函數(shù)f2以外,還可以使用類A中定義的函數(shù)fl。YSC5-2程序中并未定義A類對象。如果定義A類對象,該對象所占內(nèi)存單元為一個整型數(shù)據(jù)單元(以VisualC++編譯系統(tǒng)為例是4個字節(jié));因為類B繼承類A,所以,B類對象g所占內(nèi)存單元中分為兩個部分:繼承自基類的數(shù)據(jù)部分和派生類自身定義的數(shù)據(jù)部分(以VisualC++編譯系統(tǒng)為例是8個字節(jié))。派生類的構(gòu)造函數(shù):基類的構(gòu)造函數(shù)不能被繼承。在派生類中,如果對派生類新增的成員進行初始化,就必須要為派生類編寫新的構(gòu)造函數(shù)。派生類的構(gòu)造函數(shù)需要以恰當(dāng)?shù)某踔禂?shù)據(jù)作為參數(shù),其中一些參數(shù)要用于對派生類自身新增加的成員進行初始化,另一些參數(shù)則要傳遞給基類的構(gòu)造函數(shù),用于初始化相應(yīng)的成員。注意:如果基類定義了帶有形參表的構(gòu)造函數(shù)時,派生類就應(yīng)當(dāng)定義構(gòu)造函數(shù)。派生類對象的構(gòu)造順序:先構(gòu)造繼承數(shù)據(jù)部分,再構(gòu)造自身數(shù)據(jù)部分。第⑴步驟:首先按照派生類對象有無參數(shù)調(diào)用派生類相應(yīng)的構(gòu)造函數(shù)。第⑵步驟:a) 若該構(gòu)造函數(shù)有初始化數(shù)據(jù)列表若該初始化數(shù)據(jù)列表中對繼承數(shù)據(jù)部分和自身數(shù)據(jù)部分的初始化內(nèi)容都存在,則不論書寫順序怎樣,先調(diào)用基類的相應(yīng)構(gòu)造函數(shù)構(gòu)造繼承數(shù)據(jù)部分,然后再依次初始化自身各個部分的數(shù)據(jù)。YSC5-3-1若該初始化數(shù)據(jù)列表中只有繼承數(shù)據(jù)部分的初始化內(nèi)容,則對繼承數(shù)據(jù)部分調(diào)用基類中相應(yīng)的構(gòu)造函數(shù)完成初始化。YSC5-3-2若該初始化數(shù)據(jù)列表中只有自身數(shù)據(jù)部分的初始化內(nèi)容,則先調(diào)用基類中的無參構(gòu)造函數(shù)完成繼承數(shù)據(jù)部分的初始化,再接著完成自身數(shù)據(jù)部分的初始化。YSC5-3-3b) 若該構(gòu)造函數(shù)沒有初始化數(shù)據(jù)列表無條件調(diào)用基類中的無參構(gòu)造函數(shù)完成繼承數(shù)據(jù)部分的初始化YSC5-3-4第⑶步驟:執(zhí)行派生類對象構(gòu)造函數(shù)的函數(shù)體語句。派生類的析構(gòu)函數(shù):基類的析構(gòu)函數(shù)函數(shù)不能被繼承。派生類對象的析構(gòu):先析構(gòu)自身數(shù)據(jù)部分,再析構(gòu)繼承數(shù)據(jù)部分。派生類的拷貝構(gòu)造函數(shù):如果派生類未定義拷貝構(gòu)造函數(shù),則C++編譯器將自動產(chǎn)生缺省的拷貝構(gòu)造函數(shù),且調(diào)用缺省的拷貝構(gòu)造函數(shù)時系統(tǒng)將調(diào)用基類的拷貝構(gòu)造函數(shù)。如果派生類定義拷貝構(gòu)造函數(shù),則需要為基類相應(yīng)的拷貝構(gòu)造函數(shù)傳遞參數(shù)。單繼承的繼承方式:準(zhǔn)備知識:關(guān)于protected成員的用法:在單類的情況下,protected成員的用法與private成員的用法一致。YSC5-4⑴公有基類(classB:publicA基類的public(除了構(gòu)造函數(shù)和析構(gòu)函數(shù))成員和protected成員等價于派生類的public成員。注意:①基類對象不能訪問基類自身的private和protected成員。②基類的public和protected成員對于派生類可見。但是,基類的protected成員只能被派生類的public成員使用,而不能直接被派生類的對象使用;基類的public成員能直接被派生類的對象使用。通常,基類可以將不允許基類自身對象使用,但是,卻可以讓派生類可以使用的方法設(shè)計成protected成員,如界面程序。YSC5-5類型兼容規(guī)則:在需要基類對象的任何地方,都可以使用公有派生類對象來替代。⑴派生類對象可以給基類對象賦值。⑵派生類對象可以初始化基類的引用。⑶派生類對象的地址可以賦值給指向基類的指針?!谔娲?,派生類對象就可以作為基類的對象使用,但是,只能使用從基類繼承的成員。YSC5-6、YSC5-7、YSC5-8(2)私有基類(classB:privateA基類的public成員和protected成員等價于派生類的private成員。注意:基類的public和protected成員對于派生類可見。但是,基類的public和protected成員只能被派生類的成員函數(shù)使用,而不能直接被派生類的對象使用。YSC5-9⑶保護基類(classB:protectedA基類的public成員和protected成員等價于派生類的protected成員。如果是classB:protectedA,則此現(xiàn)象等同于private繼承,但是,若classB:publicA,然后,classC:protectedB,則protected繼承才與private繼承有所區(qū)別。YSC5-10※從類的繼承角度看,派生類的對象可以有條件的使用基類中的方法和自身所包含的繼承數(shù)據(jù)部分的屬性。丄《C++程序設(shè)計》——繼承與派生※從類的封裝角度看,不允許派生類的對象不受限制的使用繼承的數(shù)據(jù)部分,即便是使用,也應(yīng)該使用基類中定義的方法來使用繼承數(shù)據(jù)部分。派生類成員的隱藏規(guī)則:在類的派生層次結(jié)構(gòu)中,基類的成員和派生類的新增成員都具有類的作用域二者的范圍不同。如果派生類聲明了一個和基類成員同名的新成員,派生類的新成員就隱藏了基類的同名成員,直接使用成員名只能訪問到派生類的成員。再直接說,如果派生類聲明了一個和基類成員函數(shù)同名的新成員函數(shù),即使函數(shù)的參數(shù)不同,從基類繼承的同名函數(shù)的所有重載形式也會被隱藏。YSC5-11思考題:輸入學(xué)生的考試成績,顯示學(xué)位平均分。要求:學(xué)生姓名應(yīng)該去除無效字符;學(xué)生考試成績應(yīng)該進行合理性驗證?!禖++程序設(shè)計》——虛函數(shù) 壬多態(tài):針對類而言,多態(tài)是指同樣的類成員函數(shù)調(diào)用針對不同的對象有不同的實現(xiàn),即實際調(diào)用的是不同的函數(shù)。面向?qū)ο蟮亩鄳B(tài)分為:重載多態(tài):比如普通函數(shù)以及類成員函數(shù)的重載,運算符重載。強制多態(tài):比如在運算時的強制類型轉(zhuǎn)換。以上兩種多態(tài)也被稱為專用多態(tài)包含多態(tài):比如定義在不同類中的同名成員函數(shù)的多態(tài)行為,是通過虛函數(shù)來實現(xiàn)的。參數(shù)多態(tài):與類模板相關(guān)。以上兩種多態(tài)也被稱為通用多態(tài)虛函數(shù):體現(xiàn)了類的多態(tài)特性,并且引入了動態(tài)聯(lián)編的概念,是動態(tài)綁定的基礎(chǔ)。當(dāng)被調(diào)函數(shù)中的形參為基類的引用對象或?qū)ο蟮闹羔槙r才考慮虛函數(shù)使用的現(xiàn)象。繼承是虛函數(shù)使用的前提,虛函數(shù)的使用體現(xiàn)了類的多態(tài)特性。YSC6_V0YSC6_V0程序中GS類public繼承S類,但同時這兩個類均需要定義對象完成相應(yīng)的工作,其中的score函數(shù)在兩個類中的定義很相似但有區(qū)別,因此funl函數(shù)和fun2函數(shù)從形式上看非常相似,能否只寫一個這樣的函數(shù)?YSC6_V1YSC6_V1程序中fun函數(shù)的定義若寫成voidfun(S&a)時編譯是正確的,main主函數(shù)中函數(shù)調(diào)用fun(a);語句的執(zhí)行是正確的。但是,函數(shù)調(diào)用fun(b);語句的執(zhí)行結(jié)果是錯誤的(程序執(zhí)行了但結(jié)果是錯誤的)。YS68_V1程序中fun函數(shù)的定義若寫成voidfun(GS&a)時編譯出現(xiàn)錯誤,因為,繼承是單向的,基類對象a做實參時,不能為派生類的形參對象所引用。即main主函數(shù)中函數(shù)調(diào)用fun(a);語句編譯出現(xiàn)錯誤。還能否實現(xiàn)剛才的問題?繼承“召喚”多態(tài)——使用虛函數(shù)技術(shù)(僅僅對于對象的指針和引用的間接訪問才會放生多態(tài)的現(xiàn)象)。虛函數(shù)的實現(xiàn):在成員函數(shù)定義時加關(guān)鍵字virtual。YSC6-1YSC6-1程序中類A的成員函數(shù)f在定義時加關(guān)鍵字virtual,表示該函數(shù)為虛函數(shù),在類A的派生類中該成員函數(shù)可以有不同的定義實現(xiàn)。YSC6-1程序中的x?f()的函數(shù)調(diào)用反映了多態(tài)性,其中的形參x是基類的對象引用。在該程序被編譯時不能立即確定f()的確切位置,即不能確定f()是基類的f()還是派生類的f(),但是編譯系統(tǒng)會將該處的編譯操作延遲到程序運行時。等到運行程序時,遇到fun(a)和fun⑹的函數(shù)調(diào)用時會以實際對應(yīng)的函數(shù)調(diào)土 《C++程序設(shè)計》——虛函數(shù)用而調(diào)用基類或派生類的f()運行程序。因此,使用了虛函數(shù)的類的對象所占內(nèi)存空間中會多一個指針空間來存儲指針以指向虛函數(shù)表。虛函數(shù)的特點:⑴虛函數(shù)必須是非靜態(tài)成員函數(shù)。其聲明只能是出現(xiàn)在類定義中的。⑵派生類中的虛函數(shù)可以不必顯式的加關(guān)鍵字virtual,因為當(dāng)一個虛函數(shù)所在的類被繼承后,其虛擬特性將被繼承。⑶將基類的成員函數(shù)定義為虛函數(shù)后,在派生類中該成員函數(shù)可以有新的定義實現(xiàn)。但派生類中該成員函數(shù)必須與基類的成員函數(shù)中定義的函數(shù)的名稱、參數(shù)的數(shù)量、參數(shù)的數(shù)據(jù)類型及函數(shù)的返回值類型諸項內(nèi)容匹配。⑷派生類中重新定義的虛函數(shù)還將“隱藏”基類中同名函數(shù)的所有其它重載形式。⑸內(nèi)聯(lián)函數(shù)、構(gòu)造函數(shù)及靜態(tài)成員函數(shù)不能是虛函數(shù)。⑹當(dāng)程序中被調(diào)函數(shù)中的形參綁定派生類對象后,而派生類中若并未給出相應(yīng)虛函數(shù)的定義時,編譯系統(tǒng)將自動調(diào)用基類的虛函數(shù),但此時該虛函數(shù)處理的數(shù)據(jù)將有可能是派生類對象中繼承部分的數(shù)據(jù)。⑺可以聲明虛析構(gòu)函數(shù)(不可以聲明虛構(gòu)造函數(shù))。如果有可能通過基類指針變量調(diào)用對象的析構(gòu)函數(shù)(通過delete運算),并且被析構(gòu)的對象是有重要的析構(gòu)函數(shù)的派生類的對象時,就需要讓基類的析構(gòu)函數(shù)成為虛函數(shù)。YSC6-2、YSC6-3YSC6_V2YSC6_V2程序中基類S中相應(yīng)函數(shù)被定義為虛函數(shù)。main主函數(shù)調(diào)用fun函數(shù)。fun函數(shù)的形參是類S的引用對象,由于虛函數(shù)的定義,所以,在編譯程序時不確定fun函數(shù)執(zhí)行時的具體對象。在main主函數(shù)中執(zhí)行到函數(shù)調(diào)用語句fun(a);和fun(b);時,編譯系統(tǒng)具體綁定執(zhí)行對象,然后調(diào)用具體對象所在的類中定義的虛函數(shù)完成操作。純虛函數(shù):virtual函數(shù)類型函數(shù)名稱(參數(shù)表)=0;YSC6_V3YSC6_V3程序中類Base是類S和類GS的公有基類。顯然,在類Base中定義的幾個虛函數(shù)并無實際實現(xiàn),并且,此時的類Base若定義對象也是不和理的。可以將類Base中虛函數(shù)定義為純虛函數(shù)。純虛函數(shù)的使用特點:⑴包含有定義的類被稱為抽象類,一般處于繼承層次的“根”。⑵抽象類中因為含有未定義實現(xiàn)的成員函數(shù)(純虛函數(shù)),所以,不能定義該類的對象?!禖++程序設(shè)計》——虛函數(shù) 仝⑶若抽象類的派生類仍然未對純虛函數(shù)給出定義,則該派生類仍然為抽象類。YSC6_V4、YSC6_V5虛基類:虛基類的聲明是在派生類的定義中進行的。YSC6_4YSC6_4程序中派生類D對象d中繼承自直接基類B1的數(shù)據(jù)部分中含有繼承自間接基類A類的數(shù)據(jù),同樣派生類D對象d中繼承自直接基類B2的數(shù)據(jù)部分中含有繼承自間接基類A類的數(shù)據(jù)。對象d中繼承自A類的兩部分數(shù)據(jù)造成實際使用上的“浪費。可以將共同基類設(shè)置為虛基類,這時,從不同的方向繼承來的同名數(shù)據(jù)成員在內(nèi)存中就只有一個部分。YSC6_5YSC6_5程序中派生類D對象d建立時,因為該對象含有從虛基類(類A)繼承來的成員,因此,C++編譯器的做法是:來自于虛基類的成員是由最遠派生類(類D,相對于類A而言,類D是其最遠派生類)的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進行初始化的。而且,只有最遠派生類的構(gòu)造函數(shù)會調(diào)用虛基類的構(gòu)造函數(shù),該派生類的其它基類(類B1和類B2)對虛基類構(gòu)造函數(shù)的調(diào)用都自動被忽略。補充:E6思考題:輸入一組整數(shù),顯示去掉最大值或最小值后其余數(shù)據(jù)的平均值。運算符重載:運算符是為基本數(shù)據(jù)類型定義的(C++預(yù)定義的運算符的運算對象只能是基本數(shù)據(jù)類型),但是,將運算符用于基本數(shù)據(jù)類型之外的自定義數(shù)據(jù)類型就是運算符重載,即運算符重載是對已有的運算符賦予多重含義,使同一運算符作用于不同類型的數(shù)據(jù)時有不同的方法實現(xiàn)因為常用運算符含義是邏輯上的,并未考慮運算對象的類型屬性,因此,將運算符用于對象的運算的運算符重載是為了改進程序代碼的可讀性??梢哉J為運算符是一種特殊的函數(shù),運算符重載就是函數(shù)重載。其特殊性在于:對于普通函數(shù),參數(shù)出現(xiàn)在圓括號內(nèi);對于運算符,參數(shù)出現(xiàn)在其左、右側(cè)。在實現(xiàn)的過程中,首先將指定的運算表達式轉(zhuǎn)換為對運算符函數(shù)的調(diào)用,運算對象轉(zhuǎn)換為運算符函數(shù)的實參,然后根據(jù)實參的數(shù)據(jù)類型來確定需要調(diào)用的函數(shù),此過程是在編譯過程中完成的。運算符重載的規(guī)則:⑴不能重載的運算符有:類屬關(guān)系運算符“?”、成員指針運算符“.*”、作用域說明符“::”、sizeof運算符和三目運算符“?:”。⑵不能改變被重載的運算符的優(yōu)先級、結(jié)合性和運算次序。除此之外,函數(shù)的參數(shù)以及返回值類型都是可以重新聲明的,即可以重載。⑶重載的功能應(yīng)與原有的功能象類似,操作對象的數(shù)量不能改變,同時,至少要有一個操作對象是自定義類型。⑷不能重載目前C++運算符集合中沒有的符號。運算符重載的形式:⑴運算符重載為類的友元函數(shù)。該函數(shù)將會作為全局函數(shù)來實現(xiàn),可以自由地訪問該類的任何數(shù)據(jù)成員。運算所需的操作對象都需要通過函數(shù)的形參表來傳遞,在函數(shù)的形參表中形參的書寫順序就是運算符操作對象的順序。有一個參數(shù)的運算符被稱為一元運算符,有兩個參數(shù)的運算符被稱為二元運算符。例如:二元運算符“-”,第一個參數(shù)作為“被減數(shù)”,第二個參數(shù)作為“減數(shù)”。YSC7-1YSC7T程序中友元函數(shù)friendAoperator-(constA&a,constA&b)的定義形式,實現(xiàn)形參a-b的操作。⑵運算符重載為類的成員函數(shù)。實際使用時,總是通過該類的對象來訪問重載的運算符,即對運算符重載函數(shù)的調(diào)用是通過類的對象實現(xiàn)的。單目運算符無參數(shù);雙目運算符只有一個右側(cè)參數(shù),調(diào)用函數(shù)的該類對象作為左側(cè)參數(shù)。YSC7-1、YSC7-2YSC7-1程序中賦值函數(shù)A&operator=(constA&a)的定義形式,實現(xiàn)實參對象=形參對象的操作。重載運算符函數(shù)的參數(shù)形式:考慮程序代碼的可讀性,運算符函數(shù)的類對象參數(shù)通常采用引用傳遞。運算符函數(shù)的返回值:⑴值返回YSC7-1YSC7T程序中友元函數(shù)friendAoperator-(constA&a,constA&b)的定義形式為值返回現(xiàn)象。程序中執(zhí)行語句d=a-b;,根據(jù)運算符優(yōu)先級,先進行“-”運算。該函數(shù)執(zhí)行時編譯系統(tǒng)將定義臨時對象保留運算結(jié)果(函數(shù)的返回值)。但是,該臨時對象無法顯式的在程序中被使用,因此,在函數(shù)中定義局部對象m,并且顯式的使用語句returnm;帶回函數(shù)返回值。但實際上,編譯系統(tǒng)是以臨時對象帶回函數(shù)的返回值參與后續(xù)運算的。在函數(shù)結(jié)束時,對象m先被析構(gòu)。然后進行“=”運算。調(diào)用賦值函數(shù),此時,作為函數(shù)的調(diào)用對象(賦值運算的左側(cè)參數(shù))是對象d,而賦值運算的右側(cè)參數(shù)對象就是剛才的臨時對象,即:利用了剛才的函數(shù)返回值。并且,在賦值結(jié)束后,該臨時對象也將被析構(gòu)。兩個對象相減的結(jié)果不應(yīng)改變兩個參與運算的參數(shù)對象的內(nèi)容,因此,這兩個參數(shù)是const引用。YSC7-3YSC7-3程序中成員函數(shù)Aoperator+(constA&a)的定義形式為值返回現(xiàn)象。程序中執(zhí)行語句b+a;。該函數(shù)執(zhí)行時編譯系統(tǒng)將定義臨時對象保留運算結(jié)果(函數(shù)的返回值)。但是,該臨時對象無法顯式的在程序中被使用,因此,在函數(shù)中定義局部對象m,并且顯式的使用語句returnm;帶回函數(shù)返回值。但實際上,編譯系統(tǒng)是以臨時對象帶回函數(shù)的返回值的。在函數(shù)結(jié)束時,對象m被析構(gòu)。也就是說,該函數(shù)的返回值確實是被返回了,但由于是執(zhí)行b+a;語句,并未對返回值有所利用,因此,對象b的值不會改變。即:不應(yīng)試圖以b+a;語句形式來達到直接使對象b的值改變的目的(不應(yīng)試圖改變“+”運算的運算方式)。⑵引用返回YSC7-1涯 《C++程序設(shè)計》一算符重載YSC7-1程序中賦值函數(shù)A&operator=(constA&a)的定義形式為引用返回現(xiàn)象。因為是調(diào)用函數(shù)的對象被賦值,所以采用引用形式。賦值運算的結(jié)果就是重載函數(shù)的返回值,也就是說,對象a值的改變結(jié)果與函數(shù)返回值是一致的。因此,在重載函數(shù)內(nèi)不必再定義臨時對象。若是該函數(shù)被定義成值返回現(xiàn)象,返回值實際上是對函數(shù)中臨時對象的賦值,而不是對調(diào)用函數(shù)的對象進行賦值。運算符重載函數(shù)的結(jié)果與參與運算的對象相關(guān),應(yīng)定義引用返回函數(shù)。并且在雙目運算符時,要讓左側(cè)參數(shù)成為調(diào)用運算符函數(shù)的對象(與函數(shù)的結(jié)果相關(guān)的參與運算對象),要讓右側(cè)參數(shù)成為參與運算的對象。YSC7-3YSC7-3程序中成員函數(shù)A&operator-(constA&a)的定義形式為引用返回現(xiàn)象。程序中執(zhí)行語句b-a;。該函數(shù)執(zhí)行方式顯然與賦值函數(shù)的執(zhí)行方式是一致的,只不過運算符是“-”。如此定義和使用“-”運算符重載,雖然程序可以執(zhí)行,但其實際上是試圖以b-a;語句形式來達到直接使對象b的值改變的目的,這樣做“顛覆”了以往對“-”運算符的定義,雖然可行,反而使程序的可讀性下降了。YSC7-4注意對象構(gòu)造和析構(gòu)時的狀態(tài)。運算符重載函數(shù)的結(jié)果與參與運算的任何一個對象的值均無關(guān),應(yīng)定義值返回函數(shù)。建議:⑴對于賦值運算,只能使用成員函數(shù)方式定義。⑵對于復(fù)合賦值運算,使用成員函數(shù)方式定義。⑶其它運算符使用友元(全局)函數(shù)形式定義。⑷若對象中有指針屬性成員,應(yīng)該慎重使用運算符重載。++前綴運算符的重載YSC7-5因為是先加,所以對象和返回值是同一個對象,定義引用返回。friendA&operator++(A&a)++后綴運算符的重載YSC7-6因為參數(shù)也應(yīng)該是引用定義,但是函數(shù)的返回值應(yīng)是臨時對象的值而非引用《C++程序設(shè)計》一算符重載 迴對象的值。顯然,卄后綴與++前綴是不同的函數(shù),但是兩個函數(shù)的參數(shù)聲明是一致的,所以系統(tǒng)要求做如下的處理:friendAoperator++(A&a,intb),以示區(qū)別。參數(shù)b的值默認為0。<<運算符的重載YSC7-7與運算符重載的效果對比的其它的操作YSC7-8標(biāo)準(zhǔn)I/O:C++將I/O系統(tǒng)抽象成一系列的類,操作控制臺I/O與磁盤I/O的方法是一樣的,是在相同的機制上操作不同的設(shè)備。I/O系統(tǒng)是通過流操作的。一個流就是一個邏輯設(shè)備,產(chǎn)生或消耗信息,一個流通過C++的I/O系統(tǒng)與一個物理設(shè)備相連,即使每個相連的物理設(shè)備本質(zhì)上可能是不同的,但是,所有流的操作是一樣的。因為流的操作是一樣的,所以,相同C++的I/O函數(shù)就可以虛擬的操作任何類型的物理設(shè)備。流可以重定向。其實質(zhì)上就是一個字節(jié)序列,在輸入操作中,字節(jié)從輸入設(shè)備流向內(nèi)存;在輸出操作中,字節(jié)從內(nèi)存流向輸出設(shè)備。C++對其I/O的支持在頭文件iostream中。在該文件中定義了一個類的層次框架支持i°s(流基類)I/Oi°s(流基類)ifstream(ifstream(輸入文件流類)ostream(通用輸出流類和其它輸出流的基類)iostream(通用輸入/出流類和其它輸入/出流的基類)strstreamstdiostreamfstreamofstream(輸出文件流類)I/O標(biāo)準(zhǔn)流類:所謂標(biāo)準(zhǔn)流類就是針對普通計算機上都帶有的設(shè)備,如鍵盤、顯示器等設(shè)備,建立常用的輸入/出方法,比如讀取數(shù)據(jù),顯示結(jié)果信息等。類ios,是所有輸入/出流類的基類。類ios的派生類類istream和類ostream;類istream和類ostream的共同派生類iostream。cin是類istream的對象(鍵盤);cout、cerr、clog是類ostream的對象(屏幕、屏幕和打印機)。cerr對象也是用來輸出信息的,與cout不同的是,其輸出結(jié)果不能被重定向。因而,選用它作為錯誤信息的輸出設(shè)備比較合理。使用標(biāo)準(zhǔn)流類進行輸入/出格式化操作:輸入或輸出的格式均可以通過使用。++的<<和》操作符實現(xiàn)。⑴用ios類的成員類ios中定義了一個枚舉類型的成員來完成設(shè)置格式標(biāo)志,該成員的值完成具體格式設(shè)置,并且是“一次性”設(shè)置。例如:ios::left 左對齊方式,右端用填充字符填充。ios::right 右對齊方式,左端用填充字符填充。類ios中完成格式設(shè)置的函數(shù)是setf(),取消格式設(shè)置的函數(shù)是unsetf()除了使用格式標(biāo)志控制輸入/出的格式之外,還可以使用的類ios成員函數(shù)有:width。:控制顯示數(shù)據(jù)寬度。precision():控制顯示數(shù)據(jù)精度。fill

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論