C++類和對象(一)

目錄

面向過程和面向對象

面向過程編程(Procedural Programming)

面向對象編程(Object-Oriented Programming)

一、類的定義

類定義格式

類域

二、類的訪問限定符及封裝

訪問限定符

?封裝

三、實例化

實例化概念

對象大小

四、this指針

this指針的特性


面向過程和面向對象

  • C 語言是一種典型的面向過程的編程語言,程序的設計主要圍繞著函數和數據結構展開,強調的是功能的實現過程。
  • C++既支持面向過程編程,又支持面向對象編程。面向對象編程的核心概念包括類、對象、封裝、繼承和多態等,使得程序的組織和設計更加符合現實世界的模型,提高了代碼的可維護性和可擴展性。

面向過程編程(Procedural Programming)

面向過程編程是一種以過程為中心的編程思想。在面向過程編程中,程序被看作是一系列的函數或過程的集合,這些函數或過程按照一定的順序執行,以完成特定的任務。

優點:

  • 性能高效:由于面向過程編程直接按照流程執行任務,不需要過多的對象創建和管理,因此在一些對性能要求較高的場景下,如底層系統編程、嵌入式編程等,具有較高的執行效率。例如在操作系統內核中,對進程調度、內存管理等功能的實現,使用面向過程編程可以更好地優化性能。
  • 邏輯清晰:對于簡單的程序邏輯,按照流程逐步實現,代碼的邏輯結構清晰易懂,易于理解和維護。比如一個簡單的計算兩個數之和的程序,使用面向過程編程可以直接定義函數進行計算。

缺點:

  • 可維護性差:當程序規模增大、功能復雜時,面向過程編程的代碼可能會變得難以維護和擴展。因為各個函數之間的耦合度較高,修改一個函數可能會影響到其他相關的函數。
  • 代碼復用性低:代碼的復用通常是通過函數的調用實現,但是對于復雜的功能模塊,復用的難度較大,無法很好地對功能進行封裝和抽象。

面向對象編程(Object-Oriented Programming)

面向對象編程是一種以對象為中心的編程思想。對象是包含數據(屬性)和操作這些數據的方法(行為)的實體。通過將相關的數據和方法封裝在一個對象中,實現了數據和操作的一體化。

優點:

  • 可維護性高:將功能封裝在對象中,使得對象的內部實現對外界隱藏,降低了模塊之間的耦合度。當需要修改功能時,只需要修改相應的對象內部實現,而不會影響到其他不相關的部分。例如,在一個圖形界面應用程序中,如果要修改某個按鈕的功能,只需要修改該按鈕對象對應的方法,而不會影響到其他界面元素。
  • 代碼復用性強:可以通過繼承、多態等特性,方便地實現代碼的復用和擴展。例如,創建一個基類?Shape(形狀),然后派生出?Circle(圓形)、Rectangle(矩形)等子類,子類可以復用基類的屬性和方法,并進行特定的擴展。
  • 靈活性好:面向對象編程支持多態性,使得程序在運行時可以根據對象的實際類型動態地選擇執行相應的方法,增加了程序的靈活性和擴展性。

缺點:

  • 性能開銷:由于對象的創建、方法調用等操作需要一定的開銷,在一些對性能要求極高的場景下,可能會影響程序的執行效率。
  • 學習成本高:面向對象編程的概念和特性相對復雜,對于初學者來說,學習和理解的難度較大。

一、類的定義

類定義格式

? class為定義類的關鍵字,Data為類的名字,{}中為類的主體,注意類定義結束時后?分號不能省略。類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量;類中的函數稱為類的?法或者成員函數。

? 為了區分成員變量,?般習慣上成員變量會加?個特殊標識,如成員變量前?或者后?加_或者m開頭,注意C++中這個并不是強制的,只是?些慣例。

? C++中struct也可以定義類,C++兼容C中struct的?法,同時struct升級成了類,明顯的變化是 struct中可以定義函數,?般情況下還是推薦?class定義類。

