一、類的意義,以及類與物件:
類的內容比較多,但類是物件導向的基礎,所謂物件導向(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 訪問修飾符關鍵字顯式指定,但這不是必須的,類在定義時預設為此型...