C++初階——類和對象(一)

C++初階——類和對象(一)

一、面向過程和面向對象

1.面向過程

面向過程的程序設計(Procedure-Oriented Programming),簡稱POP,是一種是以程序執行流程為核心的編程范式。它是先分析出解決問題所需要的的步驟,然后用函數把這些步驟一步步地實現,在使用的時候依次調用就可以了。

2.面向對象

面向對象的程序設計(Object-Oriented Programming),簡稱OOP,關注的不再是完成一個任務的過程,而是完成這個任務涉及到的對象。比如,在點外賣這一過程中,就涉及到用戶,商家和騎手這幾個對象。專業一點來講,面向對象編程(OOP)以現實世界實體映射為核心,將問題域抽象為對象的集合,每個對象包含數據和方法(函數)的封裝體。其哲學源于亞里士多德的“實體-屬性”論,通過類(Class)定義對象的藍圖設計圖紙),實現“分類-實例化”的認知建模。
面向對象有三大特性:封裝、繼承、多態

(1)封裝
  • 數據和操作數據的方法(函數)進行有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來和對象進行交互。
  • C++實現封裝的方式:用類將對象的屬性與方法結合在一塊,讓對象更加完善,通過訪問權限選擇性的將其接口提供給外部的用戶使在類(class)中,通過訪問修飾符(private/public)控制數據暴露程度,提升隱私性和安全性。
  • 2024年波音787航電系統升級時,因多個函數共享navigation_state全局變量,導致姿態控制模塊與通信模塊數據沖突,引發短暫系統宕機;防止外部誤操作:通過private/public修飾符,限制數據的直接訪問,可以讓銀行賬戶的balance(余額)字段僅允許通過withdraw()方法修改;防御性編程:2024年特斯拉自動駕駛系統升級后,傳感器數據的封裝層攔截了12%的非法訪問請求,避免了系統崩潰。
  • 在C++初階的類和對象內容,我們主要就是圍繞封裝這一特性展開
(2)繼承
  • 繼承(Inheritance)是面向對象編程中實現代碼復用和層次抽象的核心機制,允許子類繼承父類的屬性和方法。這里不過多介紹,在C++進階的內容,我們會詳細講解。
(3)多態
  • 多態(Polymorphism)是面向對象編程中同一接口在不同上下文中表現不同行為的能力,其核心在于“一個接口,多種實現”。這也是非常重要的內容,同樣,在C++進階中,我們會詳細講解。

二、類的介紹

類定義了一個新的作用域,類的所有成員都在類的作用域中。通過class關鍵字將數據與操作(成員函數)綁定。在類體外定義成員時,需要使用 :: 域作用限定符指明成員屬于哪個類域,比如在類里面聲明一個成員函數,在類外面定義時,就要使用 ::
我們先來簡單的感受一下:

class Stack
{
public:// 成員函數void Init(int defaultCapacity = 4)//提供一個缺省參數,如果沒有傳參,就使用這里的值{a = (int*)malloc(sizeof(int) * capacity); //基本操作,檢查動態內存開辟是否成功if (nullptr == a){perror("malloc fail");return;}capacity = defaultCapacity;top = -1;}void Push(int x){//...a[++top] = x;}void Destroy(){free(a);a = nullptr;top = capacity;}	
private:// 成員變量int* a;int top;int capacity;
};
int main()
{return 0;
}

在這里,我們主要是熟悉一下類的使用,沒有詳細實現具體的內容,關于棧,在數據結構專欄中已經進行了詳細的講解。在一個類中,重要的是訪問限定符——publicprivate和protect,我們詳細介紹一下:

  • public修飾的成員在類外可以直接被訪問
  • protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)
  • 訪問權限作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時為止
  • 如果后面沒有訪問限定符,作用域就到 } 即類結束。
  • class的默認訪問權限為private,struct為public(因為struct要兼容C)
    如圖所示:
    示例1
    struct(結構體)在C語言中,里面是不可以定義函數的,但是在C++中,struct升級成了類,可以定義成員函數,但是struct里面的內容默認是公開的(public),外界可以隨意訪問,也是兼容了C語言結構體的性質,但class就不一樣了:
    示例2

    class默認是私有,需要加上public聲明才能被訪問,如圖:
    示例4
    示例5
    允許外界訪問的是函數func,至于成員變量a、b,則是不想公開的。
  • 在這里,我們也可以在類里面給出函數的聲明,在類的外面給出函數的定義:
    示例6
    這里需要指定函數Print是屬于A這個類域。
    我們來看下面一段代碼:
    示例7
    這里的year=year含義就不清楚了,到底是形參自己賦值給自己還是將形參賦值給成員變量?因此我們應當這樣寫:
    示例8