? 定義在類?的成員函數默認為inline。

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:// 為了區分成員變量,?般習慣上成員變量// 會加?個特殊標識,如_ 或者 m開頭int _year; // year_ m_yearint _month;int _day;
};
int main()
{Date d;d.Init(2024, 3, 31);return 0;
}

類域

? 類定義了?個新的作?域,類的所有成員都在類的作?域中,在類體外定義成員時,需要使?::作?域操作符指明成員屬于哪個類域。

? 類域影響的是編譯的查找規則,下?程序中Init如果不指定類域Stack,那么編譯器就把Init當成全局函數,那么編譯時,找不到array等成員的聲明/定義在哪?,就會報錯。指定類域Stack,就是知道Init是成員函數,當前域找不到的array等成員,就會到類域中去查找。

#include<iostream>
using namespace std;
class Stack
{
public:// 成員函數void Init(int n = 4);
private:// 成員變量int* array;size_t capacity;size_t top;
};
// 聲明和定義分離,需要指定類域
void Stack::Init(int n)
{array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申請空間失敗");return;}capacity = n;top = 0;
}
int main()
{Stack st;st.Init();return 0;
}

二、類的訪問限定符及封裝

訪問限定符

? C++?種實現封裝的?式,?類將對象的屬性與?法結合在?塊,讓對象更加完善,通過訪問權限 選擇性的將其接?提供給外部的用戶使?。

? public修飾的成員在類外可以直接被訪問;protected和private修飾的成員在類外不能直接被訪問,protected和private是?樣的,以后繼承章節才能體現出他們的區別。

? 訪問權限作?域從該訪問限定符出現的位置開始直到下?個訪問限定符出現時為?,如果后?沒有 訪問限定符,作?域就到}即類結束。

? class定義成員沒有被訪問限定符修飾時默認為private

? struct默認為public

? ?般成員變量都會被限制為private/protected,需要給別?使?的成員函數會放為public。

?封裝

面向對象的三大特性:封裝、繼承、多態。

在類和對象階段,主要是研究類的封裝特性,那什么是封裝呢?

封裝:將數據和操作數據的方法進行有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來 和對象進行交互。

封裝本質上是一種管理,讓用戶更方便使用類。比如:對于電腦這樣一個復雜的設備,提供給用 戶的就只有開關機鍵、通過鍵盤輸入,顯示器,USB插孔等,讓用戶和計算機進行交互,完成日 常事務。但實際上電腦真正工作的卻是CPU、顯卡、內存等一些硬件元件。

對于計算機使用者而言,不用關心內部核心部件,比如主板上線路是如何布局的,CPU內部是如 何設計的等,用戶只需要知道,怎么開機、怎么通過鍵盤和鼠標與計算機進行交互即可。因此計 算機廠商在出廠時,在外部套上殼子,將內部實現細節隱藏起來,僅僅對外提供開關機、鼠標以 及鍵盤插孔等,讓用戶可以與計算機進行交互即可。

在C++語言中實現封裝,可以通過類將數據以及操作數據的方法進行有機結合,通過訪問權限來 隱藏對象內部實現細節,控制哪些方法可以在類外部直接被使用。

三、實例化

實例化概念

? ?類類型在物理內存中創建對象的過程,稱為類實例化出對象。

? 類是對象進行?種抽象描述,是?個模型?樣的東西,限定了類有哪些成員變量,這些成員變量只 是聲明,沒有分配空間,?類實例化出對象時,才會分配空間。

? ?個類可以實例化出多個對象,實例化出的對象占?實際的物理空間,存儲類成員變量。打個??:類實例化出對象就像現實中使?建筑設計圖建造出房?,類就像是設計圖,設計圖規劃了有多 少個房間,房間大小功能等,但是并沒有實體的建筑存在,也不能住?,?設計圖修建出房?,房?才能住?。同樣類就像設計圖?樣,不能存儲數據,實例化出的對象分配物理內存存儲數據。

對象大小

