C 類與物件(上)

2021-09-09 05:42:38 字數 3050 閱讀 6805

類與物件

在現實生活中有很多的東西,例如動物植物昆蟲等,他們都有自己的屬性與特點,例如年齡外貌體積等,人們通過歸納總結,把他們的特點記錄下來,然後就根據這些特點來確定乙個物體到底屬於什麼

類似的在c++世界裡,我們先設定乙個類再用類來產生東西,也就是例項。

c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。

c++是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。

而在c++裡類不僅可以定義變數,也可以定義函式。

struct seqlist

; int main()

這種定義方式在c++中叫類

class classname

;//注意後面有分號

class為定義類的關鍵字,classname為類的名字,{}中為類的主體,注意類定義結束時後面分號,

類的元素被稱為成員,其中類的資料被稱為類的屬性或者成員變數,類的函式被稱為類的方法或者成員函式

1.什麼是封裝

c++是一門物件導向的語言,與之對比c語言是面向過程的語言,我們在c語言裡假設有某些關鍵資料並不想讓其他人輕易改變,比如順序表的有效資料個數

sldatatype *_arry;//                               

size_t _size;//有效資料個數,同時也是插入的下乙個下標

size_t _capcity;//容量空間的大小

如果有人在程式裡設定_size=20;程式一定會發生錯誤,這是因為c語言裡沒有許可權的分別,所有的資料都是平級的,可改的,

所以物件導向的語言造成了封裝,把乙個物件封起來,只能呼叫公有的資料資訊,而不用擔心因為其他地方更改了私密的重要的資料而程式崩潰。

c++實現封裝的方式:用類將物件的屬性與方法結合在一塊,讓物件更加完善,通過訪問許可權選擇性的將其介面提供給外部的使用者使

c++中共有3種訪問限定符:public private protected

【訪問限定符說明】1. public修飾的成員在類外可以直接被訪問

2. protected和private修飾的成員在類外不能直接被訪問(此處protected和private是

3. 訪問許可權作用域從該訪問限定符出現的位置開始直到下乙個訪問限定符出現時為止

4. class的預設訪問許可權為private,struct為public(因為struct要相容c語言)例子如下

class student

;// 這裡需要指定printpersoninfo是屬於person這個類域

void person::printpersoninfo()

6.類的例項化

用類型別建立物件的過程,稱為類的例項化

1. 類只是乙個模型一樣的東西,限定了類有哪些成員,定義出乙個類並沒有分配實際的記憶體空間來儲存它

2. 乙個類可以例項化出多個物件,例項化出的物件 占用實際的物理空間,儲存類成員變數

類的記憶體有乙個叫**區用來存放**的,每個物件呼叫的**是那段**區的**,也就是說乙個類的**存放是沒有多個備份,也是為了節省節省空間

小知識點:類的成員函式在類裡可以宣告加定義,成員變數在類裡只有宣告。

類的計算大小遵循結構體的對齊規則,與成員變數有關,實際就是該類中」成員變數」之和,成員函式的位址在類的,因為每乙個成員的屬性不一定相同,但是呼叫的函式作用相同,

注意:空類的物件是個例外,雖然空類並沒有成員,但是程式為了確定類的物件存在過,給空類的物件分配1位元組的空間

結構體內存對齊規則

1. 第乙個成員在與結構體偏移量為0的位址處。

2. 其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

注意:對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。

vs中預設的對齊數為8,gcc中的對齊數為4

3. 結構體總大小為:最大對齊數(所有變數型別最大者與預設對齊引數取最小)的整數倍。

4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是

所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

小知識:為什麼要進行記憶體對齊。

答c語言中可以手動控制預設對齊數#pragrama pack(4),設定預設對齊數為4

在計算機記憶體中,通常是以位元組(byte),也就是 8 個位(bit)為基本儲存單元(也有以 16 位為基本儲存單元的)。對於像c++中的char這樣的資料型別,它本身就是占用乙個位元組的大小,不會產生什麼問題。但是當數制型別為int,在32bit的系統中,它需要占用4個位元組(32bit),這個時候就會產生這4個位元組在暫存器中的存放順序的問題。比如int maxheight = 0x12345678,&maxheight = 0x0042ffc4。具體的該怎麼存放呢?這個時候就需要理解計算機的大小端的原理了。

大端:(big-endian):

就是把數值的高位位元組放在記憶體的低位位址上,把數值的地位位元組放在記憶體的高位位址上。

小端:(little-endian):

就是把數字的高位位元組放在高位的位址上,低位位元組放在低位位址上。

測試**

int value = 1;

if((char)value == 1)

cout<<"小端"《需要考慮大小端的情況

this指標型別:類的型別的*const指標( *const this)

this指標只能在成員內部使用,作為隱含的成員函式的形參,一般情況由編譯器通過ecx暫存器自動傳遞,不需要使用者

傳遞小知識:

this指標存在的地方:因為使用頻繁,在vc++中this指標存在ecx暫存器中,在其他編譯器中可能因為作為形參而存為棧幀中

this指標可以為空嗎?

主要取決於呼叫的成員函式是否和當前物件有關。

class a

如上**,呼叫c成功,而呼叫a失敗,是因為this作為乙個隱藏的形參傳入,編譯器實際執行的是

cout類與物件(中):

C 類與物件 上

類的引入 c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式 include using std cout using std endl struct date int year int month int day int main 輸出結果為 2019 5 7 注意...

C 類與物件(上)

c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。c 是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式。c 中更喜歡用class來代替struct st...

類與物件(上)

this指標 c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式。結構體的定義,在c 中更喜歡用class來代替。class classname 一定要注意後面的分號 類的兩種定義方式 1 宣告和定義全部放在類體中,需要注意 成員函式如果在類中定義,編譯器可能會將其當...