三、類的實例化

類定義僅僅是邏輯的藍圖,就像是一個房間的設計圖紙,并不能真正的住進去,因此,我們需要對類進行實例化才會創建出具體的對象,分配內存空間,簡而言之,用類創建對象的過程,稱為類的實例化。同一個類可以實例化出多個不同的對象,比如:在特斯拉工廠的Robot類實例化后,每個機器人擁有了獨立的關節狀態;銀行系統的Account類只有實例化后,才會綁定具體賬戶持有者。我們來舉個例子:

class Stack
{
public:// 成員函數void Init(int defaultCapacity = 4){a = (int*)malloc(sizeof(int) * defaultCapacity);if (nullptr == a){perror("malloc fail");return;}capacity = defaultCapacity;top = -1;}void Push(int x){a[++top] = x;}void Destroy(){free(a);a = nullptr;top = capacity;}
private:// 成員變量int* a;int top;int capacity;
};int main()
{Stack st1;st1.Init(20);st1.Init();st1.Push(1);st1.Push(2);st1.Push(3);st1.Push(4);st1.Destroy();return 0;
}

這里還是一個簡單的棧,首先,我們實例化了一個棧st1,現在st1不是一個圖紙,而是有具體內存空間的對象,我們可以對一個實例化出來的對象進行有實際意義的操作,比如初始化開空間(這里開的20,如果沒有提供開多少的參數,也沒關系,因為這里使用了缺省參數int defaultCapacity = 4),元素入棧,棧的銷毀等等,如果不進行實例化,是沒有任何意義的,比如:
示例9
示例10
直接對著圖紙插入數據,顯然是沒有任何意義的。
那么,我們剛才定義函數不是用了::嗎?
示例11
注意,這里是定義,其實還是在畫圖紙,并不是真正的使用。在類體外定義成員時,需要使用 :: 域作用限定符指明成員屬于哪個類域,比如在類里面聲明一個成員函數,在類外面定義時,就要使用 ::
還有一個問題,在鏈表中,我們特意強調了結構體是自定義類型,struct的使用是要帶上它的名字的,比如鏈表的結構體指針struct ListNode*就是一個典型的例子,在C++中還需要這樣嗎?
答案是:不需要!
因為C++已經將結構體struct升級成了類,這是語法規定:

struct Stack
{
public:// 成員函數void Init(int defaultCapacity = 4){a = (int*)malloc(sizeof(int) * defaultCapacity);if (nullptr == a){perror("malloc fail");return;}capacity = defaultCapacity;top = -1;}void Push(int x){a[++top] = x;}void Destroy(){free(a);a = nullptr;top = capacity;}
private:// 成員變量int* a;int top;int capacity;
};int main()
{Stack st1;st1.Init(5);st1.Init();st1.Push(1);st1.Push(2);st1.Push(3);st1.Push(4);st1.Destroy();return 0;
}

本期總結+下期預告

本期內容,我們正式進入C++初階的類和對象部分,這是C++中非常重要的內容,下期內容繼續為大家帶來相關的知識!

感謝大家的關注,我們下期再見!
在這里插入圖片描述

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

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

相關文章

Skyeye 云智能制造辦公系統 VUE 版本 v3.15.13 發布

Skyeye 云智能制造,采用 Springboot winUI 的低代碼平臺、移動端采用 UNI-APP。包含 30 多個應用模塊、50 多種電子流程,CRM、PM、ERP、MES、ADM、EHR、筆記、知識庫、項目、門店、商城、財務、多班次考勤、薪資、招聘、云售后、論壇、公告、問卷、報表…