分析?下類對象中哪些成員呢?類實例化出的每個對象,都有獨?的數據空間,所以對象中肯定包含成員變量,那么成員函數是否包含呢??先函數被編譯后是?段指令,對象中沒辦法存儲,這些指令存儲在?個單獨的區域(代碼段),那么對象中非要存儲的話,只能是成員函數的指針。再分析?下,對象中是否有存儲指針的必要呢,Date實例化d1和d2兩個對象,d1和d2都有各?獨?的成員變量 _year/_month/_day存儲各?的數據,但是d1和d2的成員函數Init/Print指針卻是?樣的,存儲在對象 中就浪費了。如果?Date實例化100個對象,那么成員函數指針就重復存儲100次,太浪費了。其實函數指針是不需要存儲的,函數指針是?個地址,調?函數被編譯成匯編指 令[call地址],其實編譯器在編譯鏈接時,就要找到函數的地址,不是在運行時找,只有動態多態是在運行時找,就需要存儲函數地址。

上?我們分析了對象中只存儲成員變量,C++規定類實例化的對象也要符合內存對?的規則。?

?內存對齊規則

?內存對齊規則和C語言的一模一樣? ? ? ? ? 參考文章:C語言計算內存對齊

第?個成員在與結構體偏移量為0的地址處。

? 其他成員變量要對?到某個數字(對齊數)的整數倍的地址處。

? 注意:對?數=編譯器默認的?個對齊數與該成員大小的較小值。

?VS中默認的對?數為8

? 結構體總大小為:最大對齊數(所有變量類型最?者與默認對?參數取最小)的整數倍。

? 如果嵌套了結構體的情況,嵌套的結構體對?到??的最?對?數的整數倍處,結構體的整體大小就是所有最?對齊數(含嵌套結構體的對齊數)的整數倍。

沒有成員變量要給1個字節,因為如果?個字節都不給,怎么表?對象存在過呢!所以這?給1字節,純粹是為了占位標識對象存在。?

四、this指針

this指針的特性

Date類中有Init與Print兩個成員函數,函數體中沒有關于不同對象的區分,那當d1調?Init和 Print函數時,該函數是如何知道應該訪問的是d1對象還是d2對象呢?那么這?就要看到C++給了?個隱含的this指針解決這里的問題

? 編譯器編譯后,類的成員函數默認都會在形參第?個位置,增加?個當前類類型的指針,叫做this指針。比如Date類的Init的真實原型為,void Init(Date* const this, int year, int month, int day) ? 類的成員函數中訪問成員變量,本質都是通過this指針訪問的,如Init函數中給_year賦值, this- >_year = year;

? C++規定不能在實參和形參的位置顯的寫this指針(編譯時編譯器會處理),但是可以在函數體內顯示使用this指針。

