[C++] 輕熟類和對象

Kevin的技術博客.png

類的定義

格式規范

  • class為定義類的關鍵字,后有類名,類的主體存于{}中;
  • 類定義結束時后面的分號不能省略;
  • 類體的內容成為類的成員,類中的變量成為成員變量,函數成為方法或成員函數;
  • C++兼容C語言的struct用法,同時將struct升級成了類的用法(更推薦類)
  • 在類定義中直接定義一個成員函數(即在類聲明的花括號{}內直接給出函數體),編譯器會默認將這個成員函數視為inline。這樣做的好處是,如果成員函數非常簡單,編譯器可以優化代碼,通過內聯展開來提高程序的執行效率。

舉例代碼:

class Stack
{
public:// 成員函數void Init(int n = 4){array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申請空間失敗");return;}capacity = n;top = 0;private:// 成員變量int* array;size_t capacity;size_t top;
}; // 分號不能省略

訪問限定符

封裝的概念

封裝是OOP的一個基本原則,它指的是將數據(屬性)和操作這些數據的代碼(方法)組合在一起,形成一個單元。封裝的主要目的是隱藏內部實現的細節,只暴露出一個可以被外界訪問和操作的接口。

  1. 數據封裝:類定義了屬性(也稱為成員變量或字段),這些屬性代表了對象的狀態。封裝確保了這些屬性只能通過類提供的方法來訪問和修改,從而保護數據不被外部代碼直接訪問,避免數據被不當操作。
  2. 方法封裝:類還定義了方法(也稱為成員函數或行為),這些方法定義了可以對對象執行的操作。封裝確保了對象的行為是通過這些方法來實現的,而不是直接操作對象的內部狀態。

訪問限定符

image.png

  1. 隱藏實現細節:通過使用private訪問限定符,類的實現細節被隱藏起來,外部代碼不能直接訪問或修改對象的內部狀態,只能通過public方法來操作。
  2. 提供接口:public方法提供了一個接口,允許外部代碼以受控的方式與對象交互。這些方法可以包含對private成員的訪問和修改,但這些操作的細節對外部是不可見的。
  3. 繼承和多態性:protected訪問限定符允許子類訪問和修改父類的某些成員,這在實現繼承和多態性時非常有用。子類可以擴展或修改父類的行為,同時保持對外部代碼的封裝。
  4. 維護數據完整性:通過限制對屬性的直接訪問,封裝確保了數據的完整性和一致性。
  5. 促進模塊化:封裝使得代碼更加模塊化,每個類負責管理自己的數據和行為,減少了不同模塊之間的耦合。(高內聚、低耦合)

類域

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

在類外定義成員函數:

#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;}

實例化

概念

類是一個藍圖或模板,它定義了一組屬性(成員變量)和方法(成員函數),這些屬性和方法共同描述了一類事物的特征和行為。而通過創建對象就可以將對象進行實例化,這一一種一對多的關系,一個類可以創造多個對象,每一個類都是一個個體實例,并不沖突。

// 如何實例化對象// 定義一個日期類
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_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, 3, 31);d1.Print();d2.Init(2024, 7, 5);d2.Print();return 0;
}

對象??

對象中只存儲成員變量,每個成員函數在對象調用的時候用的都是同一個指針來訪問。對于對象的大小,要符合內存對齊的規則,關于內存對齊的詳細運用理解可以點擊藍字閱讀我的另一篇博客,具體的規則大概如下:
? 第?個成員在與結構體偏移量為0的地址處。
? 其他成員變量要對?到某個數字(對?數)的整數倍的地址處。
? 注意:對?數 = 編譯器默認的?個對?數 與 該成員??的較?值。
? VS中默認的對?數為8
? 結構體總??為:最?對?數(所有變量類型最?者與默認對?參數取最?)的整數倍。
? 如果嵌套了結構體的情況,嵌套的結構體對?到??的最?對?數的整數倍處,結構體的整體?? 就是所有最?對?數(含嵌套結構體的對?數)的整數倍。
?不要忘記內存對齊的目的:為了減少CPU訪問內存次數,提高效率。

this指針

編譯器編譯后,類的成員函數默認都會在形參第?個位置,增加?個當前類類型的指針,叫做this指針。?如Date類的Init的真實原型為, void Init(Date* const this, int year, int month, int day),但是C++規定不能在實參和形參位置上寫this指針,但是可以在函數體內顯式使用this指針

  • 類的成員函數中訪問成員變量,本質都是通過this指針訪問的,如Init函數中給_year賦值, this->_year = year;。所以通過this指針可以對于一個對象的維護更加便捷。
