C++中的類和對象(上)

1 類的定義

1.1 類定義的格式

1 class為定義類的關鍵字,Stack為類的名字,{}中為類的主體,注意類定義結束時后面分號不能省 略》。類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量; 類中的函數稱為類的方法或者成員函數
2 為了區分成員變量,?般習慣上成員變量會加一個特殊標識,如成員變量前面或者后面加_ 或者m開頭,注意C++中這個并不是強制的,只是?些慣例,具體看公司的要求。
3 C++中struct也可以定義類,C++兼容C中struct的用法,同時struct升級成了類,明顯的變化是struct中可以定義函數,一般情況下我們還是推薦用class定義類。
4 定義在類里面的成員函數默認為inline

?有了類我們就可以在實現棧等數據結構時就不需要加上“ST"這種前綴

1.2 訪問限定符

1 類是C++中?種實現封裝的方式,用類將對象的屬性與方法結合在?塊,讓對象更加完善,通過訪問權限選擇性的將其接口提供給外部的用戶使用。
2 public修飾的成員在類外可以直接被訪問;protected和private修飾的成員在類外不能直接被訪問
3 訪問權限作用域從該訪問限定符出現的位置開始直到下?個訪問限定符出現時為止,如果后面沒有訪問限定符,作用域就到 }即類結束。
4 class定義成員沒有被訪問限定符修飾時默認為private,struct默認為public
5 一般成員變量都會被限制為private/protected,需要給別人使用的成員函數會放為public。

?1.3 類域

1 類定義了?個新的作用域,類的所有成員都在類的作用域中,在類體外定義成員時,需要使用?::?作用域操作符指明成員屬于哪個類域。?
2 類域影響的是編譯的查找規則,下面程序中Init如果不指定類域Stack,那么編譯器就把Init當成全局函數,那么編譯時,找不到array等成員的聲明/定義在哪里,就會報錯。指定類域Stack,就是知道Init是成員函數,當前域找不到的array等成員,就會到類域中去查找。
#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;
}
int main()
{
Stack st;
st.Init();
return 0;
}

?其中size_t是無符號整數類型


2 實例化

2.1 實例化的概念

1 用類類型在物理內存中創建對象的過程,稱為類實例化出對象。
2 類是對對象進行?種抽象描述,是?個模型?樣的東西,限定了類有哪些成員變量,這些成員變量只是聲明,沒有分配空間,用類實例化出對象時,才會分配空間。
3 一個類可以實例化出多個對象,實例化出的對象 占用實際的物理空間,存儲類成員變量。打個比方:類實例化出對象就像現實中使用建筑設計圖建造出房子,類就像是設計圖,設計圖規劃了有多 少個房間,房間大小功能等,但是并沒有實體的建筑存在,也不能住人,用設計圖修建出房?,房 子才能住人。同樣類就像設計圖?樣,不能存儲數據,實例化出的對象分配物理內存存儲數據。

2.2 對象的大小?

分析?下類對象中哪些成員,類實例化出的每個對象,都有獨立的數據空間,所以對象中肯定包含成員變量
那么成員函數是否包含呢?首先函數被編譯后是?段指令,對象中沒辦法存儲,這些指令存儲在?個單獨的區域(代碼段),那么對象中非要存儲的話,只能是成員函數的指針。
那么對象中是否有存儲指針的必要呢,Date實例化d1和d2兩個對象,d1和d2都有各自獨立的成員變量存儲各自的數據,但是d1和d2的成員函數指針是一樣的,存儲在對象中就浪費了。如果用Date實例化100個對象,那么成員函數指針就重復存儲100次,太浪費了。所以函數指針是不需要存儲的。
函數指針是一個地址(第一行指令的地址),調用函數被編譯成匯編指令[call 地址], 其實編譯器在編譯鏈接時,就要找到函數的地址,不是在運行時找,只有動態多態是在運行時找,就需要存儲函數地址
上面我們分析了對象中只存儲成員變量,C++規定類實例化的對象也要符合內存對齊的規則。

綜上所述,計算一個對象的大小不需要加上成員函數的大小,同時也要遵循內存對齊的原則(高效訪問)來計算?

內存對齊的原則

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

示例如下?

#include<iostream>
using namespace std;
// 計算?下A/B/C實例化的對象是多??
class A
{
public:
void Print()
{
cout << _ch << endl;
}
private:
char _ch;
int _i;
};
class B
{
public:
void Print()
{
//...
}
};
class C
{};
int main()
{
A a;
B b;
C c;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
cout << sizeof(c) << endl;
return 0;
}

