C 類的理解 一) 類的初識

2021-08-22 19:15:14 字數 3611 閱讀 6862

一、類的意義,以及類與物件:

類的內容比較多,但類是物件導向的基礎,所謂物件導向(object),其實就是一種更高層次的模組化,也稱為封裝。c語言中,稍微複雜點的資料結構都是用結構體來寫的,結構體本質上就是把一些相關的資訊打包儲存,比如貓:

struct cat

;

這樣我們通過鍵盤輸入很多貓的資訊就可以用結構體來儲存:

cat cats[100];

for(int i=0;iscanf("%s %d %c",name,age,***);

strcpy(cats[i].name,name);

cats[i].age=age;

cats[i].***=***;

}

如果沒有結構體,那我們可能就要用三個陣列來存放這些資料,然後用他們的下標來一一對應聯絡,這是可行的,但對於寫程式的人來說負擔是很大的,比如:

//拙劣的**:

char name[100][100];

int age[100];

char ***[100];

//然後name[i][100],age[i],***[i]是相關聯的一組數,描述同乙個貓的特徵。(累得很)

結構體將屬性打包,而類不僅打包屬性,還打包操作這些屬性的方法(函式)。

還用貓來打比方:

class cat

;

此例中,初始化left和right是指標,指標初始化時預設寫0一般,用上面的**,每一次新建乙個node都要寫

node node;

node.index=123;

node.left=0;

node.right=0;

後面兩行寫多了就煩了。

c++為類提供了初始化函式,這個函式在物件被建立時有系統自動呼叫,是建立物件的最後一步。也就是說,初始化函式是建立物件的一部分,初始化函式退出之後,該物件才完成了建立。

初始化函式和類名要保持一致,且沒有返回值,連void都沒有!!!

class cat

void printinfo()

void printinfo()

};

然後我初始化時候參數列只要乙個index數值就好,所以它的物件這麼建立:

node t(10); 

//此時: t.index==10, t.left==0, t.right==0

三、類的物件的使用

定義好了乙個類,此時它就和基礎型別無異了,可以定義該類的普通物件,也可以定義指向該類的指標物件。假設我們所有的程式在64位機子上跑,首先64位機和32位機區別在哪?這個你現在應該知道的,你告訴我吧。

然後我定義乙個普通物件和指標物件(還用上面的自定義了初始化函式的cat類):

cat mycat("tiantian",1,'f');

cat *p;

題外話1:

兩個問題,mycat 變數占多大的空間,p指標又佔多大空間?這兩個問題是理解指標變數和普通變數很關鍵的問題。

答: mycat佔 sizeof(cat) 這麼大的空間,而p佔8位元組。

為什麼?因為普通變數大小很直接,但指標存的是位址,64位機位址就是64bits,也就是8位元組,是定的。所以說不管是: int*, double*,bool*, cat* 這些指標,或者是int**,char**,這種指向指標的指標,他們佔的大小都是8位元組,因為存的都是位址。

那麼現在在理解下下面這個類定義為什麼不對:

class node

答:暫時先略,你先思考哦

回到上面,cat* p;是乙個指標,但目前是乙個危險的懸空指標,使用它操作類如下:

p=&mycat;

p->name; //=="tiantian"

p->age; //==1

p->***; //=='f'

p->printinfo();

然後通過上面的方法可以操作物件的屬性和方法。

或者也可以寫成這樣(對是對,不過沒人這樣用):

(*p).name;

(*p).printinfo();

//因為*p自然就是取所指空間的值,和mycat是等價的,上面的方法方便些,注意兩者的區別。

//不要混用,比如p.name是錯的,因為p是指標,不是乙個類,沒有name屬性

//(*p)->name,也是錯的(*p)不是乙個指向類的指標,它只是乙個普通物件空間mycat。

這一篇的內容很基礎,是能用好c++類的前提,另外從我曾經剛開始接觸類和物件的體驗來說,初學時上面所舉的例子可能容易接受,但可能想象不出在計算機程式設計領域類能表示什麼,或者一些奇奇怪怪的東西用類怎麼描述,比如描述乙個類:圓,或者磁碟,或者cpu,或者乙個多邊形複雜體的樣子。有些東西光是人用語言來描述就都很困難了,用乙個類就能描述出來嗎?

回答是:當然。。。不行!!!

那這玩意兒有啥用呢?有的書上會說萬物皆物件,這又算啥?

實際上,在工程中,我們描述或者定義乙個型別時,只定義我們感興趣的部分,屬性和操作都是這樣的。比如圓我們只關心圓心和半徑:

class circle

;

題外話2:

如果我還有點point這個物件我可以這麼寫:

class point

};class circle

};int main()

這時候main函式中要構造circle物件p,要構造p就要先構造p裡面那個point物件center,而point是沒有預設建構函式的,因為我自定義了乙個,所以只能通過上面那種方式給center的建構函式傳值,如果有多個屬性是沒有預設建構函式的物件的話,都寫在後面,用逗號隔開。

這裡面要注意這些變數的構造順序:

開始構造 p(1,2,3)

……開始構造p.center(1,2)

……p.center構造完成

p構造完成

它的順序是像遞迴一樣,先把基礎的構造好了,才會去構造上層的東西。

然後要用資料的時候就是p.center.x這種寫法。

繼續回到上面,剛剛我們在討論我們用類描述東西時候是描述我們感興趣的部分,比如剪刀,我們如果只關心大小,我們就:

class scissor

;

如果還關心顏色那就加個color color;屬性,並定義color類:

class color

如果有人非要關心什麼形狀,這種難以定量描述的屬性,直接點,我們可以在電腦上存個,然後加乙個屬性char shape_url[255];初始化的時候把位址賦過來,也是可以的!

總之,無論什麼屬性都要轉變成數值可表示的東西才行,實在不好表示的,像某人的聲音,這種東西就跟剛剛的一樣,弄個鏈結作為屬性就好。

C 類學習(一)類的構造和使用

本文記錄在本地建立類,實用類的過程,目的是為了在刷leetcode時能夠本地除錯。問題1 建立標頭檔案後,在定義建構函式時,函式使用的引數為類的成員變數,此時是否需要在引數前新增修飾限定?這個問題很重要,要記住建構函式的引數表示的不是類成員,而是賦給類成員的值,個人理解就是建構函式的引數是形參,形式...

初識c 的類

前言 c 所做的最重要的改進就是提供了類。類就體現了c 物件導向程式設計 oop 的特性,類是一種將抽象轉換為使用者定義型別的c 工具,它將資料表示和操縱資料的方法組合成乙個整潔的包。類的組成部分 類中的訪問許可權的總結 如何定義和宣告乙個類 include using namespace std ...

C 學習筆記(一) 類

c 使用關鍵字 class 來定義類。其基本結構如下 class myclass 定義這樣乙個類後,就可以在能訪問該定義的工程的其他地方對該類進行例項化。預設情況下,類宣告為內部的,即只有當前工程中的 才能訪問它。可以用internal 訪問修飾符關鍵字顯式指定,但這不是必須的,類在定義時預設為此型...