C++初階篇----類與對象上卷

目錄

  • 引言
  • 1.面向過程和面向對象初步認識
  • 2.類的引入
  • 3.類的定義
    • 3.1聲明與定義全部放在類體中
    • 3.2聲明與定義分離
  • 4.類的訪問限定符及封裝
    • 4.1訪問限定符
    • 4.2封裝
  • 5.類的作用域
  • 6.類的實例化
    • 類是對對象進行描述
    • 一個類(一個類型變量)可以實例化出多個對象
  • 7.類對象模型
    • 7.1類對象的大小
    • 7.2類對象的存儲方式
    • 7.3結構體內存對齊規則
  • 8.`this` 指針
    • 8.1 this指針的引出
    • 8.2 this指針的特性
  • 總結:

引言

在面向對象編程(OOP)中,類(Class)和**對象(Object)**是兩個核心概念。
簡單來說,**類定義了對象的模板,而對象是根據類創建的具體實體**。例如,假設有一個類叫做Car,描述了汽車的屬性(如顏色、品牌、型號)和行為(如加速、減速、轉向)。那么根據這個類,我們可以創建多個具體的汽車對象,每個對象都有自己的屬性和行為,但都基于相同的類模板。

在面向對象編程中,程序主要由對象組成,每個對象都是一個實例,具有特定的屬性(成員變量)和行為(成員函數)。類則用來定義對象的模板,描述了一類對象共同的屬性和行為。

1.面向過程和面向對象初步認識

面向對象編程(OOP)是一種以對象為中心的編程范式,它將數據和操作數據的方法封裝在對象中,使得對象可以通過方法與其他對象進行交互。在面向對象編程中,程序的設計和實現是圍繞著對象的概念展開的,強調對象之間的交互和繼承關系,以及多態性的特性。

面向過程編程(POP)是一種以過程為中心的編程范式,它將問題分解為一系列的步驟或過程,然后按照順序執行這些步驟來解決問題。在面向過程編程中,數據和操作數據的方法是分開的,程序的設計和實現是圍繞著函數或過程的概念展開的,強調按照步驟執行任務。

C語言是面向過程的,關注的是過程,分析求解問題
而C++是基于面向對象的,關注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成

2.類的引入

相較于C語言,結構體中只能定義變量,而在C++中,結構體內不僅可以定義變量,還可以定義函數并在內部嵌套調用
如,C語言棧的實現

#include<iostream>using namespace std;
typedef int DataType;
struct Stack
{//初始化函數void Init(size_t capacity=5){_array = (int*)malloc(sizeof(int) * capacity);_capacity = capacity;_size = 0;}void Push(const DataType& data){_array[_size] = data;_size++;}DataType Top(){return _array[_size - 1];}void Destory(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}//成員變量DataType* _array;size_t _capacity;size_t _size;
};int main()
{Stack s;s.Init();s.Push(1);s.Push(3);s.Push(2);cout << s.Top() << endl;s.Destory();return 0;
}

在這里插入圖片描述
而在C++中,結構體的定義,更習慣用 class 關鍵字來替代

3.類的定義

class name
{//成員函數//成員變量};

class 為定義類的關鍵字,name為類的名字
類的定義方式有倆種

3.1聲明與定義全部放在類體中

若成員函數在類中定義,那么編譯器可能會當作 內聯函數來處理
在這里插入圖片描述

3.2聲明與定義分離

類聲明放
在這里插入圖片描述

4.類的訪問限定符及封裝

4.1訪問限定符

C++實現封裝的方式:類與對象的屬性與方法結合在一起,設置訪問權限的選擇性將其接口提供外部使用
在這里插入圖片描述

  1. public修飾的成員在類外可以直接被訪問
  2. protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)
  3. 訪問權限作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時為止
  4. 如果后面沒有訪問限定符,作用域就到 } 即類結束。
  5. class的默認訪問權限為private,struct為public(因為struct要兼容C)

4.2封裝