?輸出的結果因該為8? ? ? ? 1? ? ? ? 1,在A中_ch,變量和_i變量經過內存對齊,大小為8,B和C看似是0,但其實會留小大小為1的空間占位表示成員函數的存在

3 this指針

1 Date類中有 Init 與 Print 兩個成員函數,函數體中沒有關于不同對象的區分,那當d1調?Init和Print函數時,該函數是如何知道應該訪問的是d1對象還是d2對象呢?那么這里就要看到C++給了一個隱含的this指針解決這里的問題
2 編譯器編譯后,類的成員函數默認都會在形參第?個位置,增加?個當前類類型的指針,叫做this 指針。比如Date類的Init的真實原型為, void Init(Date* const this, int year, int month, int day)
3 類的成員函數中訪問成員變量,本質都是通過this指針訪問的,如Init函數中給_year賦值, this->_year = year;
4 C++規定不能在實參和形參的位置顯示的寫this指針(編譯時編譯器會處理),但是可以在函數體內顯示使用this指針。

? ? ??

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

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

相關文章

【Tauri2】013——前端Window Event與創建Window

前言 【Tauri2】012——on_window_event函數-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001.2014.3001.5501 前面介紹了on_window_event&#xff0c;這個在Builder中的方法&#xff0c;里面有許多事件&#xff0c;比如Moved&#xff0c;Res…

【問題處理】webpack4升webpack5,報錯Uncaught ReferrnceError: process is not defined

問題 正在做webpack4升webpack5&#xff0c;項目構建項目成功后在瀏覽器打開時報錯 Uncaught ReferrnceError: process is not defined。 原因 webpack 5 不再自動 polyfill Node.js 的核心模塊。 如果你在瀏覽器運行的代碼中使用它&#xff0c;需要從 NPM 中安裝兼容模塊…

軟件工程師減肥計劃

一、目標設定 在 3 個月內減輕體重 5-7kg&#xff0c;改善身體代謝水平和體脂率&#xff0c;增強身體活力和精神狀態&#xff0c;以更好地適應工作強度。 二、飲食調整 &#xff08;一&#xff09;基本原則 控制熱量攝入&#xff0c;保證每天攝入熱量低于消耗熱量 500-800 …

即時訪問成為降低風險的關鍵

云計算和軟件即服務 (SaaS) 解決方案的廣泛采用從根本上重塑了企業的數字格局。 不同行業的組織越來越多地利用云固有的可擴展性和成本效益來推動創新和簡化運營。 這種向基于云的環境的轉變也帶來了一系列新的復雜安全挑戰&#xff0c;需要仔細考慮并制定強有力的緩解策略。…

[環境配置] 1. 開發環境搭建

開發環境搭建 本文檔將詳細介紹如何搭建深度學習開發環境&#xff0c;包括 Python 環境配置、IDE 選擇與配置以及虛擬環境管理。 也會介紹一下最近比較流行的 uv 工具。它是一個用 Rust 編寫的極其快速的 Python 包和項目管理工具。 uv 是一個非常強大的工具&#xff0c;它可…

rust 同時處理多個異步任務,并在一個任務完成退出