Obsidian Copilot:打造你的專屬 AI 筆記助手

Obsidian Copilot作為一款非常受歡迎的Obsidian插件,不僅極大地提升了用戶的筆記管理和信息檢索效率,還通過其多樣化的AI功能為用戶帶來了前所未有的便捷體驗。本文將詳細介紹Obsidian Copilot的核心特點、使用方法及個人體驗分享。 核心特點 Obsidian…

每日一題--計算機網絡

一、基礎概念類問題 1. TCP 和 UDP 的區別是什么? 回答示例: TCP:面向連接、可靠傳輸(通過三次握手建立連接,丟包重傳)、保證數據順序(如文件傳輸、網頁訪問)。 UDP:無…

使用 Spring 的 FactoryBean 創建和獲取 Bean 對象

在Spring框架中,FactoryBean接口提供了一種強大的機制來創建復雜的bean實例。本文將基于提供的代碼示例,詳細介紹如何通過FactoryBean創建bean對象,并展示如何獲取這些bean實例以及它們所屬的FactoryBean實例。 示例代碼類 定義 MyBean 接口…

制造業數字化轉型,汽車裝備制造企業數字化轉型案例,智能制造數字化傳統制造業數字化制造業數字化轉型案例

《某制造業企業信息化整體解決方案》PPT展示了一個汽車裝備企業的整體信息化解決方案,闡述了該企業的業務特點和現狀,主要包括按訂單生產、多級計劃和產品跟蹤等,分析了信息化建設的主要困難,如信息管理手工化、過程數據追溯困難、…

軟鏈接 使用筆記 linux命令 if判斷

目錄 1>0判斷怎么寫: 1. 使用 [ ] 進行數值比較: 2. 使用 (( )) 進行數學運算: 3. 使用 [[ ]](主要用于字符串比較,不推薦用于數學運算): 軟鏈接 使用筆記 1>0判斷怎么寫&#xff1a…

pycharm-python國際象棋遊戲代碼

嗯,用戶的問題是“pycharm寫關於python國際象棋遊戲代碼”,也就是要用PyCharm來寫一個Python的國際象棋游戲代碼。我需要先整理一下用戶提供的搜索結果,看看有什么相關的信息可以利用。 首先看搜索結果中的各個網頁內容。網頁1主要講的是象棋…

【Film】MovieAgent:自動化電影生成通過多智能體CoT規劃

論文概覽 自動化電影生成根據劇本概要和角色庫創建具有一 致角色、同步字幕和音頻的長篇視頻。它涉及自動化敘 事規劃、場景結構化, 和鏡頭構圖,復制現實世界電影制作的層次推理。 核心貢獻 提出MovieAgent,通過多智能體鏈式思維(CoT)規劃實現自動化電影生成。首次探索并…

數據結構——最短路(BFS,Dijkstra,Floyd)

完整版可以看我的最短路問題模版總結_稠密圖最短路-CSDN博客 考研數據結構只考BFS,Dijkstra和Floyd 下面代碼以Acwing模板題為例 BFS代碼 適用類型&#xff1a; 1.單源最短路徑 2.無權圖 3.不適用于帶權圖和負權回路圖 //Acwing走迷宮bfs #include<bits/stdc.h>usi…

ftp替代品,如何提升數據交換的安全性與高效性?

文件傳輸協議&#xff08;FTP&#xff09;是一個跨平臺的、簡單且易于實現的協議&#xff0c;用于在網絡上的服務器和客戶端之間傳輸文件&#xff0c;也是企業會經常選擇的一種傳輸方式。 業務場景一&#xff1a; 基于信息相關安全要求&#xff0c;醫院會采用防火墻、網閘等將…

單片機開發資源分析的實戰——以STM32G431RBT6為例子的單片機資源分析