在面向對象的三大特性中(封裝、繼承、多態),主要研究類的封裝特性,在類和對象階段
封裝:將數據和操作數據的方法進行有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來
和對象進行交互。
封裝本質上是一種管理,讓用戶更方便使用類。

5.類的作用域

在C中,結構體的定義等價于一個變量的定義,而在C++中類的定義形成了一個新的作用域

C中有全局和局部,static靜態
而C++中則形成了一個新的作用域,就好比之前,一塊土地有公工區域(公共管理),和非公共區域(無人管理),然后類的定義,開始出現,私人住宅(別人允許你訪問,那么便可以做客參觀)

在類體外定義成員時,需要標識符 ::作用域操作符指明

void name::fun() 
{//…………
}

6.類的實例化

用類類型創建對象的過程,稱為類的實例化

類是對對象進行描述

定義一個類,并沒有分配實際的內存空間來存儲它

注:類當中的成員函數也沒有空間? 類成員函數在定義后,就有了固定的存放位置,當創建類的實例化,并不會重復開辟成員函數的空間

一個類(一個類型變量)可以實例化出多個對象

多個類,分別占用實際的物理空間,儲存類成員變量
類比,實例化出對象就像在現實中使用建筑設計圖建造出房子,類就是設計圖,房子就是實例化
在這里插入圖片描述

7.類對象模型

7.1類對象的大小

類對象的大小取決于其成員變量成員函數

1.成員變量的大小:類中的每個成員變量都占用內存空間。基本數據類型(如int、float等)通常占用固定大小的內存空間,而對象、指針或其他用戶自定義類型的大小取決于其內部包含的成員變量。
2.對齊規則:在內存中,數據通常按照特定的對齊規則存儲,以提高訪問速度。對齊規則可以導致成員變量之間存在一些額外的空隙,以保證每個成員變量從正確的內存地址開始。對齊規則通常由編譯器和目標平臺決定。
3.繼承和虛函數:如果類繼承自其他類,或者包含虛函數,那么額外的內存空間可能會用于存儲指向虛函數表的指針(對于包含虛函數的類)或基類的成員變量(對于派生類)。

如:

//前面所創建的Stack的類與Stack1比較
class Stack1
{int x;int y;int z;
};int main()
{cout << sizeof(Stack) << endl<<sizeof(Stack1)<<endl;
}

在這里插入圖片描述

7.2類對象的存儲方式

類對象包含類的各個成員
在這里插入圖片描述
每個對象中成員變量是不同的,但是調用同一份函數,如果按照此種方式存儲,當一個類創建多個對象時,每個對象中都會保存一份代碼,相同代碼保存多次,浪費空間。

代碼只保存一份,在對象中保存成員函數的地址
只保存成員變量,成員函數存放在公共的代碼段

結論:一個類的大小,實際就是該類中”成員變量”之和,當然要注意內存對齊
注意空類的大小,空類比較特殊,編譯器給了空類一個字節來唯一標識這個類的對象

7.3結構體內存對齊規則

對齊規則和C語言中的結構體對齊規則是一樣

  1. 第一個成員在與結構體偏移量為0的地址處。
  2. 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。 注意:對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。 VS中默認的對齊數為8
  3. 結構體總大小為:最大對齊數(所有變量類型最大者與默認對齊參數取最小)的整數倍。
  4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整 體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。

8.this 指針

8.1 this指針的引出

問題:當倆個同類型的類實例化,調用同一個成員函數,編譯器是怎么分辨出,是哪一個面向對象調用函數?

如:

//引用之前所定義的Stack 的類
int main()
{Stack d1;Stack d2;d1.Init();d2.Init();//~~~~return 0;
}
這里調用Init初始化,怎么分辨出是d1,還是d2調用?
這就是this指針的作用了> 在C++中,this指針是一個特殊的指針,它指向當前對象的地址。它是每個非靜態成員函數的隱式參數。當你在一個**成員函數內部引用類的成員變量或者調用其他成員函數**時,編譯器會自動地插入this指針。

實現的底層邏輯:
C++編譯器給每個“非靜態的成員函數“增加了一個隱藏的指針參數,讓該指針指向當前對象(函數運行時調用該函數的對象),在函數體中所有“成員變量”的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成。

