C++之類和對象基礎

?向對象三?特性:封裝、繼承、多態

類和對象

  • 一.類的定義
    • 1. 類的定義格式
    • 2.類域
  • 二.實例化
    • 1.對象
    • 2.對象的大小
  • 三.this指針

在這里插入圖片描述

在 C++ 的世界里,類和對象構成了面向對象編程(Object-Oriented Programming,OOP)的核心框架,如同搭建高樓大廈的基石,支撐起復雜且靈活的程序結構。無論是開發游戲、設計大型軟件系統,還是進行底層驅動開發,類和對象的合理運用都能讓代碼更具邏輯性、可維護性和擴展性。

一.類的定義

類是一種用戶自定義的數據類型,它將數據(成員變量)和操作這些數據的函數(成員函數)封裝在一起,就像一張設計藍圖,定義了某一類事物的屬性和行為。

1. 類的定義格式

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

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

class 類名 {private:// 私有成員變量和函數,只能在類內部訪問數據類型 成員變量名;返回類型 私有成員函數(參數列表);public:// 公有成員變量和函數,可以在類外部訪問數據類型 成員變量名;返回類型 公有成員函數(參數列表);protected:// 保護成員變量和函數,可在類及其派生類中訪問數據類型 成員變量名;返回類型 保護成員函數(參數列表);
};

private、public和protected是訪問控制修飾符,用于限定成員的訪問權限。

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

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

  3. class定義成員沒有被訪問限定符修飾時默認為private,struct默認為public。

  4. ?般成員變量都會被限制為private/protected,需要給別?使?的成員函數會放為public。
    在類里定義的函數默認為inline格式,若在類外定義時,也可以通過認為加inline來實現內聯

2.類域

類域,簡單來說就是類所定義的范圍,類中的成員變量和成員函數都處于這個特定的范圍之內。在類域中定義的名字(成員變量名、成員函數名等),其作用范圍僅限于該類,與類外部的同名標識符相互獨立。
比如,在一個Student類中定義了name成員變量,而在類外部的其他地方也定義了name變量,這兩個name分別屬于不同的作用域,不會產生沖突。
在訪問類域中的成員時,需要遵循一定的規則。如果在類的成員函數內部訪問類的成員變量,無需特殊的前綴,直接使用變量名即可,因為成員函數本身就處于類域之中,編譯器能夠明確識別這是類內的成員。例如:

class Student {
private:string name;int age;
public:void setInfo(string n, int a) {name = n;  // 直接訪問類域內的成員變量nameage = a;}
};

但在類外部訪問類的成員時,就需要通過對象或對象指針,并結合點運算符.或箭頭運算符->來明確指定訪問類域中的成員。像這樣:

int main() {Student stu;stu.setInfo("Tom", 20);return 0;
}

類域的存在,一方面實現了數據和操作的封裝,將相關的成員變量和函數聚集在一起,增強了代碼的內聚性;另一方面,通過限制成員的作用范圍,避免了命名沖突,提高了代碼的可讀性和可維護性。同時,在繼承關系中,類域的規則也會影響派生類對基類成員的訪問和覆蓋,這進一步體現了類域在構建復雜類體系時的重要作用。

二.實例化

1.對象

對象是類的具體實例,就像依據設計藍圖建造出的實際建筑。每個對象都有自己獨立的存儲空間,存儲著類中定義的成員變量的值,并且可以調用類中定義的成員函數。

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

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

  3. ?個類可以實例化出多個對象,實例化出的對象占?實際的物理空間,存儲類成員變量。

2.對象的大小

在計算對象的大小時,內存分配規則基本與C語言結構體一致。
具體可以看此篇博客 : 結構體內存。
但類的內存分配有幾個特例:

  1. 類函數所占的內存,是不計算在類的內存大小當中的。由于每次調用類函數時,所調用的是同一個函數,因此沒有比要在每次實例化的過程中為函數分配一塊內存,而是分配在了棧區。
  2. 當類為空時,為表示類的存在,所以會默認給1字節大小的空間。

三.this指針

在 C++ 類的成員函數中,this指針是一個隱含的指針變量,它指向調用該成員函數的對象。this指針在類和對象的交互中起著至關重要的作用,幫助成員函數準確地訪問和操作所屬對象的成員變量。
編譯器編譯后,類的成員函數默認都會在形參第?個位置,增加?個當前類類型的指針,叫做this指針。