目錄 第一點&#xff1a;為什么叫STM32G431RBT6 從資源手冊拿到我們的對STM32G431RBT6的資源描述 第二件事情&#xff0c;關心我們的GPIO引腳輸出 第三件事情&#xff1a;去找對應外設的說明部分 第一點&#xff1a;為什么叫STM32G431RBT6 對于命名規則不太熟悉的朋友看這里…

Android PC 要來了?Android 16 Beta3 出現 Enable desktop experience features 選項

在之前的 《Android 桌面窗口新功能推進》 我們就聊過&#xff0c;Google 就一直在努力改進 Android 的內置桌面模式&#xff0c;例如添加了適當的窗口標題、捕捉窗口的能力、懸停選項、窗口大小調整、最小化支持、app-to-web 等。 比如在搭載 Android 15 QPR 1 Beta 2 的 Pix…

IP關聯是什么?怎么避免?

在跨境電商的道路上&#xff0c;大家好&#xff01;今天想和大家聊一聊一個非常重要的話題&#xff0c;那就是IP關聯的問題。在商業活動中&#xff0c;了解如何避免IP關聯對保護我們寶貴的商鋪至關重要。接下來&#xff0c;我們將深入探討IP關聯的概念、影響及如何有效防止這一…

行為模式---狀態模式

概念 狀態模式是一種行為模式&#xff0c;用于在內部狀態改變的時候改變其行為。它的核心思想就是允許一個對象在其內部狀態改變的時候改變它的行為。狀態模式通過將對象的狀態封裝成獨立的類&#xff0c;并將其行為委托給當前的狀態對象&#xff0c;從而使得對象行為隨著狀態…

目標檢測中衡量模型速度和精度的指標:FPS和mAP

“FPS”和“mAP”分別衡量了模型的速度和精度。 FPS&#xff08;Frames Per Second&#xff09; 定義&#xff1a;FPS是“每秒傳輸幀數”的縮寫&#xff0c;用于衡量計算機視覺系統&#xff08;如目標檢測、圖像識別等&#xff09;的實時性能。它表示系統每秒鐘能夠處理的圖像…

網頁復印機:只需一個網址,一鍵克隆任何網站!(可根據需求生成/優化相關代碼)

文章目錄 ?? 介紹 ???? 演示環境 ???? 網頁代碼克隆神器:一鍵復刻精美設計,提升前端開發效率 ????? 使用?? 相關鏈接 ???? 介紹 ?? 每天對著別人的精美網站漏出羨慕的眼神,卻苦于自己的前端技術不夠硬,難以完美復刻?或者為了趕項目進度,不得不重復…

go語言中數組、map和切片的異同

在Go語言中&#xff0c;數組、切片&#xff08;slice&#xff09;和映射&#xff08;map&#xff09;是三種常用的數據結構&#xff0c;它們在用途和特性上有顯著差異。以下是它們的異同總結&#xff1a; 相同點 集合類型&#xff1a;三者都用于存儲一組數據。 元素訪問&#…

前端Vue3圖像編輯功能(并生成mask圖)

存在一個需求同豆包的圖像生成的區域重繪功能,類似與下面這種 拆解一下需求, 1、鼠標移動上圖像畫面時出現跟隨鼠標移動的空心圓形,移出圖像畫面、鼠標點擊后、鼠標按下移動時消失,鼠標松開再次出現。 2、鼠標按下出現圓形透明顏色大小同空心圓形、鼠標按下移動形成軌跡,…

解決:ModuleNotFoundError: No module named ‘_sqlite3‘

報錯&#xff1a; from _sqlite3 import * ModuleNotFoundError: No module named _sqlite3安裝sqlite3支持組件: sudo apt-get install libsqlite3-dev進入之前下載的python包下&#xff0c;重新編譯和安裝Python ./configure --enable-loadable-sqlite-extensions make &a…

【Go語言圣經3.6】

目標 概念 常量與變量的主要區別在于&#xff1a; 不可變性&#xff1a;常量在聲明后其值就固定下來&#xff0c;不能再被修改。這保證了程序運行時不會因意外修改而導致錯誤。 使用不可變數據&#xff08;例如數學常數 π&#xff09;可以避免意外修改帶來的問題 編譯期計算…