C++類和對象(上篇)

文章目錄

  • 前言
  • 一、面向過程和面向對象初步認識
  • 二、類的引入
  • 三、類的定義
  • 六、類的實例化
  • 七、類的對象大小的計算
  • 八、類成員函數的this指針
  • 總結


前言

類和對象是面向對象編程的兩個核心概念。

類是一種抽象的數據類型,是描述對象共同特征和行為的模板。一個類包括屬性和方法。屬性是類的數據成員,描述對象的特征;方法是類的成員函數,描述對象的行為。類定義了對象的結構和行為。

對象是類的實例化,是具體的實體。一個對象具有類中定義的屬性和方法。可以通過創建對象來使用類中定義的屬性和方法。

通常,類是創建對象的藍圖,對象是類的實例,類描述了對象的屬性和行為。類可以看作是一種抽象的概念,而對象是具體的實例。通過類可以創建多個對象,每個對象都具有相同的屬性和方法,但其具體的屬性值可能不同。


一、面向過程和面向對象初步認識

C語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。

C++ 基于面向對象 的, 關注 的是 對象 ,將一件事情拆分成不同的對象,靠對象之間的交互完 成。

二、類的引入

C 語言結構體中只能定義變量,在 C++ 中,結構體內不僅可以定義變量,也可以定義函數。 比如: 之前在數據結構初階中,用C 語言方式實現的棧,結構體中只能定義變量 ;現在以 C++ 方式實現, 會發現 struct 中也可以定義函數

三、類的定義

1.類定義格式

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

2.訪問標識符

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

3.類域?

類定義了?個新的作用域,類的所有成員都在類的作用域中,在類體外定義成員時,需要使用?:: 作用域操作符指明成員屬于哪個類域。
? 類域影響的是編譯的查找規則,下面程序中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;
}

四、類的實例化

1.概念

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

2.對象大小

class A
{public:void PrintA(){cout<<_a<<endl;}private:char _a;
};
結論:一個類的大小,實際就是該類中 成員變量 之和,當然要注意內存對齊
注意空類的大小,空類比較特殊,編譯器給了空類一個字節來唯一標識這個類的對象

3結構體內存對齊規則

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

五、類成員函數的this指針

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


總結

類和對象是面向對象編程中重要的概念。

類是指對具有相同特征和行為的對象進行分類描述的模板或藍圖。它定義了一類對象的共同屬性和方法。類可以看作是一種數據類型,用于創建對象。

對象是類的實例,是具體存在的實體。一個對象具有類定義的屬性和方法,并且可以獨立地執行這些方法。對象是根據類定義創建的,類定義了對象的屬性和方法,而對象則是類的實例。

類和對象之間的關系是類是對象的抽象,而對象是類的具體實例。一個類可以實例化多個對象,每個對象都具有相同的屬性和方法。

類和對象在面向對象編程中具有重要的意義。通過使用類和對象,可以將程序分解為多個相互獨立的模塊,每個模塊負責一部分功能。這種模塊化的設計可以提高代碼的可重用性、可維護性和可擴展性。同時,類和對象還能夠隱藏內部實現細節,使得代碼更加安全和簡潔。

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

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

相關文章

yolov5:Conv類參數量計算

Conv是yolov5自定義的類&#xff0c;里邊包含了卷積層、BN層和激活函數 class Conv(nn.Module):# Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)default_act nn.SiLU() # default activationdef __init__(self, c…

點云下采樣有損壓縮

轉自本人博客&#xff1a;點云下采樣有損壓縮 點云下采樣是通過一定規則對原點云數據進行再采樣&#xff0c;減少點云個數&#xff0c;降低點云稀疏程度&#xff0c;減小點云數據大小。 1. 體素下采樣&#xff08;Voxel Down Sample&#xff09; std::shared_ptr<PointClo…

華為機考真題 -- 信道分配

題目描述&#xff1a; 算法工程師小明面對著這樣一個問題&#xff0c;需要將通信用的信道分配給盡量多的用戶&#xff0c; 信道的條件及分配規則如下&#xff1a; 1) 所有信道都有屬性&#xff1a;”階”。階為 r 的信道容量為 2^r 比特&#xff1b; 2) 所有用戶需要傳輸的數…

區間貪心

目錄 1.貪心算法的思想 2.區間貪心算法常用的一些題目類型 1.選擇最多不相交區間問題 P2970 [USACO09DEC] Selfish Grazing S 1.思路分析 2.上代碼 2.區間選點問題 P1250 種樹 1.題目 2.方法一 1.代碼解釋 3.方法二 3.區間合并問題 P2434 [SDOI2005] 區間 1. 思路…

中科海訊 C++初級研發工程師筆試題目

C語言中的const關鍵字有什么作用&#xff1f;為什么要使用const關鍵字&#xff1f; 1 const修飾的變量將會被放到常量區&#xff0c;避免被意外的改動。 const修飾的常量比#define修飾的有更多的優勢&#xff0c;比如可以調試&#xff0c;類型檢查等 2 const修飾的參數可做輸入…

Java集合面試題

Java集合框架 1、List、Set、Map的區別2、ArrayList、LinkedList、Vector區別3、為什么數組索引從0開始&#xff0c;而不是從1開始&#xff1f;4、ArrayList底層的實現原理5、紅黑樹、散列表6、HashMap的底層原理7、HashMap的put方法具體流程8、HashMap的擴容機制9、HashMap是怎…

南方科技大學馬永勝教授給年輕人使用AI工具上的建議