8.2 this指針的特性

  1. this指針的類型:類類型* const,即成員函數中,不能給this指針賦值。
  2. 只能在“成員函數”的內部使用
  3. this指針本質上是“成員函數”的形參,當對象調用成員函數時,將對象地址作為實參傳遞給
    this形參。所以對象中不存儲this指針。
  4. this指針是“成員函數”第一個隱含的指針形參,一般情況由編譯器通過ecx寄存器自動傳
    遞,不需要用戶傳遞

在這里插入圖片描述

總結:

C++中通過類可以將數據 以及 操作數據的方法進行完美結合,通過訪問權限可以控制那些方法在類外可以被調用,即封裝,在使用時就像使用自己的成員一樣,更符合人類對一件事物的認知。

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

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

相關文章

Day12-【Java SE進階】JDK8新特性:Lambda表達式、方法引用、常見算法、正則表達式、異常

一、JDK8新特性 1.Lambda表達式 Lambda表達式是JDK 8開始新增的一種語法形式;作用:用于簡化名內部類的代碼寫法。 注意:Lambda表達式并不是說能簡化全部匿名內部類的寫法&#xff0c;只能簡化函數式接口的匿名內部類。 有且僅有一個抽象方法的接口。注意:將來我們見到的大部…

分布式事務簡介

分布式事務簡介&#xff0c;通過組內分享學習到的知識&#xff0c;并進行討論。 主要內容 分布式事務簡介 分布式事務是指跨越多個數據庫或服務的一系列操作&#xff0c;這些數據庫或服務可能分布在網絡的不同節點上&#xff0c;它們共同組成一個完整的邏輯工作單元&#xf…

GEE必須會教程—蒸散發數據時間序列分析與下載

今天帶來的有關蒸散發數據的下載代碼&#xff0c;蒸散發數據在氣象氣候&#xff0c;農業干旱監測等領域應用廣泛&#xff0c;那么在GEE上如何方便快捷獲取蒸散發數據呢&#xff1f;今天跟著小編分享代碼&#xff0c;快來學習吧&#xff01;&#xff01; A.定義研究區域 //定義…

JSON-RPC 快速開始

文章目錄 JSON-RPC什么是JSON-RPCJSON-RPC java開源實現JSON-PRC go開源實現JSON-RPC 和 Restful 都屬于什么&#xff1f;RPC、JSON-RPC和HTTP區別 以太坊使用json-rpc&#xff1f;JSON-RPC和gRPCWEB開發中&#xff0c;使用JSON-RPC好&#xff0c;還是RESTful API好&#xff1f…

【前端素材】推薦優質數據統計后臺管理系統網頁Cleopatra.平臺模板(附源碼)

一、需求分析 在線后臺管理系統是指供管理員或運營人員使用的Web應用程序&#xff0c;用于管理和監控網站、應用程序或系統的運行和數據。它通常包括一系列工具和功能&#xff0c;用于管理用戶、內容、權限、數據等。下面是關于在線后臺管理系統的詳細分析&#xff1a; 1、功…

ssh簡介以及 windows 安裝ssh教程

SSH&#xff08;Secure Shell&#xff09;是一種網絡協議&#xff0c;用于計算機之間的加密登錄和其他安全網絡服務。通過 SSH&#xff0c;用戶可以安全地訪問遠程計算機&#xff0c;執行命令、傳輸文件等操作。SSH 使用公鑰加密技術&#xff0c;確保數據傳輸的安全性。本文將從…

TypeScript 哲學 - 2、Narrowing

四種類型守衛 1、truthiness narrowing 2、 3、 4、 control flow analysis

C語言:結構體(自定義類型)知識點(包括結構體內存對齊的熱門知識點)

和黛玉學編程呀&#xff0c;大家一起努力呀............. 結構體類型的聲明 回顧一下 struct tag { member-list; }variable-list; 創建和初始化 我們知道&#xff0c;在C語言中&#xff0c;對于一些數據是必須初始化的&#xff0c;但是結構體怎么創建并且初始化呢&#xff1…