// 顯式使用this指針
void Init(int year, int month, int day)
{_year = year;this->_month = month;this->_day = day;
}

存儲位置

關于this指針在內存上的存儲位置:當成員函數被調用時,this 指針通常存儲在調用棧上。調用棧是用于存儲函數調用時的局部變量和狀態信息的內存區域。


image.png

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

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

相關文章

微軟 Edge 瀏覽器全解析

微軟 Edge 是微軟推出的一個現代化瀏覽器,繼承了 Internet Explorer(IE)的部分功能,但在速度、安全性和兼容性方面做出了很大改進。下面是對微軟 Edge 瀏覽器的詳細解析,包括其特點、安裝、配置和常見問題的解答。 微軟 Edge 瀏覽器的特點 基于 Chromium 內核 Edge 瀏覽…

SpringBoot配置flyway

背景 目前我們的項目代碼都會交由Git、SVN等版本管理工具進行管理&#xff0c;但是我們的sql腳本&#xff0c;尤其是各類ddl腳本并沒有進行版本的管理&#xff08;python的web框架Django默認就提供了類似的工具&#xff0c;從一開始就鼓勵開發者通過版本管理的方式進行數據庫的…

C++中的多重繼承和虛繼承:橫向繼承、縱向繼承和聯合繼承;虛繼承

多重繼承 A.橫向多重繼承&#xff1a; B.縱向多重繼承&#xff1a; C.聯合多重繼承&#xff1a; 因為 single 和 waiter 都繼承了一個 worker 組件&#xff0c;因此 SingingWaiter 將包含兩個 worker 組件&#xff0c;那么將派生類對象的地址賦給基類指針將出現二義性 那么如何…

idea http client插件上傳文件,并忽略https證書驗證

上傳文件 ### 傳臨時素材 圖片 POST https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token{{access_token}}&typeimage Content-Type: multipart/form-data; boundary----WebKitFormBoundarywKUX3Xj6aL5Wssnb------WebKitFormBoundarywKUX3Xj6aL5Wssnb Conten…

從Helm到 Operator:Kubernetes應用管理的進化

&#x1f9f0;Helm 的作用 在開始前需要先對 kubernetes Operator 有個簡單的認識。 以為我們在編寫部署一些簡單 Deployment 的時候只需要自己編寫一個 yaml 文件然后 kubectl apply 即可。 apiVersion: apps/v1 kind: Deployment metadata: labels: app: k8s-combat …

去水印小程序源碼修復版-前端后端內置接口+第三方接口

去水印小程序源碼&#xff0c;前端后端&#xff0c;內置接口第三方接口&#xff0c; 修復數據庫賬號密碼錯誤問題&#xff0c;內置接口支持替換第三方接口&#xff0c; 文件挺全的&#xff0c;可以添加流量主代碼&#xff0c;搭建需要準備一臺服務器&#xff0c;備案域名和http…

農牧行業CRM洞察:打造營、銷、服一體化數字營銷平臺

01、行業應用背景 保持企業活力&#xff0c;支撐業務單元協調發展&#xff0c;穩定核心產品競爭力&#xff0c;將成為農牧行業企業數字化、數智化建設的指導方向。 積極發揮數據在生產、流通、消費各個環節的決策支撐&#xff0c;為農牧企業特別是多業態集團型企業&#xff0…

JVM:類的生命周期

文章目錄 一、介紹二、加載階段三、連接階段1、驗證階段2、準備階段3、解析階段 四、初始化階段 一、介紹 類的生命周期描述了一個類加載、連接&#xff08;驗證、準備和解析&#xff09;、初始化、使用、卸載的整個過程。 二、加載階段 加載&#xff08;Loading&#xff09…

全棧業務開發入門——登錄業務接口

業務已上傳則資源 實現登錄業務的前后端聯調&#xff0c;前端點擊登錄按鈕向后端發送一個請求&#xff0c;后端調用接口向前端響應結果 效果如下&#xff1a; 設計環境&#xff1a;springbootmybatisvue3axios 一.前端設計 1.基于vue3腳手架創建項目&#xff0c;搭建項目結構…

LAZYNVIM學習使用筆記

文章目錄 1. 前言VIM的模式快捷鍵參考 1. 前言 習慣使用vscode進行代碼編輯&#xff0c;無意中刷到lazynvim&#xff0c;感覺功能強大&#xff0c;于是下載、安裝&#xff0c;學習使用一下&#xff0c;本篇主要記錄學習使用lazynvim的一些要點&#xff0c;防止遺忘。 持續更新…

