版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
CHAPTER07C++程序設計第7章類和對象的基礎從面向過程到面向對象——類域、實例化、this指針與內存模型Contents本章目錄C++程序設計·第7章類和對象的基礎01面向對象編程概述02類的定義與類域機制03對象的實例化與內存模型04this指針原理與應用05實戰案例:Stack類完整實現CHAPTER01面向對象編程概述從C語言的面向過程到C++的面向對象,理解編程范式的根本轉變ProgrammingParadigms·編程范式面向過程vs面向對象面向過程編程以函數為核心、數據與操作分離,適合小型程序但難以應對復雜系統;面向對象編程將數據和操作封裝為類,通過封裝、繼承、多態三大特性實現代碼的高內聚低耦合,是現代大型軟件工程的基石。面向過程編程C·Procedural以函數為基本單元,程序被拆解為一系列有序的步驟和流程,數據通過參數在函數間傳遞數據與操作數據的函數相互分離,全局變量容易被任意函數修改,導致維護困難和隱蔽Bug代碼復用主要依賴函數庫和頭文件,缺乏對復雜數據關系的抽象能力,系統規模增大后耦合度急劇上升面向對象編程C++·Object-Oriented以類為基本單元,將數據(屬性)和操作數據的方法(行為)封裝在一起,模擬現實世界的事物關系通過封裝機制隱藏內部實現細節,外部只能通過公開接口訪問,有效保護數據完整性和安全性支持繼承和多態,允許在已有類的基礎上擴展新功能,實現代碼的高效復用和靈活擴展OOPFundamentals面向對象三大特性封裝、繼承、多態分別解決數據保護、代碼復用和接口靈活性問題,三者協同構建高內聚低耦合架構。封裝Encapsulation將數據成員和成員函數捆綁在類內部,對外只暴露必要的公開接口,隱藏具體實現細節通過public、private、protected三種訪問限定符控制成員可見性,防止外部隨意篡改類比:ATM機封裝了賬戶操作邏輯,用戶無需了解后臺數據庫如何運作數據保護繼承Inheritance允許派生類在基類基礎上創建,自動獲得基類屬性和方法并可擴展新功能支持單繼承和多繼承,通過層次化類體系實現代碼縱向復用,減少重復編寫類比:"汽車"派生出"電動汽車"和"燃油汽車",共享輪胎方向盤,各有特有動力系統代碼復用多態Polymorphism同一接口在不同對象上表現出不同行為,提高代碼的靈活性和可擴展性C++通過虛函數(virtual)和函數重載(overload)實現運行時多態和編譯時多態類比:同樣是"啟動"指令,燃油車需點火,電動車按啟動鍵即可,調用者無需關心實現接口靈活Chapter07·類和對象現實世界的類與對象類是對一類事物的抽象描述(藍圖),對象是該抽象的具體實例(實體)。汽車生產線——從藍圖到實體的實例化過程Class類=設計圖紙:定義汽車應有的屬性(品牌、型號、年份)和行為(啟動、加速、剎車),是抽象模板,不占用物理內存Object對象=造出的實體:根據圖紙生產的具體汽車,如一輛2024款豐田卡羅拉,每個對象獨立占用內存存儲各自的屬性值1:N一對多關系:一份圖紙(類)可生產無數輛汽車(對象),每輛車有獨立數據,但共享同一套行為邏輯(成員函數)C++class.語法映射:用class關鍵字定義類,通過類名+變量名創建對象,用點操作符.訪問屬性和方法CHAPTER02類的定義與類域機制掌握class關鍵字、訪問限定符、聲明與定義分離等核心語法要素OOP·Chapter07類的基本定義語法C++使用class關鍵字定義類,類體中包含成員變量和成員函數,類定義本身不分配內存,僅作為對象實例化的藍圖。01class關鍵字+類名+花括號+分號構成完整的類定義,例如classStudent{...};—分號不可省略,否則編譯器會報語法錯誤class...;02成員變量(數據成員)聲明在類體內,描述對象的屬性狀態,如stringname;intage;—在對象實例化時才分配實際內存DataMembers03成員函數定義對象的行為能力,可在類體內實現(內聯),也可在類體內聲明、類體外定義(分離式),后者更適合復雜邏輯MemberFunc04類定義本身不占內存,它只是告訴編譯器"這個類型長什么樣",類似int類型定義本身不占內存,只有inta才會分配4字節0BytesENCAPSULATION訪問限定符與封裝C++通過public、private、protected三種訪問限定符實現封裝,控制類成員的可見性邊界。class默認訪問權限為private(與struct的public不同),遵循"數據私有、接口公開"的封裝原則,是保護數據完整性的核心機制。三種訪問限定符對比訪問限定符類內部類外部派生類典型用途public???對外接口函數,如構造、析構、getter/setterprivate???內部數據成員,防止外部直接修改protected???需要被子類繼承但不對外的成員public對外開放、private對內封閉、protected為繼承預留,三者組合實現精細化的封裝控制Scope&Namespace類域與作用域解析類域是由類定義引入的獨立作用域,類中所有成員都在類域內有效。類域影響編譯器的名稱查找規則,在類外定義成員函數時必須用::作用域限定符指明所屬類域。Definition類域由class定義自動引入,類體內聲明的成員變量和成員函數均處于該類域中,僅在類范圍內有效。Operator類外定義成員函數時必須使用::作用域限定符(如Stack::Init),否則編譯器將其視為全局函數,導致編譯報錯。Independence類域與全局作用域相互獨立,類內成員名不會與全局變量沖突;類域與局部作用域也各自獨立,函數內局部變量不會干擾類成員。Namespace命名空間域(namespace)是更靈活的全局域組織方式,與類域沒有直接包含關系,但類可以定義在命名空間內形成嵌套作用域。C++·類和對象成員函數的定義方式C++成員函數支持類內定義(隱式內聯)和類外定義(聲明與定義分離)兩種方式。工程實踐中通常將類定義放入頭文件(.h),將函數實現放入源文件(.cpp),既保持類定義簡潔,又利于編譯管理和團隊協作。Inline類內定義函數體直接寫在類體內,編譯器默認將其視為內聯函數,減少函數調用開銷,適合簡短的getter/setter等邏輯。//示例classPoint{intgetX(){returnx;}voidsetX(intv){x=v;}};Trade-off優點是實現緊湊、一目了然;缺點是類體過長時可讀性下降,且每次修改函數實現都需要重新編譯所有包含該頭文件的源文件。Separation類外定義::類體內僅保留函數聲明,實現寫在類體外并使用::限定符,保持類定義簡潔清晰。//示例classPoint{intgetX();};intPoint::getX(){returnx;}BestPractice將類聲明放在頭文件(.h)、函數實現放在源文件(.cpp),便于多人協作、縮短增量編譯時間,是大型項目的標準做法。CHAPTER03對象的實例化與內存模型理解對象創建過程、內存分配機制與sizeof計算規則Chapter07·Classes&Objects對象的創建與使用對象通過類名+變量名的語法在棧上實例化,或用new在堆上動態創建。每個對象擁有獨立的成員變量副本但共享成員函數代碼。01棧上實例化CarmyCar;直接在棧區分配內存,對象生命周期隨作用域結束自動回收,語法簡潔但大小受限于棧空間。CarmyCar;02堆上實例化Car*pCar=newCar();在堆區動態分配內存,需手動delete釋放,適合大型對象或需要靈活控制生命周期的場景。newCar()03成員訪問棧對象用點操作符(myCar.brand),指針用箭頭操作符(pCar→brand),二者等價,箭頭是(*pCar).brand的簡寫。.&→04獨立數據共享邏輯每個對象擁有獨立的成員變量副本,但所有對象共享同一份成員函數的機器指令,成員函數不占對象內存。SharedCodeOBJECTSIZE對象大小的計算規則對象大小僅由成員變量決定,成員函數不占空間;實際大小受內存對齊影響,空類為1字節sizeof運算符計算對象所占內存字節數,如sizeof(Car)返回實際大小,結果在編譯期即可確定編譯期成員函數不占空間同類型對象共享同一份函數機器碼,存儲在代碼段,函數多少不影響對象大小代碼段內存對齊影響編譯器為CPU訪問效率進行對齊填充,如int(4B)+char(1B)實際占8B而非5B5B→8B空類大小為1無成員變量的空類sizeof為1而非0,保證每個對象擁有唯一內存地址1ByteMemoryAlignment內存對齊詳解內存對齊是編譯器為提升CPU訪問效率而在成員變量間插入填充字節的機制。01第一個成員偏移量為0,后續每個成員的起始地址必須是min(自身大小,編譯器默認對齊數)的整數倍02類/結構體的總大小必須是所有成員中最大對齊數的整數倍,不足則在末尾填充03#pragmapack(n)可修改默認對齊數,如#pragmapack(1)取消填充,常用于網絡傳輸與文件存儲計算示例·4字節對齊classExample{chara;intb;charc;}a1B+填充3B→b4B→c1B+填充3B調整聲明順序:chara,c相鄰a,c2B+填充2B→b4B原始12B優化后8BCHAPTER04this指針原理與應用揭示成員函數如何定位調用對象的底層機制,理解隱式this參數的傳遞過程C++·類和對象this指針的引入動機非靜態成員函數被所有對象共享,編譯器通過隱式傳遞this指針來區分不同對象的數據操作。01核心問題成員函數代碼只有一份,被所有對象共享,但d1.print()和d2.print()需要輸出不同數據——函數如何區分調用者?02編譯器方案在非靜態成員函數的參數列表中隱式添加this指針參數,類型為類名*const,指向當前調用該函數的對象。03調用轉換d1.print()被編譯器轉換為print(&d1),d2.print()轉換為print(&d2),this指針分別指向不同對象的起始地址。04函數內訪問成員函數中寫year實際上是this->year的簡寫,通過this指針解引用訪問調用對象對應的成員變量。C++·第7章類和對象this指針this指針是編譯器隱式傳遞的常量指針(類名*const),僅存在于非靜態成員函數中,由編譯器自動管理,程序員無需手動傳遞。this指針的性質常量指針類型為類名*const,指針本身不可修改,不能指向其他對象,但可通過指針修改所指向對象的成員數據。隱式傳遞由編譯器在調用時自動壓棧傳遞,程序員不需要也不能手動傳遞,函數簽名中不可見但確實存在。非靜態專屬僅存在于非靜態成員函數中;靜態成員函數沒有this指針,因為static函數屬于類而非某個特定對象。常見使用場景解決命名沖突構造函數中this->name=name;區分同名的形參和成員變量,是C++中最常見的this用法。Person(stringname){this->name=name;}鏈式調用成員函數返回*this引用,如obj.set(20).setName("Tom"),實現流式API風格。Person&setAge(inta){age=a;return*this;}Comparisonthis指針vsC語言結構體指針this指針的本質與C語言中手動傳遞結構體指針完全相同,都是為了讓函數知道操作哪個對象的數據。C++將這一過程自動化——編譯器隱式傳遞this指針,消除了手動傳參的冗余和出錯風險,是語法層面的優雅封裝。對比維度C語言方式C++方式函數定義voidInit(Stack*ps,intn){ps->top=0;}voidStack::Init(intn){top=0;}函數調用Init(&st,10);—手動傳遞結構體地址st.Init(10);—編譯器自動傳遞&st作為this成員訪問ps->array,ps->capacity—顯式通過指針array,capacity—隱式通過this,可省略this->安全性可能傳NULL指針,需手動檢查this指針由編譯器保證非空(正常調用場景)C++的this指針是對C語言手動傳結構體指針的自動化封裝,底層原理一致,語法更簡潔安全。C++·類和對象經典面試問題:this指針與安全空指針調用成員函數是否崩潰取決于函數是否解引用this指針訪問成員數據。非靜態成員函數訪問成員變量時會解引用this,空指針導致崩潰;靜態成員函數沒有this指針,空指針調用不會崩潰。理解這一點需要深入掌握this指針的傳遞與使用機制。01空指針調用非靜態函數Student*p=nullptr;p->print();print()this->nameStudent*p=nullptr;p->print();若print()內部訪問了this->name等成員變量,解引用空指針導致程序崩潰(段錯誤)print()cout<<"hello"thisnullptr若print()內部僅執行cout<<"hello"而不訪問任何成員,this雖為nullptr但未解引用,程序不會崩潰(但屬于未定義行為)RISK段錯誤02空指針調用靜態函數Student*p=nullptr;p->showCount();showCount()staticthisStudent*p=nullptr;p->showCount();若showCount()是static靜態函數,不存在this指針,調用不依賴對象地址,不會崩潰thisStudent::showCount()p本質原因:靜態函數屬于類而非對象,編譯器不傳遞this指針,等價于Student::showCount(),與p的值無關SAFE無thisCHAPTER05實戰案例:Stack類完整實現從零構建一個動態棧類,綜合運用類定義、封裝、內存管理與this指針ClassDesignStack類設計規劃Stack類遵循"數據私有、接口公開"的封裝原則,將動態數組指針、容量和棧頂索引作為private成員保護內部狀態,將初始化、入棧、出棧、查看棧頂、判空和銷毀等操作作為public接口對外暴露,實現了高內聚低耦合的類設計。PRIVATE成員變量01int*array—指向動態分配的數組空間,用于存儲棧中元素,需要手動malloc/free管理內存生命周期02size_tcapacity—記錄當前數組的總容量,用于判斷是否需要擴容,初始值由Init函數的參數決定03size_ttop—記錄棧頂元素的下一個位置索引,top=0表示空棧,Push時top++,Pop時top--PUBLIC成員函數01Init(intn=4)—初始化棧,分配n個int大小的動態數組,設置capacity和top初始值02Push(intx)/Pop()—入棧和出棧操作,Push需檢查是否滿載,Pop需檢查是否空棧03Top()/Empty()/Destroy()—查看棧頂元素、判斷是否為空、釋放動態內存并重置指針CHAPTER7·STACKIMPLEMENTATIONInit初始化函數實現Init函數負責為Stack對象分配動態數組空間并初始化狀態變量。實現中必須進行malloc返回值檢查以防止內存分配失敗導致的空指針訪問。01函數簽名類外定義使用Stack::作用域限定符指明類域,默認參數n=4允許調用時不傳參voidStack::Init(intn=4)02內存分配動態分配n個int大小的連續內存空間,array指針存儲首地址malloc(sizeof(int)*n)03安全檢查檢查malloc返回值,失敗時調用perror打印錯誤信息并提前returnnullptr==array04狀態初始化通過隱式this指針訪問成員變量,設置容量與棧頂索引初始值capacity=ntop=0STACKOPERATIONSPush入棧與Pop出棧實現Push操作將元素寫入array[top]并遞增top,需先檢查棧是否滿載;Pop操作遞減top實現邏輯出棧,需先檢查棧是否為空。Push入棧CORELOGICarray[top++]=x;將元素寫入棧頂位置,top自增指向新空位SAFETYCHECK判斷top==capacity,滿棧需realloc擴容,否則越界破壞內存THISPOINTERd1.Push(5)時this=&d1,同一代碼操作不同對象數據array[top++]=xPop出棧CORELOGICtop--;僅需棧頂索引減1,原位置數據下次Push自動覆蓋SAFETYCHECK必須判斷top==0,空棧Pop致top下溢為極大值引發嚴重錯誤DESIGN只改索引不刪數據,時間復雜度O(1),體現棧操作高效簡潔top--·O(1)StackLifecycleTop、Empty與Destroy實現Top函數返回array[top-1]獲取棧頂元素,Empty通過top==0判斷空棧狀態,Destroy釋放動態內存并重置指針防止懸空。三個函數構成了Stack類的完整生命周期管理,Destroy的內存清理職責在后續學習析構函數后將被自動化。Top獲取棧頂returnarray[top-1];top指向棧頂下一位置,故top-1才是棧頂元素下標,調用前需確認棧非空(top>0)。array[top-1]Empty判空returntop==0;利用布爾表達式直接返回判斷結果,空棧返回true,非空返回false,實現簡潔高效。true/falseDestroy銷毀free(array)釋放動態數組內存;array=nullptr防止懸空指針;top=capacity=0重置狀態,避免二次釋放。nullptr資源管理意識Init分配內存與Destroy釋放內存必須配對使用,遺漏Destroy將導致內存泄漏,這是C++手動內存管理的核心責任。配對使用STACK·生命周期Stack類完整使用流程從對象聲明到Init初始化、Push/Pop操作再到Destroy釋放,Stack類的完整使用流程演示了類的生命周期管理。每次成員函數調用都由編譯器隱式傳遞this指針,確保操作作用于正確的對象實例,多對象場景下各對象數據完全獨立。01聲明對象Stackst;編譯器為st分配sizeof(Stack)字節??臻g,包含array指針(8B)、capacity(8B)、top(8B)共24字節24字節02初始化st.Init();調用Init函數,this指針自動指向st,為st的array成員分配動態內存,capacity=4,top=0capacity=403入棧操作st.Push(1);st.Push(2);st.Push(3);三次調用Push,依次將1、2、3寫入array,top從0遞增到3Push×304出棧與銷毀st.Pop();top從3減為2,邏輯刪除棧頂元素3;st.Destroy();釋放array指向的堆內存,完成資源回收DestroyCHAPTER07·SUMMARY本章知識點總結第7章系統講解了C++類與對象的基礎知識,從面向對象編程的宏觀思想到類定義、對象實例化、this指針的微觀機制,構建了完整的認知框架。這些知識是后續學習構造/析構函數、運算符重載、繼承與多態的必要基礎。SECTION01核心概念01類是抽象藍圖(不占內存),對象是具體實例(占內存);封裝、繼承、多態是面向對象三大特性02class定義語法包含成員變量和成員函數,訪問限定符(public/private/protected)實現封裝控制封裝·繼承·多態SECTION02底層機制01類域是獨立作用域,類外定義成員函數必須用::限定符;內存對齊影響對象實際大小,空類大小為1字節02this指針是編譯器隱式傳遞的常量指針(類名*const),僅存在于非靜態成員函數中,用于區分不同調用對象::作用域·this指針SECTION03下章預告第8章將學習構造函數與析構函數,實現對象創建時的自動初始化和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沙漠級空氣取水指南
- 2026年災害應急社工社會工作者招聘考試筆試試題(含答案)
- 2026年銀行對公信貸外勤走訪專員銀行招聘考試筆試試題(含答案)
- 2026年煙草人事年度考核臺賬專員煙草公司招聘考試筆試試題(含答案)
- 2026 年阿爾茨海默病躁動患者照護護理方案
- 2026年秋季食品工程專業開學第一課 專業精神與文化傳承講座方案
- 2026年秋季幼兒園開學第一課 校園安全與自我保護
- 2026年秋季英語專業開學第一課 職業發展前景分析
- 新冠病毒感染傳染病上報及死亡證明書培訓考核試題(含答案)
- 醫藥代表面試中常問問題(附答案)
- AI大數據應用平臺信息技術安全開發運營技術規范
- 張家口市自來水管理辦法
- 2024-2025學年度人教版八年級數學下冊暑假作業(共21天含答案)
- LY/T 2005-2024國家級森林公園總體規劃規范
- 鋼結構車間及辦公樓土建施工組織設計(完整版)
- DL∕T 802.7-2023 電力電纜導管技術條件 第7部分:非開挖用塑料電纜導管
- JBT 14685-2023 無油渦旋空氣壓縮機 (正式版)
- YY/T 1740.3-2024醫用質譜儀第3部分:電感耦合等離子體質譜儀
- 飼料學全套課件
- 助力新員工融入團隊的入職培訓計劃
- 彭吉象《藝術學概論》100題-考研
評論
0/150
提交評論