版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向對象技術概述2面向對象技術的基本概念面向對象技術是一種以對象為基礎,以事件或消息來驅動對象執行處理的程式設計技術。
面向對象程式設計從所處理的數據入手,以數據為中心而不是以功能為中心來描述系統,數據相對於功能而言具有更強的穩定性。3面向對象程式的主要結構特點第一,程式一般由類的定義和類的使用兩部分組成,在主程序中定義各對象並規定它們之間傳遞消息的規律;第二,程式中的一切操作都是通過向對象發送消息來實現的,對象接到消息後,啟動有關函數完成相應的操作。4對象的概念(一)面向對象技術認為客觀世界是由各種各樣的對象組成,每種對象都有各自的內部狀態和運動規律,不同對象間的相互作用和聯繫就構成了各種不同的系統,構成了客觀世界。對象是組成一個系統的基本邏輯單元,是一個有組織形式的含有資訊的實體。對象既可以表示一個抽象的概念,也可以表示一個具體的模組,既可以表示軟體,也可以表示硬體。5對象的概念(二)對象(Object)由屬性(Attribute)和行為(Action)兩部分組成。屬性是用來描述對象靜態特徵的一個資料項目。行為是用來描述對象動態特徵和行為的一個操作。對象是包含客觀世界物體特徵的抽象實體,是屬性和行為的封裝體。6類的確定(一)類(Class)是具有相同屬性和行為的一組對象的集合;類為屬於它的全部對象提供了統一的抽象描述;類的內部包括屬性和行為兩個主要部分;類是對象集合的再抽象。劃分原則:尋求一個大系統中事物的共性,將具有共性的系統成分確定為一個類。7類的確定(二)確定某事物是一個類的步驟包括: 第一步,要判斷該事物是否有一個以上的實例,如果有,則它是一個類;第二步,要判斷類的實例中有沒有絕對的不同點,如果沒有,則它是一個類。因為類的每一個實例是相似的,具有相同屬性和行為類別結構。不能把一組函數組合在一起構成類
!
8消息和事件消息(Message)是描述事件發生的資訊。消息是對象之間發出的行為請求。多個消息構成一個事件。封裝使對象成為一個相對獨立的實體,而消息機制為它們提供了一個相互間動態聯繫的途徑,使它們的行為能互相配合,構成一個有機的運行系統。9面向對象技術的基本特徵抽象性抽象就是忽略事物中與當前目標無關的非本質特徵,更充分地注意與當前目標有關的本質特徵。封裝性封裝就是把對象的屬性和行為結合成一個獨立的單位,並盡可能隱蔽對象的內部細節。繼承性繼承是一種聯結類與類的層次模型。繼承性是指特殊類的對象擁有其一般類的屬性和行為的特性。多態性多態是指類中同一函數名對應多個具有相似功能的不同函數。多態性是指可以使用相同的調用方式來調用這些具有不同功能的同名函數的特性。10三種常用面向對象程式設計語言簡介
混合型面向對象程式設計語言C++純面向對象程式設計語言Java可視化程式設計語言VisualBasic11簡單的C++程式C++程式由一個或多個源代碼檔構成。C++的源代碼檔分為兩類:頭檔和根源程式檔。C++根源程式包括編譯預處理、程式主體和注釋幾部分。一般將變數(對象)、類型及類的定義、函數的聲明等放在頭檔(擴展名為.h);而將使用這些變數或函數的程式放在另一個檔中,成為C++根源程式(擴展名.cpp)。12C++程式的編譯過程分為預處理和正式編譯兩個步驟。在編譯C++程式時,編譯系統中的預處理模組首先根據預處理命令對根源程式進行適當的加工,然後再正式編譯。程式主體就是main函數。每一個C++根源程式都必須且只能有一個main函數,作為程式的入口。注釋是程式員為程式語句所做的說明,是提高程式可讀性的一種手段。注釋一般分為兩種:序言性注釋和注解性注釋。13數據類型和運算式空類型void整型int字元型實型邏輯型bool單字符型char寬字元型w_char單精確度型float雙精度型double指針type*結構struct枚舉enum類class非基本數據類型數據類型基本數據類型聯合union數組type[]14常量在程式運行過程中,值不能被改變的量稱為常量。常量定義格式為:const<數據類型><常量>=<運算式>;15變數在程式運行過程中,值可以被改變的量稱為變數。在C++中,任何一個變數在被使用之前必須被定義。定義格式為:<類型><變數名表>;16指針和引用指針也是一種變數,指針變數專門用來存放其他數據在內存的地址。是一種間接訪問變數或對象的方法。引用是某個變數或對象的別名,是另一種訪問變數或對象的方法。<類型>*<變數>;<類型>&<引用名>=<變數名或對象名>;17數組數組是一個由多個同類型變數組成的集合。數組元素被引用的格式:<類型><數組名>[<常量運算式>][[<常量運算式>]…];<數組名>[<下標>][[<下標>]…]18結構體C++允許用戶把邏輯上相關聯的數據組織起來,作為整體使用,這就是結構體數據類型。struct<結構類型變數名>{<類型> <成員名>;<類型> <成員名>;…};19運算符C++運算符包括算術運算符(+、-、*、/、%)、關係運算符(>、<、==、>=、<=、!=)、邏輯運算符(&&、||、!)、賦值運算符(=)、複合賦值運算符(+=、-=、*=、/=、%=等)、自加運算符(++)、自減運算符(--)、位運算符(&、^、|、~、<<、>>等)、條件運算符(?:)、逗號運算符(,)、作用域區分符(::)等。20運算式運算式是由運算符和運算元組成的式子。運算元包含了常量、變數、函數和其他一些命名的識別字。算術運算式關係運算式邏輯運算式條件運算式賦值運算式逗號運算式21動態存儲分配堆允許程式在運行時(而不是在編譯時)申請某個大小的記憶體空間。如果要在堆中分配記憶體空間,必須使用特定的函數或操作符。另外,若不再需要使用的動態記憶體空間則必須釋放。new運算符從堆中分配一塊與<類型>相適應的存儲空間,若分配成功,將這塊記憶體空間的首地址存入<指針>,否則置<指針>的值為NULL(空指針值,即0)。delete操作符用來釋放<指針>指向的動態存儲空間。22程式的基本控制結構按照結構化程式設計方法的觀點,任何演算法功能都可以通過由程式模組組成的三種基本程式結構的組合來實現,它們是順序結構、分支結構、迴圈結構
23函數一個C++程式是由若干個根源程式檔構成,而一個根源程式檔是由若干個函數構成,每個函數具有相對獨立的功能。一個根源程式可以由若干函數構成,但有且僅有一個main函數,函數與函數之間通過輸入參數和返回值來聯繫。根源程式從main函數開始執行直到main函數結束,其他函數都是由main函數直接或間接地調用執行。24函數定義定義函數的一般格式:<返回值類型><函數名>(<參數列表>){
<函數體>}25函數原型函數原型即函數聲明,用來描述函數的返回值和參數類型。C++規定:名字必須先說明後使用。因此,當一個函數調用出現在函數定義之前,必須先對函數進行原型說明。函數原型的功能:確定函數返回值的類型;確定函數參數的類型和個數;函數名代表該函數的函數體以及函數完成的功能。<返回值類型><函數名>(<參數表>);26函數調用C++程式由若干函數構成,各個函數的執行通過函數的調用來完成的。在調用函數時,大多數情況下,主調函數和被調函數之間有數據傳遞關係。函數之間的數據傳遞是靠函數參數進行,而對無參數函數的調用,沒有數據傳遞。在定義函數時,函數名後面括弧內的變數名為“形式參數”(形參)。在調用函數時,函數名後面括弧內的運算式為“實際參數”(實參)。27引入函數後,使用者只需要知道函數的功能和使用方法,而不必關心函數的內部代碼,從而方便源代碼的共用;使用函數,也可減少程式的冗餘和程式的目標代碼。28內聯函數函數調用有一定的時間和空間開銷,影響程式的執行效率。特別是對於一些函數體代碼不是很大,但又頻繁地被調用的函數,則引入內聯函數。在程式編譯時,編譯系統將程式中出現內聯函數調用的地方用函數體進行替換。引入內聯函數可以提高程式的運行效率,節省調用函數的時間開銷,是一種以空間換時間的方案。
內聯函數的一般定義格式:inline返回值類型函數名(<參數列表>){函數體}29帶缺省參數的函數C++允許在定義函數時給其中的某個或某些形參指定缺省值(定義函數參數時賦初值),這樣,當發生函數調用時,若指定實參值則用該值;如果省略了對應位置上的實參的值時,則在執行被調函數時,以該形參的缺省值進行運算。引入缺省參數的目是為了讓編程簡單,讓編譯系統做更多的檢查錯誤工作,同時增強了函數的可重用性。30函數重載函數重載是指一個函數可以和同一作用域中的其他函數具有相同的名字,但這些同名函數的參數類型、參數個數、返回值、函數功能可以完全不同。編譯系統將根據函數參數的類型和個數來判斷使用哪一個函數。31作用域識別字有效性的範圍稱識別字的作用域,又稱為識別字的“可見性”。識別字在某範圍內是“可見的”是指在該範圍內可以進行訪問操作。C++的作用域範圍為:局部作用域(塊作用域)函數作用域函數原型作用域檔作用域類作用域32數據類型C語言中內置數據類型示例:--int可以對整數有:+,-,*,/,求模操作%.
可以用sizeof(),來求得其在特定的平臺上的大小,如4位元組.構成數據類型的兩大要素:--存放數據對象需要的記憶體大小
--可使用得數據對象的操作或方法33自定義數組數據類型C++對數組類型提供了內置支持,但只限於”只讀寫單個元素”的機制需要的功能可能有:--把一個數組副賦值給另一個數組;--對兩個數組進行比較;--取得數組的大小;--數組內元素的排序,等等34類
從語言角度來說,類是一種新的數據類型,而對象是具有這種類型的變數。類是一種將數據和作用於這些數據上的函數組合在一起的複雜數據類型,是可重用的基本單元。一個類就是一個用戶自定義數據類型。類是面向對象程式設計的核心,利用它可以實現對象的抽象、數據和操作的封裝以及資訊的隱蔽。35類定義類定義一般分為說明部分和實現部分。說明部分是說明該類中的成員,實現部分是對成員函數的定義。類定義的一般格式如下class<類名>{public:<數據成員或成員函數的聲明>;private:<數據成員或成員函數的聲明>;說明部分protected:<數據成員或成員函數的聲明>;};<各個成員函數的定義>實現部分36訪問控制訪問許可權有三種類型:
private、public和protected。三種訪問許可權的成員與出現的先後順序無關,並且允許多次出現,但是一個成員只能具有一種訪問屬性。37成員函數的實現成員函數是類中描述行為的成員,同時也是對封裝的數據進行操作的惟一途徑。類定義的格式中,一般在類中說明成員函數原型,在類外進行成員函數的具體實現,<各個成員函數的定義>是類的實現部分。同時,如果成員函數已經在類中定義,則不需要在類外實現。需要注意的是,在類中定義的成員函數自動成為內聯函數。38若在類體外實現,則需要使用作用域運算符“::”,用它來標識某個成員函數是屬於哪個類的,其定義格式如下:<返回值類型><類名>::<成員函數名>(<參數表>){<函數體>}39
對象對象的定義格式與普通變數相同。定義格式如下:<類名><對象名表>;
其中,<對象名表>中可以有一個或多個對象名。當有多個對象名時,用逗號分隔。<對象名表>中還可以是指向對象的指針名或引用名,也可以是對象數組名。40類成員的訪問定義了類及其對象,就可以通過對象來使用其公有成員,從而達到對對象內部屬性的訪問和修改。對象對其成員的訪問有圓點訪問形式和指針訪問形式。<對象名>.<公有成員><對象指針名>-><公有成員>41構造函數和析構函數類描述了一類對象的共同特徵,而對象是類的特例。每個對象區別於其他對象的地方就是依靠它自身屬性,即數據成員的值。對象在定義的時候可以進行數據成員的設置,稱為對象的初始化。同樣,在對象使用結束時,還可以進行一些相關的清理工作。C++中對象的初始化和清理工作,分別由兩個特殊的成員函數來完成,它們就是構造函數和析構函數。42構造函數構造函數的功能是在定義對象時被編譯系統自動調用來創建對象並初始化對象。其定義格式如下:<類名>::<類名>(<參數表>){
<函數體>}43構造函數的特點構造函數是成員函數,函數體可寫在類體內,也可寫在類體外。構造函數的函數名與類名相同,且不指定返回值類型,它有隱含的返回值,該值由編譯系統內部使用。構造函數可以沒有參數,也可以有參數,因此可以重載,即可以定義參數不同的多個構造函數。每個類都必須有一個構造函數。如果類中沒有顯式定義構造函數,則編譯系統自動生成一個缺省形式的構造函數,作為該類的公有成員。程式中不能直接調用構造函數,在定義對象時編譯系統自動調用構造函數。44析構函數析構函數的功能是在對象的生存期即將結束的時刻,由編譯系統自動調用來完成一些清理工作。它的調用完成之後,對象也就消失了,相應的記憶體空間也被釋放。析構函數也是類的一個公有成員函數,它的名稱是由類名前面加“~”構成,也不指定返回值類型。和構造函數不同的是,析構函數不能有參數,因此不能重載。45其定義格式如下:<類名>::~<類名>(){
<函數體>}46析構函數的特點析構函數是成員函數,函數體可寫在類體內,也可以寫在類體外。析構函數的函數名與類名相同,並在前面加“~”字元,用來與構造函數加以區別。析構函數不指定返回值類型。析構函數沒有參數,因此不能重載。一個類中只能定義一個析構函數。每個類都必須有一個析構函數。如果類中沒有顯式定義析構函數,則編譯系統自動生成一個缺省形式的析構函數,作為該類的公有成員。析構函數在對象生存期結束前由編譯系統自動調用。47拷貝構造函數拷貝構造函數是一種特殊的構造函數,它的功能是用一個已知的對象來初始化一個被定義的同類的對象。拷貝構造函數的定義格式如下:48class<類名>{public:
<類名>(<參數表>);
//構造函數
<類名>(const<類名>&<對象名>);//拷貝構造函數…};<類名>::<類名>(const<類名>&<對象名>);//拷貝構造函數的實現{<函數體>}49拷貝構造函數的特點拷貝構造函數是成員函數,函數體可寫在類體內,也可以寫在類體外。拷貝構造函數名與類名相同,並且也不指定返回值類型。拷貝構造函數只有一個參數,並且是對同類對象的引用。每個類都必須有一個拷貝構造函數。如果類中沒有顯式定義拷貝構造函數,則編譯系統自動生成一個缺省形式的拷貝構造函數,作為該類的公有成員。拷貝構造函數在三種情況下由編譯系統自動調用。50靜態成員靜態成員是解決同一個類的不同對象之間的數據和函數共用問題。靜態成員是類的所有對象共用的成員,而不是某個對象的成員,它在對象中不占存儲空間,是屬於整個類的成員。靜態成員分為靜態數據成員和靜態成員函數。其定義格式為:static
<靜態成員的定義>;51靜態數據成員的初始化靜態數據成員必須進行初始化。在程式一開始運行時靜態數據成員就必須存在,因為在程式運行中要調用,所以靜態數據成員不能在任何函數內分配空間和初始化。最好在類的實現部分中完成靜態數據成員的初始化。靜態數據成員初始化與一般數據成員初始化不同,其格式如下:<數據類型><類名>::<靜態數據成員名>=<值>;52靜態成員的調用調用靜態成員時,採用如下格式:<類名>::<靜態成員>53友元根據封裝性,一般將類中的數據成員聲明為私有成員,外部可以通過類的公有成員函數對私有成員進行訪問。但有時類體外的一些函數需要直接訪問類的數據成員,又不改變其數據成員的訪問許可權,這時,需要定義友元。54友元的作用友元提供了不同類或對象的成員函數之間、類的成員函數與普通函數之間進行數據共用的機制。友元可以訪問類中所有成員,但不是類的成員。。友元雖然不是類的成員,但它是類的朋友,可以直接訪問類的所有成員。55友元的定義如果友元是普通函數或另一個類的成員函數,稱為友元函數;如果友元是一個類,則稱為友元類,友元類的所有成員函數都成為友元函數。友元函數和友元類在被訪問的類中聲明,其格式分別如下:friend<返回值類型><函數名>(<參數表>);friend<類名>;56繼承的概念類的繼承就是根據一個類創建一個新類的過程。新類自動具有已有類的所有成員,並可根據需要添加更多的成員。換個角度,從已有類產生新類的過程就是類的派生。通常將用來派生新類的類稱為基類,又稱為父類,而將派生出來的新類稱為派生類,又稱為子類。57派生類派生類是特殊的基類,基類是派生類的抽象描述。派生類繼承了基類的所有特性,但不等同於基類,否則就沒有派生的必要了。繼承的作用就是體現特殊與一般的關係,尋找有共性的事物間的差異,求其發展;另一個作用是代碼重用,從基類派生子類,無需修改基類的代碼,就可以直接調用基類的成員,而自己的代碼只需在派生類中實現即可。58派生類的定義class<派生類名>:<繼承方式><基類名>{<派生類新定義成員>};其中,<繼承方式>有三種:公有繼承、私有繼承和保護繼承,分別用關鍵字public、private和protected表示。缺省情況下為私有繼承。59派生類的生成過程分析派生新類的過程可知,派生類的生成經歷了三個步驟:吸收基類成員改造基類成員添加派生類新成員60訪問許可權控制不論哪種繼承方式,派生類新定義成員均不能直接訪問基類的私有成員,只能通過基類的公有成員函數或保護成員函數訪問基類的私有數據成員,而基類的私有成員函數根本就不會繼承,更談不上使用。所以,除非僅限於本類使用,否則,一般不將成員函數定義為私有成員。61公有繼承的訪問許可權控制類的繼承方式為公有繼承時,在派生類中,繼承的基類的公有成員和保護成員的訪問屬性不變,而對基類的私有成員不可訪問。即基類的公有成員和保護成員被繼承後分別作為派生類的公有成員和保護成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象可以訪問繼承下來的基類公有成員。62私有繼承的訪問許可權控制當類的繼承方式為私有繼承時,在派生類中,繼承的基類的公有成員和保護成員變為私有成員,而對基類的私有成員不可訪問。即基類的公有成員和保護成員被繼承以後作為派生類的私有成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象無法訪問基類的所有成員。因此,私有繼承之後,基類的成員再也無法在以後的派生類中發揮作用,出於這種原因,一般不使用私有繼承方式。63保護繼承的訪問許可權控制當類的繼承方式為保護繼承時,在派生類中,繼承的基類的公有成員和保護成員變為保護成員,而對基類的私有成員不可訪問。即基類的公有成員和保護成員被繼承以後作為派生類的保護成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象無法訪問基類的所有成員。64派生類的構造函數派生類構造函數的一般格式如下:<派生類名>(<總參數表>):<基類名>(<參數表1>),<子對象名>(<參數表2>){<派生類數據成員的初始化>};65派生類的析構函數
由於基類的析構函數也不能被繼承,因此,派生類的析構函數必須通過調用基類的析構函數來做基類的一些清理工作。調用順序是:先調用派生類的析構函數,再調用對象成員類的析構函數(如果有對象成員),最後調用基類的析構函數,其順序與調用構造函數的順序相反。66多繼承根據派生類繼承基類的個數,將繼承分為單繼承和多繼承。當派生類只有一個基類時稱為單繼承,以上所討論的都是單繼承。當派生類有多個基類時稱為多繼承。單繼承可以看作是多繼承的一個特例,多繼承可以看作是多個單繼承的組合,它們有很多相同特性。67多繼承的定義格式
多繼承可以看作是單繼承的擴展,派生類與每個基類之間的關係可以看作是一個單繼承。在C++中,多繼承的定義格式如下:class<派生類名>:<繼承方式><基類名1>,…,<繼承方式><基類名n>{<派生類新定義成員>};68多繼承的構造函數<派生類名>(<總參數表>):<基類名1>(<參數表1>),…,<基類名n>(<參數表n>){<派生類數據成員的初始化>};69虛基類在派生類中對基類成員的訪問應該是唯一的。但是,在多繼承方式下,可能造成對基類中某個成員的訪問出現不唯一的情況,稱為對基類成員訪問的二義性問題。解決的辦法是用作用域運算符“::”進行限定,另外還可以設置虛基類來解決此問題。70虛基類的定義格式class<派生類名>:virtual<繼承方式><共同基類名>71多態性的概念多態性是指具有相似功能的不同函數使用同一個名稱來實現,從而可以使用相同的調用方式來調用這些具有不同功能的同名函數的特性。C++的多態性是指對同一條消息,被不同類型的對象接收將產生不同的行為。多態性是實現“一種介面,多種方法”的技術。這裏的“一種介面”是指相同函數名,而“多種方法”是指多種函數實現。72多態的類型C++支持的多態可以分為四種類型:重載多態強制多態包含多態參數多態73聯編多態性的實現過程中,確定調用哪個同名函數的過程就是聯編(binding),又稱綁定。聯編是指電腦程式自身彼此關聯的過程,也就是把一個識別字名和一個存儲地址聯繫在一起的過程。用面向對象的術語講,就是把一條消息和一個對象的方法相結合的過程。按照聯編進行的階段的不同,可以分為靜態聯編和動態聯編,這兩種聯編過程分別對應著多態性的兩種實現方式。74靜態聯編在編譯階段完成的聯編稱為靜態聯編。在編譯過程中,編譯系統可以根據類型匹配等特徵來確定程式中調用操作與執行某個同名函數實現之間的關係,即確定某一個同名函數到底是要調用哪一段函數實現代碼。函數重載和運算符重載就是通過靜態聯編方式實現的編譯時的多態的體現。靜態聯編的優點是函數調用速度快、效率較高,缺點是編程不夠靈活75動態聯編只有在運行程式時才能確定將要調用的函數。這種在運行階段進行的聯編稱為動態聯編。動態聯編的優點是提供了更好的編程靈活性、問題抽象性和程式易維護性,缺點是與靜態聯編相比,函數調用速度慢。76虛函數虛函數是動態聯編的基礎。虛函數是非靜態的成員函數,經過派生之後,虛函數在類族中可以實現運行時的多態性。77虛函數的聲明虛函數是一個在某基類中聲明為virtual並在一個或多個派生類中被重新定義的成員函數。聲明虛函數的格式如下:virtual<返回值類型><函數名>(<參數表>);78虛函數的使用如果某類中的一個成員函數被說明為虛函數,這就意味著該成員函數在派生類中可能有不同的函數實現。當使用對象指針或對象引用調用虛函數時,採用動態聯編方式,即在運行時進行關聯或綁定。79抽象類抽象類是一種特殊的類,專門作為基類派生新類,自身無法實例化,也就是無法定義抽象類的對象,它為一類族提供統一的操作介面。抽象類是為了抽象和設計的目的而建立的,可以說,建立抽象類,就是為了通過它多態地使用其中的成員函數。抽象類處於類層次的上層,由它派生新類,然後再實例化。80純虛函數在C++中,有一個僅為該多態機制提供一個介面而沒有任何實體定義的函數,被稱為純虛函數。聲明純虛函數的一般格式如下:virtual<返回值類型><函數名>(<參數表>)=0;81
抽象類抽象類只能用作其他類的基類,不能建立抽象類對象。抽象類不能用作參數類型、函數返回值類型或顯式轉換的類型,但可以說明指向抽象類的指針或引用,該指針或引用可以指向抽象類的派生類,進而實現多態性。抽象類的主要作用是將有關的派生類組織在一個繼承層次結構中,由抽象類為它們提供一個公共的根,相關的派生類就從這個根派生出來。82運算符重載運算符重載就是賦予系統預定義的運算符多重含義,使同一個運算符作用於不同類型的數據導致不同的行為。運算符重載的實質就是函數重載。運算符重載使得系統預定義的運算符能作用於用戶自定義類型的數據,進行類似運算。83運算符重載規則C++的運算符除了少數幾個之外,全部可以重載,而且只能重載已有的運算符,不可臆造新的運算符。重載之後運算符的優先順序和結合性都不會改變,並且要保持原運算符的語法結構。參數和返回值類型可以重新說明。運算符重載是針對新類型數據的實際需要,對原有運算符進行適當的改造。運算符重載有兩種方式:重載為類的成員函數和重載為類的友元函數。84當運算符重載為類的成員函數時,由於單目運算除了對象以外沒有其他參數,因此重載“++”和“--”運算符,不能區分是首碼操作還是尾碼操作。C++約定,在參數表中放上一個整型參數,表示尾碼運算符。85運算符重載為成員函數運算符重載為類的成員函數的一般格式如下:其中,operator是定義運算符重載函數的關鍵字。<參數表>中最多有一個形參。<返回值類型>operator<運算符>(<參數表>){<函數體>;}86範本是面向對象程式設計提高軟體開發效率的一個重要手段,是C++語言一個重要特徵。採用範本編程使程式員能夠迅速建立具有類型安全的類庫集合和函數集合,它的實現提高了代碼的重用性,更方便大規模地軟體開發。本章先介紹了範本的概念,再介紹了函數範本和類範本的定義與使用,以便能正確使用C++系統中標准範本庫STL。87範本的概念範本作為一種C++語言支持參數化多態性的工具,可以為邏輯功能相同而類型不同的數據程式提供一種代碼共用的機制。一個範本並非一個實實在在的類或函數,僅僅是一個類或函數的描述,是參數化的函數和類。範本分為函數範本和類範本,通過參數實例化可以再構造出具體的函數或類,稱為範本函數和範本類。88函數範本函數範本的定義格式:template<類型參數表><返回值類型><函數名>(<參數表>){<函數體>
}89範本函數的生成函數範本是對一組函數的描述,它以任意類型T為參數及函數返回值。它不是一個實實在在的函數,編譯系統並不產生任何執行代碼。當編譯系統在程式中發現有與函數範本中相匹配的函數調用時,便生成一個重載函數,該重載函的函數體與函數範本的函數體相同。該重載函數稱為範本函數。它是函數範本的一個具體實例,只處理一種惟一的數據類型。90類範本定義類範本的一般格式:template<類型參數表>class<類範本名>{<類成員的聲明>};91類範本中的成員函數的定義可以放在類範本的定義體中(此時與類中的成員函數的定義方法一致)也可以放在類範本的外部定義成員函數,此時成員函數的定義格式如下:template<類型參數表><返回值類型><類範本名><類型名表>::<函數名>(<參數表>){<函數體>}92類範本的使用利用類範本定義的只是對類的描述,它本身還不是一個實實在在的類。要定義類範本的對象(即實例),需要用下列格式的語句:類範本名<實際的類型>類範本名<實際的類型><對象名>[(實際參數表)];93標準範本庫STLSTL是C++標準庫中的重要一員,利用STL開發程式可以提高代碼的重用性,讓程式更加穩定,便於維護,提高編寫程式的效率。STL是StandardTemplateLibrary的縮寫,即標準範本庫。它是由泛型演算法和數據結構組成的通用庫。在運用STL之前,必須掌握範本的使用。94STL的組成STL主要由六大部分組成:迭代器(iterators)演算法(algorithms)容器(containers)函數對象(functionobjects)記憶體分配器(allocators)適配器(adapter)95流的概念在C++中,將數據從一個對象到另一個對象的流動抽象為“流”。流動的方向不同,構成輸入/輸出流,即I/O流。在C++程式中,數據可以從鍵盤流入到程式,也可以從程式流向螢幕或磁片檔。從流中獲取數據的操作稱為提取操作向流中添加數據的操作稱為插入操作。數據的輸入/輸出就是通過I/O流來實現的。96C++編譯系統提供的I/O流庫含有兩個平行基類:streambuf和ios,所有的流類都是由它們派生出來的。ios類有4個直接派生類,即輸入流類istream、輸出流類ostream、檔流類fstreambase、串流類strstreambase,這4種流作為流庫中的基本流類。97I/O流庫中各個類之間的層次關係stdiostreamiosistrstreamistreamifstreamistream_withassignostreamfstreamostream_withassignstrstreamiostreamofstreamostrstreamstreambufstrstreambuffilebufstdiobuffstreambasestrstreambase98非格式化輸入/輸出非格式化輸入/輸出就是按系統預定義的格式進行的輸入/輸出。按默認約定,每個C++程式都能使用標準I/O流,如標準輸入、標準輸出。cin用來處理標準輸入,即鍵盤輸入;cout用來處理標準輸出,即螢幕輸出。它們被定義在iostream.h頭檔中。在使用cout和cin前,要用編譯預處理命令將所使用的頭檔包含到根源程式中,其格式如下:#include<iostream.h>99非格式化輸出“<<”是預定義的插入運算符,作用在流類對象cout上,實現默認格式的螢幕輸出。使用cout輸出運算式值到螢幕上的格式如下:
cout<<E1<<E2<<…<<Em;其中,E1、E2、…、Em為均為運算式。功能是計算各運算式的值,並將結果輸出到螢幕當前游標位置處。cout是ostream流類的對象,它在iostream.h頭檔中作為全局對象定義:
ostreamcout(stdout);其中,stdout表示標準輸出設備名(螢幕)。100非格式化輸入“>>”是預定義的提取運算符,作用在流類對象cin上,實現默認格式的鍵盤輸入。使用cin將數據輸入到變數的格式如下:
cin>>V1>>V2>>…>>Vn;其中,V1、V2、…、Vn都是變數。功能是暫停執行程式,等待用戶從鍵盤輸入數據,各數據間用空格或Tab鍵分隔,輸入數據類型要與接受變數類型一致,輸完後,按回車鍵結束。cin是istream流類的對象,它在iostream.h頭檔中作為全局對象定義:
istreamcin(stdin);其中,stdin表示標準輸入設備名(鍵盤)。101格式化輸入/輸出C++提供了兩種進行輸入/輸出格式化的方法:一種是用ios類成員函數進行格式化。另一種是用專門的操作符函數進行格式化。102
用ios類成員函數格式化ios類成員函數主要是通過對狀態標誌、輸出寬度、填充字元以及輸出精度的操作來完成輸入/輸出格式化。枚舉量定義在ios類中,因此引用時必須包含ios::首碼。使用時應該全部用符號名,絕不要用數值。103用ios成員函數對狀態標誌進行操作ios類有3個成員函數可以對狀態標誌進行操作,並且定義了一個long型數據成員記錄當前狀態標誌。這些狀態標誌可用位或運算符“|”進行組合。設置狀態標誌用setf函數設置狀態標誌,其一般格式如下:longios::setf(longflags)清除狀態標誌用unsetf函數清除狀態標誌,其一般格式如下:longios::unsetf(longflags)取狀態標誌用函數flaps取狀態標誌有兩種形式,其格式分別如下:longios::flags()longios::flags(longflag)104用ios成員函數設置輸出寬度設置輸出寬度函數有兩種形式,其格式分別如下:
intios::width(intlen) intios::width()第一種形式是設置輸出寬度,並返回原來的輸出寬度;第二種形式是返回當前輸出寬度,輸出寬度為0。105設置填充字元填充字元的作用是當輸出值不滿輸出寬度時用填充字元來填充,默認填充字元為空格。它與width()函數配合使用,否則沒有意義。設置填充字元函數有兩種形式,其格式分別如下:
charios::fill(charch)charios::fill()第一種形式是重新設置填充字元,並返回設置前的填充字元;第二種形式是返回當前的填充字元。106設置輸出精度設置浮點數輸出精度有兩種形式,其格式分別如下:
intios::precision(intp)intios::precision()第一種形式是重新設置輸出精度,並返回設置前的輸出精度;第二種形式是返回當前的輸出精度。107用操作符函數格式化為了不直接以標誌位的方式去處理流的狀態,c++標準庫提供了標準的操作符函數專門操控這些狀態。這組函數不屬於任何類成員,定義在iomanip.h頭檔中。將它們用在提取運算符“>>”或插入運算符“<<”後面來設定輸入/輸出格式,即在讀寫對象之間插入一個修改狀態的操作。其中有些函數沒有參數,所以又叫操作符。108設置輸入/輸出寬度函數setw(int)設置輸出填充字元函數setfill(int)設置輸出精度函數setprecision(int)設置輸入/輸出整型數數制函數dec、hex和oct取消輸入結束符函數ws控制換行操作符endl代表輸出單字符“\0”的操作符ends109
檔的輸入/輸出C++把檔看作是一個字元(位元組)的序列,即由一個個字元(位元組)順序組成。根據數據的組織形式,可分為ASCII碼檔和二進位檔。ASCII碼檔又稱為文本檔,它的每一個位元組存放一個ASCII碼,代表一個字元。二進位檔是把記憶體中的數據按其在內存中的存儲形式原樣輸出到磁片檔存放。110C++有三種檔流類:輸入/輸出檔流類fstream輸入檔流類ifstream輸出檔流類ofstream它們分別從I/O流中的iostream、istream、ostream流類中派生而來。這些檔流類都定義在fstream.h頭檔中,因此,要使用檔流類,必須在程式開始包含該頭檔。111C++中進行檔操作的一般步驟為檔定義一個流類對象;使用open()函數建立(或打開)檔。如果檔不存在,則建立該檔;如果磁片上已存在該檔,則打開該檔;進行讀寫操作。在建立(或打開)的檔上執行所要求的輸入/輸出操作。一般來說,在內存與外設的數據傳輸中,由記憶體到外設稱為輸出或寫,反之則稱為輸入或讀;使用close()函數關閉檔。當完成操作後,應把打開的檔關閉,避免誤操作。112在C++中,打開一個檔就是將這個檔與一個流建立關聯;關閉一個檔就是取消這種關聯。open()函數的原型在fstream.h中定義。另外,在fstream、ifstream和ofstream流類中均有定義。其原型為:voidopen(char*filename,intmod,intaccess);其中第一個參數是用來傳遞檔案名;第二個參數的值決定檔的使用方式,如表7-4所示;第三個參數的值決定檔的訪問方式。113異常處理概述
在程式能正確支持所設計的正常情況之後,再添加語句來處理異常情況,這種思想就是異常處理。在C++中專門提供了這種機制,程式員在編寫程式的時候首先需要假裝不會產生任何異常寫好用於處理正常情況的語句,之後,利用C++的異常處理機制,添加用於處理異常情況的語句。114異常處理實現
C++語言提供對處理異常情況的內部支持。try,throw和catch語句就是C++語言中用於實現異常處理的機制。有了C++異常處理,程式可以向更高的執行上下文傳遞意想不到的事件,從而使程式能更好地從這些異常事件中恢復過來。115異常處理的語法try-throw-catch是拋出和捕獲異常的基本機制。Throw語句拋出異常(一個值),catch捕獲異常。拋出一個異常後,try塊會終止,轉而執行catch塊中的語句。catch塊結束之後,會繼續執行catch塊之後的語句(前提是catch塊中沒有終止程式或者執行另外一些特殊的操作)。如果try塊中沒有拋出異常,那麼在try塊結束之後,程式將從catch塊之後的語句繼續執行。換言之,如果沒有拋出異常,catch塊會被忽略。116try塊
如果在函數內直接用throw拋出一個異常(或在函數調用時拋出一個異常),將在異常拋出時退出函數。如果不想在異常拋出時退出函數,可以在函數體內創建一個特殊塊用於解決程式中潛在的錯誤,在這個塊中可以測試各種錯誤發生的可能性,通常稱為測試塊,它由關鍵字try引導。其定義格式如下:try{<語句>}117拋出異常
通常將拋出的值直接稱為一個異常,所以執行throw語句就稱為拋出異常,可以拋出任意類型的一個值。其定義的格式如下:
throw<拋出值的運算式>
執行throw語句時,週邊的try塊就會停止執行。如果try塊之後跟有一個合適的catch塊,那麼控制權就會轉交給那個catch塊。一般說來,throw語句幾乎肯定要嵌入一個分支語句(比如if語句)中。118捕獲異常
拋出一個異常後,週邊的try塊會停止執行,並開始執行另一個部分的語句,也就是catch塊。執行catch的過程稱為捕獲異常或者異常處理。一個異常被拋出以後,最終應該由某個catch塊來處理。119一般說來,catch塊參數主要完成兩件事情:catch塊參數前要加一個類型名,表示catch塊可以捕獲什麼類型的異常拋出值;catch塊參數為捕獲的異常拋出值指定了一個名稱,所以在catch塊中,又可以對這個異常拋出值進行相應的處理。120Windows編程基礎Windows操作系統是一個多任務、面向對象的圖形操作系統。在Windows操作環境中,Windows應用程式採用“基於消息的事件驅動”運行機制,這是它與過去的面向過程的應用程式機制的不同之處。121窗口窗口是由應用程式創建的一個用於接收用戶輸入和顯示輸出的矩形區域。窗口由“非客戶區”和“客戶區”組成。非客戶區由系統繪製,包括菜單、工具欄、最大化按鈕等。客戶區由應用程式繪製,用於輸出數據和接受用戶的輸入。Windows應用程式可以有多個窗口,每一個窗口都可以具有不同的功能。122事件和消息Windows操作環境中,無論是系統產生的動作或是用戶運行應用程式產生的動作,都稱為事件產生的消息。Windows應用程式利用消息與其他的Windows應用程式及Windows系統進行資訊交換。Windows的消息由三部分組成:消息號、字參數和長參數。消息號是預先定義的消息名標誌符字參數和長參數是與消息號相關的值,提供一些附加資訊。123句柄Windows應用程式中,句柄是標識諸如菜單、圖示、窗口、記憶體塊、輸出設備等對象的識別字號,Windows系統的各種資源都是通過句柄來訪問的。句柄是作為Windows系統內部表的索引值來使用的,而並非對象所在的記憶體地址。通過句柄只能夠安全的訪問對象,而不能直接訪問對象的內部結構。124GDI簡介許多MS-DOS程式都直接向視頻存儲區或印表機端口輸送數據,這樣做就需要為不同的輸出設備編寫不同的程式。Windows提供了一個抽象的圖形介面介面,稱為圖形設備介面,或簡稱GDI。它組成了Windows操作系統的核心部分。125設備環境設備環境(DeviceContext),也被稱為DC,是由GDI保存的一個數據結構,設備環境包含了輸出設備的繪圖特徵。不同設備有不同的設備環境,在輸出設備上輸出的先決條件是獲得該設備的設備環境。126畫筆畫筆指的是一種用於畫線及繪製有形邊框的工具,用戶可以指定它的顏色及寬度,並且可以指定它畫實線、點線或虛線等。畫刷定義了一種位圖形式的像素,利用它可對封閉區域內部填充顏色或樣式。字體是一種具有某種風格和尺寸的所有字元的完整集合。127資源游標、位圖、對話框和菜單都是資源。資源即數據,包含在應用程式的.exe檔中。當Windows把程式裝入記憶體執行的時候,它通常將資源留在磁片上。只有當Windows需要某一資源時,它才將資源裝入記憶體。資源在資源描述檔中定義。資源描述檔是以.rc為擴展名的ASCII碼檔。資源描述檔可以包含用ASCII碼表示的資源,也可以引用其他資源描述檔(ASCII或二進位檔)。128Windows環境下的資源主要有以下幾類:加速鍵、工具欄、游標、對話框、圖示、字串和菜單等。VisualC++為所有類型的資源都提供了資源編輯器進行可視化的編輯。129Windows編程中的數據結構數據結構描述MSG應用程式消息的結構WNDCLASS定義窗口類PAINTSTRUCT定義窗口用戶域的繪製消息RECT定義矩形130用MFC創建Windows應用程式MFC的框架結構提供如下優點:MFC按照C++類的層次形式組織在一起,類封裝了WindowsAPI函數並提供Windows應用程式常見任務的缺省處理代碼。幾個基類提供一般功能,由基類派生的類實現更具體的行為。MFC提供了文檔和視圖模型以實現數據和顯示的分離。文檔類(Document)用來維護、管理數據,包括數據的讀取、存儲與修改;視圖類(View)用來接收並顯示數據,將這些數據交給文檔類來處理。MFC庫提供了自動消息處理功能。MFC的框架結構通過消息映射機制,將Windows消息直接映射到—個成員函數進行處理,簡化了消息的處理方式。131MFC類的層次結構MFC類庫是一個功能強大、結構複雜和龐大的類庫。MFC的類可以分為兩種:從CObject派生的類及非CObject派生類。MFC有100種以上的類。132Windows應用程式類型用VisualC++創建MFC程式的典型結構一共有三種:基於單文檔的應用程式基於多文檔的應用程式基於對話框的應用程式133創建單文檔應用程式MFC的文檔/視圖結構將Windows應用程式的功能劃分在不同的類中。利用MFC提供的運行機制和消息傳遞機制,構成應用程式的類通過傳遞消息、調用介面函數,共同完成程式的功能。134AppWizard嚮導創建的類和文件AppWizard嚮導為生成的派生類創建單獨的原始檔案,缺省情況下,類名和類原始檔案名是基於專案名的(可以在AppWizard嚮導創建應用程式過程中指定其他名稱)。AppWizard嚮導為單文檔應用程式創建4個派生類和其他一些檔。這4個類分別是文檔類、視圖類、主框架窗口類和應用程式類。135應用程式的運行機制MFC應用程式有自己特殊的運行機制,下麵以WinHello程式為例,列出應用程式的執行過程。用CWinApp的構造函數;程式入口函數WinMain接受控制;WinMain調用應用程式類的InitInstance函數;WinMain進入消息迴圈;WinMain退出,程式中止。136消息處理機制MFC應用程式與其他任何Windows程式一樣,也使用消息驅動機制,但MFC提供的消息處理機制使得消息的處理更加容易。MFC中消息可以分為三類:Windows消息:包括以WM_開頭的消息,但WM_COMMAND除外。Windows消息由窗口和視圖處理。這種消息通常附帶一些參數傳遞給處理函數,這些參數為處理函數正確地處理消息提供了必要的資訊。控件通知消息:當控件的狀態發生改變(例如用戶利用利用控件進行輸入)時,控件就會向其父窗口發送控件通知消息。MFC對控件通知消息的傳遞方式與其他以WM_開頭的Windows消息一樣,但BN_CLICKED是個例外,該消息的傳遞方式與命令消息的傳遞機制一樣。命令消息:包括來自於菜單、工具欄中的按鈕和加速鍵等用戶介面對象的WM_COMMAND通知消息。137
輸入輸出處理輸入輸出處理是應用程式最基本的功能。Windows應用程式通過GDI提供的繪圖函數在窗口的客戶區輸出數據,通過對鍵盤消息和滑鼠消息的回應,完成對用戶輸入的處理。138文本輸出文本輸出函數鍵盤字元消息滑鼠139虛擬鍵代碼鍵盤類型根據語言或國家的不同而不同,為了避免依賴於特定國家的鍵盤佈局虛擬鍵代碼Windows識別字鍵盤VK_INSERTInsert(插入鍵)VK_LEFT↑左箭頭鍵VK_NEXTPageDown鍵VK_BACKBackspace鍵VK_RETURNEnter鍵140滑鼠消息當用戶移動滑鼠或釋放鬆開滑鼠按鈕時,將產生滑鼠消息。滑鼠消息可以分成兩類:客戶區滑鼠消息和非客戶區滑鼠消息。非客戶區包括窗口的邊界、標題欄、菜單、滾動條、最大化最小化按鈕。客戶區滑鼠消息指的是滑鼠在這些區域的操作而產生的消息。這種消息一般由系統處理。應用程式主要處理滑鼠在客戶區的操作而產生的消息。141菜單菜單(Menu)以可視的方式提供了對應用程式功能的選擇,是用戶與應用程式之間進行交互的主要方式之一。142菜單簡介菜單主要有彈出式和下拉式兩種。彈出式菜單可以出現在螢幕的任何位置,是為了回應滑鼠右鍵按鈕而啟動彈出式菜單。下拉式菜單可以看成由一個頂層菜單和彈出式菜單裝配而成。當選擇頂層菜單項時,下拉出一個子菜單,子菜單中是具體的菜單項。在子菜單項中選擇時,還可以再下拉出另一個子菜單,形成級聯菜單。143菜單的建立和實現菜單編輯器的使用。為程式加入菜單的操作分為以下幾步:通過菜單編輯器生成菜單介面;建立菜單項和消息處理函數的映射;在處理函數中添加菜單項功能代碼。144滾動條滾動功能使用戶可以閱讀和編輯大於視圖窗口的任何東西--無論是文本、表格、資料庫記錄還是圖像。只要它所需的空間超出了客戶區域所能提供的空間,就可以使用滾動條。145在程式中加入滾動功能CScrollView是從CView類派生的專用視圖類。從CScrollView類派生的視圖類自動將滾動條加入視圖窗口,並提供了支持滾動操作的大多數代碼。所有的GDI函數都使用邏輯座標,Windows將GDI函數中指定邏輯座標映射為設備座標。146在程式中實現分割功能
動讓用戶閱讀超過窗口的長文檔,但用戶也只能看文檔的某一部分,如果用戶想同時閱讀文檔中相隔很遠的部分,就只能同時打開兩個窗口,分別滾動到相應的位置閱讀。Windows提供窗口分割功能,實現同時閱讀長文檔的不同部分。在窗口的垂直滾動條的上部和水準滾動條的底部,存在一個分割框區域,雙擊分割框或拖動分割框到所需的位置,窗口被垂直或水準地分成兩個獨立的窗口,被分割後的窗口稱為面板,用以顯示同一文檔或圖形的不同部分。147工具欄和狀態欄工具欄和狀態欄是Widows應用程式中常見的用戶介面。工具欄是一種快捷操作的工具,常用的命令通常放在工具欄中,方便操作。而狀態欄則用於顯示目前程式的執行狀態和說明。148工具欄的實現具欄包含一系列的位圖按鈕,通常情況下,單擊按鈕等價於從菜單中選擇相應的菜單項。工具欄可以停靠在父窗口的頂部,也可以停靠在父窗口的任何靠邊的位置,或者脫離父窗口,移動到自己的框架窗口內。停靠工具欄(DockingToolbars)指的是和父窗口相連的工具欄。與之相對就就是浮動工具欄(FloatingToolbars)。149ToolbarDemo程式的圖形菜單有直線、矩形和圓形三種選擇,相應的,在工具欄中需要建立這三種按鈕。具體操作步驟如下:打開工具欄編輯器,修改AppWizard嚮導生成的預定義工具欄。在工具欄面板中刪除嚮導生成的缺省按鈕,只留下一個空白按鈕。用滑鼠將按鈕拖出工具欄面板就刪除該按鈕。創建直線按鈕。選擇圖形工具欄中的直線,在按鈕繪製區域從左上角到右下角畫直線。完成後,雙擊生成的直線按鈕,彈出ToolbarButtonProperties對話框。在ToolbarButtonProperties對話框中設置按鈕的ID(識別字)以及Prompt(提示資訊)。在ID框中,輸入ID_LINE。一旦編輯完第一個按鈕的內容,在它右面會出現一個新的空白按鈕。單擊這個空白按鈕,繼續編輯下一個按鈕。創建矩形按鈕。選擇圖形工具條中的矩形,在空白按鈕中繪出一個矩形。按鈕的ID取值為ID_RECTANGLE。按以上步驟,再添加一個圓形按鈕。ID取值為ID_CIRCLE。完成工具欄的設計。150狀態欄的實現
狀態欄一般都停靠在主框架窗口的底部,包含多個面板,用做文本輸出或指示器,而且也無須改變其位置。如果在AppWizard嚮導的Step4對話框中選擇了Initialstatusbar項,AppWizard嚮導生成的應用程式就擁有一個缺省的狀態欄。設計狀態欄的任務是:定義提示資訊,建立特定狀態和提示資訊的聯繫。151對話框和控件對話框用於顯示消息和取得用戶數據,是Windows應用程式中最常用的用戶介面。對話框作為一個容器,通常包括各種控件,如編輯框、按鈕、組合框和列表框等。用戶通過在編輯框中輸入資訊,通過對列表框、單選框等的選擇,為應用程式提供必要的數據。對話框有兩種類型:模式對話框和非模式對話框。這兩種形式的對話框在打開和關閉方式上存在區別。MFC的Dialog類是對話框類的基類,提供了對話框的打開、關閉和管理對話框及對話框中的控件等功能。152控件簡介控件是Windows應用程式和用戶進行交互的常用手段。在VisualC++中,控件可以分成三類:Windows標準控件、ActiveX控件和其他MFC控件類。Windows標
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业水利改造升级技术应用合同
- 旅游地产投资合同审查策略
- 建筑供滑雪场人工费施工合同
- 会计服务外包服务合同范本
- 城市机场广告牌施工合同
- 工业厂房屋面瓦安装协议
- 动漫产业质检岗位聘用合同模板
- 造纸工程私人施工合同样式
- 消防工程劳务合同模板
- 建筑工程防雷施工合同范本
- 2023-2024学年广东省深圳市南山区八年级(上)期末英语试卷
- 期末 (试题) -2024-2025学年人教PEP版(2024)英语三年级上册
- 中医跨文化传播智慧树知到期末考试答案章节答案2024年浙江中医药大学
- 剪刀式升降车专项施工方案
- 风电项目监理大纲附录风电工程设备监理项目表
- 《混凝土结构》(楼盖)课程设计任务书
- 邵雍河洛理数解卦
- 赵本山《卖拐》台词
- 上海建设工程通用硅酸盐水泥质量检验报告 - 上海水泥行业协会
- 工程测量英语常用词汇
- 国军标与国标的区别
评论
0/150
提交评论