摘要 - 1. AI的未來&#xff0c;是機器人和機器人之間的合作&#xff1b; 2. 行業的發展方向是需求決定的&#xff0c;不要做同質化的發展&#xff0c;要做專/精/特/新&#xff1b; 3. 新質生產力 &#xff08; 科學技術革命性突破 生產要素創新型配置 產業深度轉型升級&…

java通過poi-tl導出word實戰詳細步驟

文章目錄 與其他模版引擎對比1.引入maven依賴包2.新建Word文檔exportWprd.docx模版3.編寫導出word接口代碼4.導出成果 poi-tl是一個基于Apache POI的Word模板引擎&#xff0c;也是一個免費開源的Java類庫&#xff0c;你可以非常方便的加入到你的項目中&#xff0c;并且擁有著讓…

貪心算法-以高校教材管理系統為例

1.貪心算法介紹 1.算法思路 貪心算法的基本思路是從問題的某一個初始解出發一步一步地進行&#xff0c;根據某個優化測度&#xff0c;每一 步都要確保能獲得局部最優解。每一步只考慮一 個數據&#xff0c;其選取應該滿足局部優化的條件。若下 一個數據和部分最優解連在一起…

Pix4Dmapper:無人機測繪的革命性工具

在現代測繪和地理信息系統&#xff08;GIS&#xff09;領域&#xff0c;Pix4Dmapper無疑是一款革命性的工具。作為一名長期使用這款軟件的用戶&#xff0c;我深深感受到它在工作中的重要性和便利性。Pix4Dmapper不僅僅是一款軟件&#xff0c;更是測繪工作者的得力助手&#xff…

285個地級市出口產品質量及技術復雜度(2011-2021年)

出口產品質量與技術復雜度&#xff1a;衡量國家競爭力的關鍵指標 出口產品質量是衡量國內企業生產的產品在國際市場上競爭力的重要標準。它不僅要求產品符合國際標準和目標市場的法律法規&#xff0c;而且需要保證產品質量的穩定性和可靠性。而出口技術復雜度則進一步體現了一…

新一代信息技術及應用

關于云計算的描述不正確的是&#xff08; &#xff09;。 A 云計算可以通過網絡連接&#xff0c;用戶通過網絡接入“云”中并獲得有關的服務&#xff0c;“云”內節點之間也通過內部的網絡相連 B 云計算可以快速、按需、彈性服務&#xff0c;用戶可以按照實際需求迅速獲取或釋放…

[Python學習篇] Python面向對象——類

面向對象是什么&#xff1f; 面向對象&#xff08;Object-Oriented Programming&#xff0c;簡稱OOP&#xff09;是一種編程范式&#xff0c;它使用“對象”來設計應用程序和計算機程序。OOP的核心概念包括類&#xff08;Class&#xff09;、對象&#xff08;Object&#xff09…

批量下載手機中APP程序中文件

需求 利用 adb pull 下載手機中app的某目錄 adb pull 命令本身不支持直接下載整個目錄&#xff08;文件夾&#xff09;及其所有子目錄和文件作為一個單一的操作。但是&#xff0c;可以通過一些方法來間接實現這一目的。 方法 1. 首先將要下載的目錄進行 tar 打包 # 在 And…

Python面試題:Python 中的 `property` 函數有什么用?

在 Python 中&#xff0c;property 函數用于創建和管理類中的屬性。它允許你將方法轉換為屬性&#xff0c;這樣你可以像訪問變量一樣訪問這些方法。這對于控制屬性的訪問和修改非常有用&#xff0c;因為它允許你在屬性訪問時執行額外的邏輯&#xff08;如驗證或計算&#xff09…

光通信領域常見的會議和期刊總結

在高速光通信小組待了一年&#xff0c;對我們領域主要的會議和期刊也有了一定的了解&#xff0c;所以總結一下我們可以投的期刊或會議有哪些。會議一般有OFC、ECOC、CLEO、OECC、ACP等&#xff0c;期刊則有OE、OL、PTL、JLT、PJ、AO、JOSA等&#xff0c;下面簡單介紹一下。 先…

【atcoder】習題——位元枚舉

題意&#xff1a;求i&M的popcount的和&#xff0c;i屬于0……N 主要思路還是變加為乘。 舉個例子N22&#xff0c;即10110 假設M的第3位是1&#xff0c;分析N中&#xff1a; 00110 00111 00100 00101 發現其實等價于 0010 0011 0000 0001 也就是左邊第4位和第5…

算法學習筆記(8.1)-動態規劃入門

目錄 問題特性&#xff1a; 最優子結構&#xff1a; 代碼示例&#xff1a;&#xff08;動態規劃最優子結構&#xff09; 上述最小代價爬樓梯的運行過程&#xff1a; 代碼示例&#xff1a; 無后效性&#xff1a; 解析&#xff1a; 具體過程圖示如下&#xff1a; 具體的…

如何為IP申請SSL證書

目錄 以下是如何輕松為IP地址申請SSL證書的詳細步驟&#xff1a; 申請IP證書的基本條件&#xff1a; 申請IP SSL證書的方式&#xff1a; 確保網絡通信安全的核心要素之一&#xff0c;是有效利用SSL證書來加密數據傳輸&#xff0c;特別是對于那些直接通過IP地址訪問的資源。I…

使用 Azure DevOps Pipelines 生成 .NET Core WebJob 控制臺應用 CI/CD

Web 應用程序通常需要作為后臺任務運行的進程&#xff0c;并在特定時間間隔進行計劃或在事件中觸發。它們不需要花哨的 IO 接口&#xff0c;因為重點是過程而不是輸出。Azure WebJobs 提供了出色的支持&#xff0c;通常在云環境中通過 Web 控制臺應用程序來實現此目的。WebJob …