文章目錄
- 前言
- 一、面向過程和面向對象初步認識
- 二、類的引入
- 三、類的定義
- 六、類的實例化
- 七、類的對象大小的計算
- 八、類成員函數的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中默認的對齊數為83. 結構體總大小為:最大對齊數(所有變量類型最大者與默認對齊參數取最小)的整數倍。4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整 體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
五、類成員函數的this指針
1. this 指針的類型:類類型 * const ,即成員函數中,不能給 this 指針賦值。2. 只能在 “ 成員函數 ” 的內部使用3. this 指針本質上是 “ 成員函數 ” 的形參 ,當對象調用成員函數時,將對象地址作為實參傳遞給 this形參。所以 對象中不存儲 this 指針 。4. this 指針是 “ 成員函數 ” 第一個隱含的指針形參,一般情況由編譯器通過 ecx 寄存器自動傳遞,不需要用戶傳遞
總結
類和對象是面向對象編程中重要的概念。
類是指對具有相同特征和行為的對象進行分類描述的模板或藍圖。它定義了一類對象的共同屬性和方法。類可以看作是一種數據類型,用于創建對象。
對象是類的實例,是具體存在的實體。一個對象具有類定義的屬性和方法,并且可以獨立地執行這些方法。對象是根據類定義創建的,類定義了對象的屬性和方法,而對象則是類的實例。
類和對象之間的關系是類是對象的抽象,而對象是類的具體實例。一個類可以實例化多個對象,每個對象都具有相同的屬性和方法。
類和對象在面向對象編程中具有重要的意義。通過使用類和對象,可以將程序分解為多個相互獨立的模塊,每個模塊負責一部分功能。這種模塊化的設計可以提高代碼的可重用性、可維護性和可擴展性。同時,類和對象還能夠隱藏內部實現細節,使得代碼更加安全和簡潔。