use std::thread; use tokio::{sync::mpsc,time::{sleep, Duration}, };async fn check_for_one() {// 該函數會每秒打印一次 "write"loop {println!("write");sleep(Duration::from_secs(1)).await;} }async fn start_print_task() -> Result<(), (…

“群芳爭艷”:CoreData 4 種方法計算最大值的效率比較(上)

概覽 在 CoreData 支持的 App 中&#xff0c;一種常見操作就是計算數據庫表中指定字段的最大值&#xff08;或最小值&#xff09;。就是這樣一種看起來“不足掛齒”的任務&#xff0c;可能稍不留神就會“馬失前蹄”。 在實際的代碼中&#xff0c;我們怎樣才能既迅速又簡潔的…

skynet網絡包庫(lua-netpack.c)的作用解析

目錄 網絡包庫&#xff08;lua-netpack.c&#xff09;的作用解析1. 數據包的分片與重組2. 網絡事件處理3. 內存管理4. 數據打包與解包 動態庫&#xff08;.so&#xff09;在 Lua 中的使用1. 編譯為動態庫2. Lua 中加載與調用(1) 加載模塊(2) 核心方法(3) 使用示例 3. 注意事項 …

計科數據庫第二次上機操作--實驗二 表的簡單查詢

一、建數據庫和表 1&#xff0e;啟動數據庫服務軟件 Navicat 2&#xff0e;在 Navicat 中建立數據庫 test 3. 在test數據庫上建立teacher表&#xff1a; 二、基本查詢 2.1 從teacher表中分別檢索出教師的所有信息 SELECT * FROM teacher WHERE 教工號2000; SELECT * FROM t…

WPF依賴注入

一、IOC 在 WPF 中的原理 控制反轉&#xff08;IOC&#xff09;是一種設計原則&#xff0c;它將對象的創建和依賴關系的管理從對象本身轉移到外部容器&#xff08;IOC 容器&#xff09;。在傳統的編程方式中&#xff0c;一個對象如果需要使用另一個對象&#xff08;即存在依賴…

【大模型深度學習】如何估算大模型需要的顯存

一、模型參數量 參數量的單位 參數量指的是模型中所有權重和偏置的數量總和。在大模型中&#xff0c;參數量的單位通常以“百萬”&#xff08;M&#xff09;或“億”&#xff08;B&#xff0c;也常說十億&#xff09;來表示。 百萬&#xff08;M&#xff09;&#xff1a;表示…

BUUCTF流量分析題

文章目錄 前言wireshark被嗅探的流量被偷走的文件easycap數據包中的線索秘密文件[安洵杯 2019]Attack (難&#xff0c;沒寫)被劫持的神秘禮物大流量分析&#xff08;一&#xff09;大流量分析&#xff08;二&#xff09;大流量分析&#xff08;三&#xff09;模板模板 前言 CT…

adb檢測不到原來的設備List of devices attached解決辦法

進設備管理器-通用串行總線設備 卸載無法檢測到的設備驅動 重新拔插數據線

mapbox基礎,加載柵格圖片到地圖

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??raster 柵格圖層 api二、??使用本地載…

復活之我會二分

文章目錄 整數二分模板模板1&#xff1a;滿足條件的第一個數模板2&#xff1a;滿足條件的最后一個數 浮點數二分模板一、Building an Aquarium思路分析具體代碼 二、Tracking Segments思路分析具體代碼 三、Wooden Toy Festival思路分析具體代碼 四、路標設置思路分析具體代碼 …

每日c/c++題 備戰藍橋杯(握手問題)

試題 A: 握手問題 題解 題目描述 小藍組織了一場算法交流會議&#xff0c;共有50人參加。按照慣例&#xff0c;每個人都要與除自己外的其他所有人握手一次。但有7個人彼此之間沒有握手&#xff08;這7人與其他43人正常握手&#xff09;。求實際發生的握手總次數。 解題思路 …

mysql8.0.29 win64下載

mysql win64安裝包 mysql win64安裝包下載 mysql win64安裝包下載 通過網盤分享的文件&#xff1a;mysql 鏈接: https://pan.baidu.com/s/1sEOl-wSVtOG5gfIRdt5MXw?pwdgi7i 提取碼: gi7i

browser-use開源程序使 AI 代理可以訪問網站,自動完成特定的指定任務,告訴您的計算機該做什么,它就會完成它。

一、軟件介紹 文末提供程序和源碼下載 browser-use開源程序使 AI 代理可以訪問網站&#xff0c;自動完成特定的指定任務&#xff0c;瀏覽器使用是將AI代理與瀏覽器連接的最簡單方法。告訴您的計算機該做什么&#xff0c;它就會完成它。 二、快速開始 使用 pip &#xff08;Py…

CAD格式轉換器:Acme CAD Converter

Acme CAD Converter 是一款專業的多功能 CAD 文件管理工具&#xff0c;支持 ?DWG/DXF/DWF 文件查看、批量格式轉換及版本降級?&#xff0c;適用于工程設計、圖紙歸檔等場景?。軟件兼容 AutoCAD R2.5 至 2023 版本文件?&#xff0c;可輸出為 PDF、JPEG、TIFF、SVG 等 20 格式…

vmware虛擬機上Ubuntu或者其他系統無法聯網的解決方法

一、檢查虛擬機是否開啟了網絡服務 打開方式&#xff1a;控制面板->-管理工具--->服務 查找 VMware DHCP Service 和VMware NAT Service &#xff0c;確保這兩個服務已經啟動。如下圖&#xff0c;沒有啟動就點擊啟動。 二、設置網絡類型 我們一般使用前兩種多一些&…