C++ --> 類和對象(一)

歡迎來到我的Blog,點擊關注哦💕

前言

前面講到了C++的入門需要學習的知識,是為了后面更好的學習。學習是不斷深入的,內容是不斷復雜的。篤定信心。

一、面向對象編程(OOP)和面向過程編程(POP)的認識

面向過程編程(Procedural Programming,簡稱POP)

POP特性

  • 程序的核心是函數,這些函數是一系列預定義操作的集合,旨在執行特定任務。
  • 這種方法讓程序員可以重用代碼,提高效率,并且使代碼更易于跟蹤和維護。
  • 通過將復雜問題拆解為更小、更具體的任務,面向過程編程使解決問題變得更加直接.

面前對象編程(Object Oriented Programming,簡稱OOP)

OOP特性

  • 封裝:是將對象的屬性和方法結合在一起,并盡可能隱藏對象的內部細節,只暴露必要的接口供外部使用。
  • 繼承:允許一個類(子類)繼承另一個類(父類)的屬性和方法,實現代碼的重用和層次化組織。
  • 多態:允許使用相同的接口來處理不同類型的對象,具有不同的實現,增加了代碼的靈活性和可擴展性.

二、類

類的定義:類是用戶自定義的數據類型,它允許將數據(成員變量)和操作數據的函數(成員函數)封裝在一起。

類的定義

class ClassName {
public:// 公共成員聲明
private:// 私有成員聲明
protected:// 受保護成員聲明
};

訪問限定修飾符

  • public(公有):公有成員可以在類的內部、派生類和類的外部訪問。它們構成了類的公共接口,通常用于定義可以被外部直接訪問和操作的方法和屬性。
  • protected(受保護):受保護的成員只能在類的內部和派生類中訪問,而不能在類的外部訪問。它們用于實現基類和派生類之間的共享實現細節。
  • private(私有):私有成員只能在類的內部訪問,外部無法直接訪問。私有成員用于隱藏類的內部實現細節,防止外部代碼直接訪問和修改類的狀態

類和結構區別

在C++ 中將 C語言中 struct升級成了類,在C++中strcut也可以聲明類。

  • 結構(struct)默認訪問類型是 public
  • 類的默認訪問類型是private

類的作用域

**類 **: 類的作用域是指類定義中聲明的成員變量和成員函數的可見范圍。類的作用域由類名和作用域解析運算符(::)共同控制。

類的實例化

類的實例化:指創建類的具體對象的過程。這個過程通常涉及到分配內存空間給新創建的對象,并設置其初始屬性值。

例如:

class Stack
{//類定義
};int main()
{Stack st;return 0;
}

對象的大小

對象的大小類似于C語言中的結構體大小的計算方法。

  • 第一個成員在與結構體偏移量為0的地址處。
  • 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。 注意:對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。 VS中默認的對齊數為8
  • 結構體總大小為:最大對齊數(所有變量類型最大者與默認對齊參數取最小)的整數倍。
  • 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整 體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍
class A1 {
public:void f1(){}
private:int _a;
};
// 類中僅有成員函數
class A2 {
public:void f2() {}
};
// 類中什么都沒有---空類
class A3
{};
  • sizeof(A1) = 4
  • sizeof(A2) = 1
  • sizeof(A3) = 1
C++標準規定空類必須具有非零大小的原因主要有以下幾點
  • 確保對象地址唯一性:C++標準要求不同的對象不能具有相同的地址。如果空類的大小為0,那么在數組中連續創建多個空類對象時,這些對象將沒有區分它們的內存空間,從而違反了這一原則.

  • 避免指針運算問題:如果空類的大小為0,那么使用指針進行算術運算時將無法正確計算偏移量,因為除以0是非法的操作。這將導致編譯器需要編寫額外的代碼來處理這些異常情況.

  • 內存分配和對齊:新對象的分配需要不同的內存地址,且內存分配通常考慮到對齊要求。一個非零大小的空類可以確保即使是最基本的對象也至少占據一個內存單元,滿足基本的內存對齊要求.

  • 優化空間利用:C++標準允許空基類優化,即如果空類作為基類時不會與同一類型的另一個對象或子對象分配在同一地址,編譯器可以選擇不為其分配任何空間。這意味著空類的非零大小實際上不會增加派生類的內存占用,除非派生類本身需要更多空間.

三、this指針