帝特(DTECH)USB轉RS485/422串口線在Ubuntu系統中的安裝

因為測試需要&#xff0c;買了一根帝特&#xff08;DTECH&#xff09;USB轉RS485/422串口線&#xff0c;今天測試了一下在Ubuntu 22.04系統上的使用。帝特的網站上提供了驅動程序&#xff0c;下載以后發現接口芯片是CP2102&#xff0c;廠商只提供了Linux內核2.6和3.x版本的驅動…

1703:發現它,抓住它

網址如下&#xff1a; OpenJudge - 1703:發現它&#xff0c;抓住它 測&#xff0c;這題差點讓我去世 用了一堆方法來做 后面現學了并查集&#xff0c;用了并查集來做&#xff0c;因為縮短路徑的方法不好&#xff0c;還是超時了 后面換了一種縮短路徑的方法 先上代碼 解法一…

游戲AI的創造思路-技術基礎-情感計算(2)

上一篇我們介紹了情感計算的基本支持&#xff0c;本篇將呈現情感計算在游戲AI中的使用實例~~~ 目錄 7. 情感計算在游戲AI中的運用實例 7.1. RPG游戲中的運用實例 7.1.1. 實例背景 7.1.2. AI情感計算系統 7.1.3. 引導用戶執行任務 7.1.4. 推動游戲劇情發展 7.1.5. 實例效…

用Python玩轉Excel的五大功能!

在日常的數據處理工作中&#xff0c;Excel無疑是一個強大的工具。然而&#xff0c;當數據量較大或需要自動化處理時&#xff0c;Python憑借其強大的庫支持&#xff0c;如pandas和openpyxl&#xff0c;能夠更高效地處理Excel文件。 本文將介紹Python中常用的五種Excel操作**&am…

一個用于在虛擬桌面下跑chrome的docker鏡像

制作了一個用于跑chrome的docker鏡像xvfb-chrome&#xff0c;主要是為了支持能夠通過xvfb或者wayland&#xff0c;給chrome提供一個虛擬的桌面環境。 這個鏡像主要支持&#xff1a; 將chrome --remote-debugging-port映射到docker的host&#xff0c;可以在host直接訪問。支持…

Python辦公自動化:增值稅發票批量識別和核驗

騰訊云免費體驗地址: https://console.cloud.tencent.com/api/explorer?Product=ocr&Version=2018-11-19&Action=VatInvoiceVerifyNew 首先進行識別,這里以python為例子 # -*- coding: utf-8 -*- import jsonfrom tencentcloud.common.common_client import Commo…

【C++航海王:追尋羅杰的編程之路】關聯式容器的底層結構——紅黑樹

目錄 1 -> 紅黑樹 1.1 -> 紅黑樹的概念 1.2 -> 紅黑樹的性質 1.3 -> 紅黑樹節點的定義 1.4 -> 紅黑樹的結構 1.5 -> 紅黑樹的插入操作 1.6 -> 紅黑樹的驗證 1.8 -> 紅黑樹與AVL樹的比較 2 -> 紅黑樹模擬實現STL中的map與set 2.1 -> 紅…

如何理解李彥宏說的“不要卷模型,要卷應用?

背景&#xff1a; 7月4日&#xff0c;2024世界人工智能大會暨人工智能全球治理高級別會議全體會議在上海世博中心舉辦。在產業發展主論壇上&#xff0c;百度創始人、董事長兼首席執行官李彥宏呼吁&#xff1a;“大家不要卷模型&#xff0c;要卷應用&#xff01;”李彥宏認為&am…

【堆 優先隊列】1354. 多次求和構造目標數組

本文涉及知識點 堆 優先隊列 LeetCode1354. 多次求和構造目標數組 給你一個整數數組 target 。一開始&#xff0c;你有一個數組 A &#xff0c;它的所有元素均為 1 &#xff0c;你可以執行以下操作&#xff1a; 令 x 為你數組里所有元素的和 選擇滿足 0 < i < target.…

idea在選定范圍搜索

idea在選定范圍搜索 CtrlR 在IntelliJ IDEA中&#xff0c;?如果你想在選定的范圍內搜索關鍵字&#xff0c;?可以按照以下步驟操作&#xff1a;? 首先&#xff0c;?使用鼠標選中你要搜索關鍵字的一個范圍。? 然后&#xff0c;?使用快捷鍵CtrlR&#xff08;?替換元素&am…