【計算機網絡】TCP 如何實現可靠傳輸

TCP通過三次握手建立連接&#xff0c;四次揮手釋放連接&#xff0c;確保連接建立和連接釋放的可靠。 序列號、檢驗和、確認應答信號、重發機制、連接管理、窗口控制、流量控制、擁塞控制 標準回答 可靠傳輸就是通過TCP連接傳送的數據是沒有差錯、不會丟失、不重復并且按序到達的…

springboot+vue+mysql項目使用的常用注解

實體類常用注解 Data Data 是一個 Lombok 提供的注解&#xff0c;使用 Data 注解可以簡化代碼&#xff0c;使代碼更加簡潔易讀。 作用&#xff1a;自動為類生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依賴 <depende…

rk3568-一種基于wifi的網絡環境搭建方案

前言&#xff1a; PC--Ubuntu--開發板 三者之間的網絡互相ping通很重要&#xff0c;尤其是ubuntu和開發板互ping成功最關鍵&#xff0c;關系到nfs&#xff0c;tftp等常用的開發手段。現在大多數開發板都帶有wifi芯片&#xff0c;現在提供一種方案可以三個設備無線地搭建網絡環境…

Open3D0.14.1編譯、安裝、demo使用教程

寫在前面 本文內容 Open3D在0.15版之前&#xff0c;沒有提供編譯好的包&#xff0c;要使用C版本必須自己編譯&#xff0c;本文是Open3D0.14.1在Windows下和Linux(Ubuntu1804)下的編譯、使用教程&#xff1b; Open3D其他版本的編譯和使用相關教程見 各個版本的Open3D、PCL的編譯…

STL常見容器(map/multimap容器)---C++

STL常見容器目錄&#xff1a; 8.map/ multimap容器8.1 map基本概念8.2 map構造和賦值8.3 map大小和交換8.4 map插入和刪除8.5 map查找和統計8.6 map容器排序8.6.1 內置類型排序8.6.2 自定義類型排序8.6.3 自定義和內置類型混合排序 8.map/ multimap容器 兩者基本一致&#xff…

用node寫后端環境運行時報錯Port 3000 is already in use

解決方法:關閉之前運行的3000端口,操作如下 1.WindowR輸入cmd確定,打開命令面板 2.查看本機端口詳情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,這里要看你自己項目中package.joson的啟動命令是什…

Flink:動態表 / 時態表 / 版本表 / 普通表 概念區別澄清

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

Python+PySide6實現一個選擇文件并做處理的GUI辦公小工具(完整代碼)

目錄 專欄導讀背景安裝注意事項完整代碼結尾專欄導讀 ?? 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手 ?????? 博客主頁:請點擊——> 一晌小貪歡的博客主頁求關注 ?? 該系列文章專欄:請點擊——>Python辦公自動化專欄求訂閱 ?? 此外還…

天翼云登錄參數JavaSrcipt逆向

天翼云登錄參數 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目標網站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目標參數 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四個參數 …

安卓使用ExoPlayer出現膨脹類異常

1.導包 implementation com.google.android.exoplayer:exoplayer-core:2.15.1implementation com.google.android.exoplayer:exoplayer-ui:2.15.1 2.在Androidifest.xml加入權限&#xff0c;我這里加了忘了與讀寫權限 <uses-permission android:name"android.permissio…

【Fastadmin/ThinkPHP5】使用Queue隊列方法詳細步驟

在現代應用開發中&#xff0c;合理利用隊列系統能夠有效提升系統的性能和響應速度&#xff0c;尤其是在處理耗時較長的任務時&#xff0c;如發送大量郵件、執行定時任務等。下面是如何在ThinkPHP框架中設置和使用隊列功能的詳細指南&#xff1a; 1.配置隊列服務 在applicatio…

Tomcat服務部署、優化

一 Tomcat的基本介紹 Tomcat概念 Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試 JSP 程序的首選。 當在一臺機器上配置好Apache 服務器…