#include<iostream>
using namespace std;
class Date
{
public:// void Init(Date* const this, int year, int month, int day)void Init(int year, int month, int day){// 編譯報錯:error C2106: “=”: 左操作數必須為左值// this = nullptr;// this->_year = year;_year = year;this->_month = month;this->_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:// 這?只是聲明,沒有開空間int _year;int _month;int _day;
};
int main()
{// Date類實例化出對象d1和d2Date d1;Date d2;d1.Init(2024, 7, 1);  // d1.Init(&d1, 2024, 7, 1);d1.Print();           // d1.Print(&d1);d2.Init(2024, 7, 10); // d2.Init(&d2, 2024, 7, 10);d2.Print();           // d2.Print(&d2);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44416.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44416.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44416.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件運行次數

題目&#xff1a; 實現一個驗證程序運行次數的小程序&#xff0c;要求如下&#xff1a; 當程序運行超過3次時給出提示&#xff1a;本軟件只能免費使用3次&#xff0c;歡迎您注冊會員后繼續使用&#xff5e;程序運行演示如下&#xff1a; 第一次運行控制臺輸出&#xff1a;歡迎…

常見WAF攔截頁面總結

(1) D盾 (2) 云鎖 (3) UPUPW安全防護 (4) 寶塔網站防火墻 (5) 網防G01 (6) 護衛神 (7) 網站安全狗 (8) 智創防火墻 (9) 360主機衛士或360webscan (10) 西數WTS-WAF (11) Naxsi WAF (12) 騰訊云 (13) 騰訊宙斯盾 (14) 百度云 圖片 (15) 華為云 (16) 網宿云 (17) 創宇盾 圖片 (…

ROS服務通信自定義srv

服務通信自定義srv 流程:創建ROS功能包按照固定格式創建srv文件編譯配置文件編譯生成中間文件 流程: srv 文件內的可用數據類型與 msg 文件一致&#xff0c;且定義 srv 實現流程與自定義 msg 實現流程類似&#xff0c;需查閱msg文件的可以瀏覽ROS話題通信流程自定義數據msg格式…

【服務器】在Linux查看運行的Python程序,并找到特定的Python程序

在Linux查看運行的Python程序并找到特定的Python程序 寫在最前面1. 使用ps命令查看所有Python進程查看詳細信息 2. 使用pgrep命令查找Python進程ID 3. 使用top或htop命令使用top命令使用htop命令 4. 使用lsof命令查找Python進程打開的文件 5. 使用nvidia-smi命令查看GPU使用情況…

JDBC編程的學習——MYsql版本

目錄 前言 什么是JDBC ??? 前置準備 使用JDBC的五個關鍵步驟 1.建立與數據庫的連接 2.創建具體的sql語句和Statement 3.執行SQL語句 4.處理結果集 5.釋放資源 完整流程展示 前言 筆者在先前的博客就提過會寫關于JDBC的內容 [Mysql] 的基礎知識和sql 語句.教你速成…

R包:reticulate R對python的接口包

介紹1 R和python是兩種不同的編程語言&#xff0c;前者是統計學家發明并且服務數學統計計算&#xff0c;后者則是最萬能的膠水語言。隨著大數據時代的到來&#xff0c;兩者在數據分析領域存在越來越多的共同點且可以相互使用&#xff0c;為了破解二者的編程壁壘&#xff0c;CR…

軟考《信息系統運行管理員》-3.1信息系統設施運維的管理體系

3.1信息系統設施運維的管理體系 1 信息系統設施運維的對象 基礎環境 主要包括信息系統運行環境(機房、設備間、配線室、基站、云計算中心 等)中的空調系統、供配電系統、通信應急設備系統、防護設備系統(如消防系統、安全系統) 等&#xff0c;能維持系統安全正常運轉&#xf…

【第26章】MyBatis-Plus之高級特性

文章目錄 前言一、數據審計&#xff08;對賬&#xff09;二、數據敏感詞過濾三、數據范圍&#xff08;數據權限&#xff09;四、表結構自動維護五、字段數據綁定&#xff08;字典回寫&#xff09;六、虛擬屬性綁定七、字段加密解密八、字段脫敏九、多數據源分庫分表&#xff08…

從零開始學習嵌入式----Linux系統命令集合與shell腳本

Shell是一門編程語言&#xff0c;作為學習shell的開始&#xff0c;需要事先搞明白&#xff1a;編程的目的是什么&#xff1f;什么是編程語言&#xff1f;什么是編程&#xff1f; shell本身就是一門解釋型、弱類型、動態語言&#xff0c;與python相對應&#xff0c;Python屬于解…

aardio —— 今日減bug

打字就減bug 鼠標雙擊也減bug 看看有多少bug夠你減的 使用方法&#xff1a; 1、將資源附件解壓縮&#xff0c;里面的文件夾&#xff0c;放到aardio\plugin\plugins 目錄 2、aardio 啟動插件 → 插件設置 → 選中“今日減bug” → 保存。 3、重啟 aardio&#xff0c;等aa…

旗晟智能巡檢機器人:開啟工業運維的智能化新篇章

在當今快速發展的工業領域&#xff0c;安全、效率和成本控制是企業運營的核心。旗晟科技以創新為驅動&#xff0c;推出了一站式的工業級智能巡檢機器人數字化全景運維解決方案&#xff0c;為石油、天然氣、化工、電力等高危行業提供了一個全新的運維模式。 一、面對挑戰&#x…

提升機器視覺與機器學習軟件安全性的實踐策略

在近幾年科技爆發中&#xff0c;機器學習&#xff08;ML&#xff09;和機器視覺&#xff08;MV&#xff09;的結合正在改變各行各業。機器學習通過數據驅動的算法讓計算機能夠自我學習&#xff0c;而機器視覺賦予計算機識別和理解圖像的能力。這種結合使得計算機可以高效地執行…

上位機開發關鍵技術

《上位機開發關鍵技術》 在現代工業自動化、智能化的發展進程中&#xff0c;上位機作為人機交互的重要接口&#xff0c;發揮著至關重要的作用。上位機能夠實現對下位機設備的監控、數據采集與處理、控制指令下達等功能&#xff0c;為生產過程的優化、設備的高效運行提供了有力支…

淺談化工廠環保管理的痛點、智慧環保的必要性及EHS系統的實現路徑

在全球環保意識日益增強的背景下&#xff0c;化工廠作為工業領域的重要組成部分&#xff0c;其環保管理顯得尤為重要。然而&#xff0c;化工廠在追求經濟效益的同時&#xff0c;也面臨著諸多環保管理的痛點。本文將圍繞化工廠環保管理的痛點、化工廠為何需要智慧環保以及如何借…

設計分享—國外后臺界面設計賞析

國外后臺界面設計將用戶體驗放在首位&#xff0c;通過直觀易懂的布局和高效的交互設計&#xff0c;提升用戶操作效率和滿意度。 設計不僅追求美觀大方&#xff0c;還注重功能的實用性和數據的有效展示&#xff0c;通過圖表和圖形化手段使數據更加直觀易懂。 采用響應式布局&a…

Global Mapper:地理信息的溫柔探索

引言 在這紛繁復雜的世界里&#xff0c;地理信息系統&#xff08;GIS&#xff09;如同一把利器&#xff0c;幫助我們剖析、理解和改造這個世界。而在眾多GIS軟件中&#xff0c;Global Mapper無疑是其中的佼佼者。作為一款功能全面且易于使用的GIS應用程序&#xff0c;Global M…

相機光學(三十一)——暗房設置的要求

ISO標準通常在測試相機時指定對周圍條件的要求。由于攝影ISO組試圖保持這些要求與所有標準一致&#xff0c;所以我們總結了這個“技術說明”中的重要方面。 ??溫度應保持在23C /- 2C的范圍內。在設計空調系統時&#xff0c;請記住圖表照明的耗電量和發熱量。濕度需要在&#…

數字安全護航技術能力全景圖 | 亞信安全實力占據75領域

近日&#xff0c;2024全球數字經濟大會——數字安全生態建設專題論壇在北京成功舉辦。會上&#xff0c;中國信息通信研究院&#xff08;簡稱“中國信通院”&#xff09;正式發布了《數字安全護航技術能力全景圖》&#xff0c;亞信安全憑借全面的產品技術能力&#xff0c;成功入…

【網絡安全】SSRF 之 Azure Digital Twins Explorer

未經許可&#xff0c;不得轉載。 文章目錄 正文 正文 Azure Digital Twins 是一個微軟下的平臺服務&#xff0c;允許開發者創建和運行數字孿生模型&#xff0c;這些模型能夠反映物理世界中的實體及其關系&#xff0c;通過這些模型可以進行監控、分析和預測等操作。 1、進入主…

How to Describe Figures in a Research Article

How to Describe Figures in a Research Article DateAuthorVersionNote2024.07.10Dog TaoV1.0Finish the document. 文章目錄 How to Describe Figures in a Research ArticleGeneral GuidelinesDetailed DescriptionsCommon Describing Phrases Effective communication of …