this指針是一個隱含的成員指針,它在類的非靜態成員函數中可用,指向調用該函數的對象實例。

  • this指針是一個常量指針,其指向的內容可以被修改,但指針本身不能被重新賦值。
  • this指針的類型是指向類類型的指針,即const ClassType*
  • this指針在成員函數的整個執行期間都存在,其生命周期與函數的其他參數相同。
  • this指針不是對象內存的一部分,因此不會影響對象的大小
class A
{
public:void Print(){cout << "Print()" << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}
class B
{ 
public:void PrintB() {cout<<_a<<endl;}
private:int _a;
};
int main()
{B* p = nullptr;p->PrintB();return 0;
}
  • A會正常運行, 因為p調用的公共代碼塊的,沒有進行成員訪問。
  • B段代碼進行了成員訪問,Print函數內部 this->_a。

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

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

相關文章

力扣-貪心算法4

406.根據身高重建隊列 406. 根據身高重建隊列 題目 假設有打亂順序的一群人站成一個隊列&#xff0c;數組 people 表示隊列中一些人的屬性&#xff08;不一定按順序&#xff09;。每個 people[i] [hi, ki] 表示第 i 個人的身高為 hi &#xff0c;前面 正好 有 ki 個身高大于或…

MyBatis的簡介與使用

Mybatis JDBC操作數據庫的缺點 存在大量的冗余代碼。手工創建 Connection、Statement 等&#xff0c;效率低下。手工將結果集封裝成實體對象。查詢效率低&#xff0c;沒有對數據訪問進行優化。 Mybatis框架 簡介 MyBatis 本是 apache 的一個開源項目 iBatis, 2010年這個項目由…

imx6ull/linux應用編程學習(14) MQTT基礎知識

什么是mqtt&#xff1f; 與HTTP 協議一樣&#xff0c; MQTT 協議也是應用層協議&#xff0c;工作在 TCP/IP 四層模型中的最上層&#xff08;應用層&#xff09;&#xff0c;構建于 TCP/IP協議上。 MQTT 最大優點在于&#xff0c;可以以極少的代碼和有限的帶寬&#xff0c;為連接…

網絡資源模板--Android Studio 外賣點餐App

目錄 一、項目演示 二、項目測試環境 三、項目詳情 四、完整的項目源碼 原創外賣點餐&#xff1a;基于Android studio 實現外賣(點)訂餐系統 非原創奶茶點餐&#xff1a;網絡資源模板--基于 Android Studio 實現的奶茶點餐App報告 一、項目演示 網絡資源模板--基于Android …

在AvaotaA1全志T527開發板上使用AvaotaOS 部署 Docker 服務

Docker 是一個開源的應用容器引擎&#xff0c;讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中&#xff0c;然后發布到任何流行的 Linux或Windows操作系統的機器上&#xff0c;也可以實現虛擬化。容器是完全使用沙箱機制&#xff0c;相互之間不會有任何接口。 準備…

dolphinscheduler-springboot集成

springboot集成dolphinscheduler 說明 為了避免對DolphinScheduler產生過度依賴&#xff0c;實踐中通常不會全面采用其內置的所有任務節點類型。相反&#xff0c;會選擇性地利用DolphinScheduler的HTTP任務節點功能&#xff0c;以此作為工作流執行管理的橋梁&#xff0c;對接…

信息技術課上的紀律秘訣:營造有序學習環境

信息技術課是學生們探索數字世界的樂園&#xff0c;但同時也是課堂紀律管理的挑戰場。電腦、網絡、游戲等元素可能分散學生的注意力&#xff0c;影響學習效果。本文將分享一些有效的策略&#xff0c;幫助教師在信息技術課上維持課堂紀律&#xff0c;確保教學活動順利進行。 制…

幾何建模基礎-樣條曲線和樣條曲面介紹

1.概念介紹 1.1 樣條曲線的來源 樣條的英語單詞spline來源于可變形的樣條工具&#xff0c;那是一種在造船和工程制圖時用來畫出光滑形狀的工具&#xff1a;富有彈性的均勻細木條/金屬條/有機玻璃條&#xff0c;它圍繞著按指定位置放置的重物或者壓鐵做彈性彎曲&#xff0c;以…

JS實現一個簡單的模糊匹配

1、示例數據如下&#xff1a; // 示例數據 const data [ { name: ‘Alice’, age: 25 }, { name: ‘Bob’, age: 30 }, { name: ‘Charlie’, age: 35 }, { name: ‘David’, age: 40 }, { name: ‘Eve’, age: 45 } ]; 2、模糊匹配函數 // 模糊匹配函數 function fuzzyMatch(…

基于LangChain的RAG開發教程(二)

v1.0官方文檔&#xff1a;https://python.langchain.com/v0.1/docs/get_started/introduction/ 最新文檔&#xff1a;https://python.langchain.com/v0.2/docs/introduction/ LangChain是一個能夠利用大語言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能…

植物大戰僵尸融合嫁接版 MAC 版本下載安裝詳細教程

繼植物大戰僵尸雜交版火了之后&#xff0c;PVZ改版可謂是百花齊放&#xff0c;最近又有一個非常好玩的模式被開發出來了&#xff0c;他們稱為《植物大戰僵尸融合嫁接版》 該版本并沒有對植物卡牌做改動&#xff0c;而是可以將任意兩種植物疊放到一起進行融合&#xff0c;產生新…

思路打開!騰訊造了10億個角色,驅動數據合成!7B模型效果打爆了

世界由形形色色的角色構成&#xff0c;每個角色都擁有獨特的知識、經驗、興趣、個性和職業&#xff0c;他們共同制造了豐富多元的知識與文化。 所謂術業有專攻&#xff0c;比如AI科學家專注于構建LLMs,醫務工作者們共建龐大的醫學知識庫&#xff0c;數學家們則偏愛數學公式與定…

lvgl 本地化

生成語言包文件&#xff1a; lv_i18n compile -t en-GB.yml -o ui 正則匹配中文 "[\u4e00-\u9fa5]" _("[\u4e00-\u9fa5]") https://www.cnblogs.com/jerryqi/p/9604828.html 查找多個漢字體的 ("[\u4e00-\u9fa5]"[)]) _($1) "科室:"…

數據分析與挖掘實戰案例-電商產品評論數據情感分析

數據分析與挖掘實戰案例-電商產品評論數據情感分析 文章目錄 數據分析與挖掘實戰案例-電商產品評論數據情感分析1. 背景與挖掘目標2. 分析方法與過程2.1 評論預處理1. 評論去重2. 數據清洗 2.2 評論分詞1. 分詞、詞性標注、去除停用詞2. 提取含名詞的評論3. 繪制詞云查看分詞效…

昇思25天學習打卡營第12天 | LLM原理和實踐:MindNLP ChatGLM-6B StreamChat

1. MindNLP ChatGLM-6B StreamChat 本案例基于MindNLP和ChatGLM-6B實現一個聊天應用。 ChatGLM-6B應該是國內第一個發布的可以在消費級顯卡上進行推理部署的國產開源大模型&#xff0c;2023年3月就發布了。我在23年6月份的時候就在自己的筆記本電腦上部署測試過&#xff0c;當…

UI自動化測試框架:PO 模式+數據驅動(超詳細)

1. PO 設計模式簡介 什么是 PO 模式&#xff1f; PO&#xff08;PageObject&#xff09;設計模式將某個頁面的所有元素對象定位和對元素對象的操作封裝成一個 Page 類&#xff0c;并以頁面為單位來寫測試用例&#xff0c;實現頁面對象和測試用例的分離。 PO 模式的設計思想與…

Python學習中進行條件判斷(if, else, elif)

條件判斷是編程中必不可少的一部分&#xff0c;它讓程序可以根據不同的條件執行不同的代碼塊。在Python中&#xff0c;主要使用if、elif和else語句來實現條件判斷。 基本語法 在Python中&#xff0c;條件判斷的基本語法如下&#xff1a; if condition:# 當condition為True時…

一篇讀懂128陷阱

128陷阱 128陷阱的概念包裝器類自動裝箱自動拆箱128陷阱 Intager源碼equals 128陷阱的概念 首先想要清楚什么是128陷阱&#xff0c;需要了解一些概念 包裝器類 包裝器類&#xff08;Wrapper classes&#xff09;是Java中的一組類&#xff0c;它們允許將基本數據類型&#xf…

NCCL 中的一些輔助debug 知識點

1&#xff0c;調試nccl 啟動kernel的方法 ncclLaunchKernel cuLaunchKernelEx ncclStrongStreamLaunchKernel cudaLaunchKernel ncclLaunchOneRank cudaLaunchKernel 在 nccl lib 中&#xff0c;不存在使用<<<grid, block,,>>> 這種類似方式啟…

算法題型歸類整理及同類題型解法思路總結(持續更新)

1、最優路線 通用思路 1、遞歸 #案例1-最優路測路線 題目描述 評估一個網絡的信號質量&#xff0c;其中一個做法是將網絡劃分為柵格&#xff0c;然后對每個柵格的信號質量計算。 路測的時候&#xff0c;希望選擇一條信號最好的路線&#xff08;彼此相連的柵格集合&#x…