  1. this 指針的作用?
    當多個對象調用同一個成員函數時,this指針使得函數能夠區分到底是哪個對象在調用它。
  2. this 指針的使用場景
    除了在成員函數中訪問成員變量,this指針還常用于函數返回對象自身、解決參數與成員變量同名問題等場景。
  3. 類的成員函數中訪問成員變量,本質都是通過this指針訪問的。只不過在這里可以隱式使用,編譯器會自動處理。
    this指針不能夠出現在形參與實參的位置,但是可以在函數體內顯?使?this指針。他只能夠在類里使用

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

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

相關文章

計算機網絡——HTTP/IP 協議通俗入門詳解

HTTP/IP 協議通俗入門詳解 一、什么是 HTTP 協議?1. 基本定義2. HTTP 是怎么工作的? 二、HTTP 協議的特點三、HTTPS 是什么?它和 HTTP 有啥區別?1. HTTPS 概述2. HTTP vs HTTPS 四、HTTP 的通信過程步驟詳解: 五、常見…

使用 Java 實現一個簡單且高效的任務調度框架

目錄 一、任務調度系統概述 (一)任務調度的目標 (二)任務調度框架的關鍵組成 二、任務狀態設計 (一)任務狀態流轉設計 (二)任務表設計(SQL) 三、單機任…

基于GPT 模板開發智能寫作輔助應用

目錄 項目說明 1. 項目背景 2. 項目目標 3. 功能需求 4. 技術選型 項目結構 詳細代碼實現 前端代碼(client) client/src/main.js client/src/App.vue client/src/components/HistoryList.vue 后端代碼(server) server/app.js server/routes/api.js server/mo…

linux 使用nginx部署next.js項目,并使用pm2守護進程

前言 本文基于:操作系統 CentOS Stream 8 使用工具:Xshell8、Xftp8 服務器基礎環境: node - 請查看 linux安裝node并全局可用pm2 - 請查看 linux安裝pm2并全局可用nginx - 請查看 linux 使用nginx部署vue、react項目 所需服務器基礎環境&…

使用huggingface_hub需要注意的事項

在安裝huggingface_hub的時候要注意如果你的python是放在c盤下時記得用管理員模式命令行來安裝huggingface_hub,否則安裝過程會報錯,之后也不會有huggingface-cli命令。 如果安裝時因為沒有用管理員權限安裝而報錯了,可以先卸載huggingface-…

Spring MVC @RequestHeader 注解怎么用?

我們來詳細解釋一下 Spring MVC 中的 RequestHeader 注解。 RequestHeader 注解的作用 RequestHeader 注解用于將 HTTP 請求中的**請求頭(Request Headers)**的值綁定到 Controller 方法的參數上。 請求頭是 HTTP 請求的一部分,包含了關于…

Rust 學習筆記:關于結構體的例題

Rust 學習筆記:關于結構體的例題 Rust 學習筆記:關于結構體的例題下面的程序能通過編譯嗎?下面的程序能通過編譯嗎?下面的程序能通過編譯嗎?哪種說法最能描述 Display 和 Debug 特質之間的區別?下面哪個選項…

STM32 SPI通信協議

1. SPI協議概述 1.1 什么是SPI? SPI(Serial Peripheral Interface)是由摩托羅拉公司于1980年代提出的同步串行通信協議,主要用于短距離高速芯片間通信。作為四線制全雙工通信協議,它以簡單的硬件實現和高效的傳輸速率…

92.一個簡單的輸入與顯示示例 Maui例子 C#例子

一、關于項目命名的注意事項 在開發.NET MAUI項目時,項目命名是一個不可忽視的細節。如果你習慣了在C#控制臺或WPF項目中使用中文項目名稱,那么在.NET MAUI中,你可能會遇到一些問題。我之前就因為使用中文項目名稱而導致項目無法直接運行&am…

Locate 3D:Meta出品自監督學習3D定位方法

標題: Locate 3D: Real-World Object Localization via Self-Supervised Learning in 3D 摘要: 我們提出了 Locate 3D,這是一種可根據指代表達(如“沙發和燈之間的小咖啡桌”)在三維場景中定位物體的模型。Locate 3…

FastAPI 與數據庫交互示例

目錄 安裝必要的包完整代碼示例運行應用使用說明API 端點說明代碼解析 下面將創建一個簡單的 FastAPI 應用程序,演示如何與 SQLite 數據庫進行交互。這個例子包括創建、讀取、更新和刪除(CRUD)操作。 安裝必要的包 首先,需要安裝…

YOLO旋轉目標檢測之ONNX模型推理

YOLO旋轉檢測相較于目標檢測而言,其只是最后的輸出層網絡發生了改變,一個最明顯的區別便是:目標檢測的檢測框是xywh,而旋轉檢測則為xywha,其中,這個a代表angle,即旋轉角度,其余的基本…

架構進階:深入學習企業總體架構規劃(Oracle 戰略專家培訓課件)【附全文閱讀】

本文主要討論了企業總體技術架構規劃的重要性與實施建議。針對Oracle戰略專家培訓課件中的內容,文章強調了行業面臨的挑戰及現狀分析、總體技術架構探討、SOA集成解決方案討論與問題解答等方面。文章指出,為了消除信息孤島、強化應用系統,需要…

llamafactory-cli webui啟動報錯TypeError: argument of type ‘bool‘ is not iterable

一、問題 在阿里云NoteBook上啟動llamafactory-cli webui報錯TypeError: argument of type ‘bool’ is not iterable This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run gradio deploy from the terminal in the working directory t…

Gas 優化不足、升級機制缺陷問題

以下是針對智能合約中 Gas 優化不足 與 升級機制缺陷 的技術風險分析與解決方案: 一、Gas 優化不足 1. 核心問題 Gas 優化不足會導致合約執行成本過高,直接影響用戶體驗和協議可行性,尤其在交易高峰期可能引發鏈上擁堵或交易失敗。 2. 常見風險點 冗余計算與存儲操作 例如…

使用xlwings計算合并單元格的求和

有如下一個excel表 表內有合并單元格,現在需要求和,不能直接下拉填充公式怎么辦? 通常的辦法是先取消合并單元格,計算后,再次合并單元格,比較繁瑣。 在此,嘗試使用python和xlwings運行直接給出…

[創業之路-354]:農業文明到智能紀元:四次工業革命下的人類遷徙與價值重構

農業文明到智能紀元:四次工業革命下的人類遷徙與價值重構 從游牧到定居,從蒸汽轟鳴到算法洪流,人類文明的每一次跨越都伴隨著生產關系的劇烈震蕩。四次工業革命的浪潮不僅重塑了物質世界的生產方式,更將人類推向了身份認同與存在…

LeetCode 2302.統計得分小于 K 的子數組數目:滑動窗口(不需要前綴和)

【LetMeFly】2302.統計得分小于 K 的子數組數目:滑動窗口(不需要前綴和) 力扣題目鏈接:https://leetcode.cn/problems/count-subarrays-with-score-less-than-k/ 一個數組的 分數 定義為數組之和 乘以 數組的長度。 比方說&…

kafka學習筆記(四、生產者(客戶端)深入研究(二)——消費者協調器與_consumer_offsets剖析)

1.消費者協調器和組協調器 如果消費者客戶端中配置了多個分配策略,則多消費者的分區分配交由消費者協調器和組協調器來完成,他們之間使用一套組協調協議進行交互。 1.1.在均衡原理 將全部消費者分成多個子集,每個消費者組的子集在服務中對…

快速將FastAPI接口轉為模型上下文協議(MCP)!

fastapi_mcp 是一個用于將 FastAPI 端點暴露為模型上下文協議(Model Context Protocol, MCP)工具的庫,并且支持認證功能。 環境macbook,python3.13 pip install fastapi uvicorn fastapi-mcp 代碼 from fastapi import FastAPI, …