1. 物件導向的初步認知。
c語言是面向過程的,關注的是過程,分析求解問題的步驟,是通過函式呼叫逐步解決問題。
c++是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。
2. c++中類的定義
c語言中,結構體中只能定義變數,在c++中,結構體中不僅可以定義變數,還可以定義函式。
struct person
中是類的主體,主義類結束是有;這個;號不能丟。
類中的元素稱為類的成員;類中的資料成為類的屬性或類的成員變數,其中函式成為類的方法或成員函式。
類的兩中宣告方式:
1.定義和宣告都放在類體中。 !!!成員函式如果在類中定義,編譯器可能會將其當做內聯函式處理。
class person
#include "person.h"
void person::showinfo()
private:
char* _name;
char* _***;
int _age;
};//這裡要指定person屬於person這個類域。
void person::personinfo()
private:
char* _name;
char* _***;
int _age;
};int main()
6.類的物件模型的大小
要計算類的物件的大小,就像c語言中計算結構體的大小一樣,首先,我們應該搞清楚結構體成員變數在記憶體中儲存方式,而結構中只有成員變數,而類中有成員變數和成員函式,那麼類在記憶體中的儲存方式是怎樣的呢。
方法一:對於類的每個物件都在記憶體中開闢空間儲存它的成員變數和成員函式。這樣每個物件中都會儲存乙份**,相同的成員函式**會儲存多次,浪費空間,那麼如何解決呢。
方法二:只儲存類物件的成員變數,成員函式放在公共**段。
實際中,計算機是採用第二中方式來儲存的。
類的物件的成員變數的對齊方式和c語言結構體對齊規則是一樣的。
//結構體內存對齊規則
1.第乙個成員在結構體偏移量為0的位址處。
3.結構體的總大小是:最大對齊數(所有成員變數型別最大者和編譯器預設對齊數的較小值)的整數倍。
4.如果巢狀結構體的話,巢狀的結構體對齊到自己最大對齊數的的整數倍處,結構體的總大小是所有最大對齊數(包含巢狀結構體的對齊數)的整數倍。
知識擴充套件:
上面是結構體對齊的規則,那為甚麼要有記憶體對齊呢。常見的解釋有兩種原因:
1.平台原因(移植原因)
有些硬體只能在某些位址出訪問資料,否則會拋異常。
2.效能原因
cpu是按整數倍讀取資料的,為了訪問為對齊的記憶體,cpu需要做兩次記憶體訪問,而對齊的記憶體訪問只需要一次。
如何讓結構體按照指定的對齊數進行對齊
pragma pack(number)
pragma pack()
如何知道結構中某個成員相對於結構體起始位置的偏移量
#define offsetof(s, t) (size_t) &(((s *)0)->t)
什麼是大小端?如何測試某台機器是大端還是小端,有沒有遇到過要考慮大小端的場景。
int check_sys()
這裡要注意兩種特殊情況。
//類中只有成員函式
class a1
};//空類的大小
class a2
{};那麼a1, a2大小是多少的呢。
sizeof(a1) = 1;
sizeof(a2) = 1;
為甚麼呢,空類的大小是1呢,其實編譯器分配這乙個位元組是為了進行佔位(不是為了存資料),表示物件存在過。
a3 a1
a3 a2
如果a1,a2不占用空間,我們如何表示a1,a2定義出來,如何區分a1,a2呢,對a1,a2取位址又是什麼呢。
所以,編譯器給了空類的乙個位元組來表示這個類。
7.this指標
class date
再來看上面的程式,能否編譯通過呢,實際上是可以編譯通過的,只是不可以執行,應為相當於給this指標為空,不指向任何物件。 C 類和物件(上)
目錄類 類的引入 類的定義 類的訪問限定符及封裝 訪問限定符 封裝 類的作用域 類的例項化 類物件大小計算 儲存方式猜測 類物件大小計算規則 結構體內存對齊 this指標 引出 this指標特性 c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。c 是基於物件導向的,...
C 類和物件 上
一 類與物件 c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。c 是物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式。二 類的定義 1.定義乙個簡單的類 c...
類和物件(上)
類的定義格式 說明部分和實現部分 class 類名 public 公有資料成員和成員函式 protected 保護資料成員和成員函式 private 私有資料成員和成員函式 各個成員函式的實現 建構函式 a 作用 為物件分配空間 對物件初始化 即賦初始值 請求其他資源。b 特點 函式名和類名完全相同...