♥ 學習筆記Learning 程式語言 Coding

[C++程式設計] 學習筆記-物件導向之class, object, instance的差別

前面講了那麼多亂七八糟的東西,現在,我們直接來討論一些常見字吧!因為Rami的筆記是自己寫爽的,就是我寫程式過程中用到什麼,需要查書了解比較清楚一點,我就會查查看,然後邊理解邊使用;尚未成為高手,還沒辦法信手拈來,幸好我還買得起高手寫的工具書。所以,終於可以慢慢釐清一點觀念了…

Toda_Erika3018

因為我以前是學習C語言的,寫程式一直是使用結構化的程序思考去寫,因此,我得承認,手上拿到一個熱騰騰新鮮的C++程式碼,雖然我看得懂他在做甚麼,可是我卻不懂為什麼作者要這樣寫。

後來,我內心的為什麼,終於找到了答案,那應該就是我學習失落的一角,所謂物件導向的概念
因此,雖然我用過vector、用過map、也會用cout與cin等等這些,但是,事實上結構就跟擅長用C++的人寫的不一樣,我頂多只是把vector當作一個進化版的Array,class當作強化版的struct去使用,什麼封裝?什麼繼承?什麼多載?一概都不算是有真正的用上,這當然讓強大的C++有點傷心,這把牛刀我都拿來切菜。

唯一比較強化的習慣,就是習慣在完成一個功能以後,讓他獨立開來,讓資料在主程式呼叫時,再使用就好。

可是,所謂的「什麼東西都是一個物件」這句話,我一直無法體會。
無法體會的東西,要我怎麼使用的出來呢?也許我應該放掉過去根深柢固的程序導向概念。

這是自己在學習上的一個盲點,我無法確信或記憶「我不清楚為什麼的東西」,頂多短暫的停留在腦海,不知道為什麼,過不久很快就會忘記,也會學習起來內心不踏實,總是覺得少了什麼。

當然,在這種被時間壓力壓迫的情況下,同學應該蠻常覺得我是很不智的。
「哪有這麼多為什麼?會用就好啦!」這句,是我常聽見的話。

或許,這樣說的也對,也許哪天我就開竅了!哈哈~先來慢慢的一點一點的了解吧!
如果我能把程式語言這種語言學的好的話,我猜,很快我也能突破學英文與德文的瓶頸了(笑)

先搞清楚一些常見的名詞,class(類別)、object(物件)、instance、method(方法)。
老實說,這幾個詞都有自己的一堆翻譯,讓人很頭痛;例如object會被翻成物件、物體、實體、對象等…
我寫下的,也就單純是我的理解,建議可以多看幾種說法,至少我現在正在努力體會。Orz|||||||
還有什麼介面、繼承、封裝等,我我我…會努力的理解的Q_________Q

class
如果我們要將人分類,我們有很多種分類的定義方法,譬如…男人、女人、好人、壞人之類的。

 1: class 女人{
 2:          string 女人名字;
 3:          bool   第二性徵;
 4: };

 

object
因此,class只是將人分類的一種定義,因此假設你老婆懷孕了,你跟上帝禱告說:「給我一個女人吧!」
上帝最疼你了,二話不說在你老婆去做超音波掃描時,掃描出來是女兒,恭喜你當爸爸得到一個女人了。(誤)
通常,我們會這樣宣告,這意思就是跟上帝說你要一個女人,命名為寶貝女兒。

 1: 女人   寶貝女兒;

 

因此,我們會說 寶貝女兒是一個object。 (在此澄清,我絕對沒有物化女性的用意,我也是女人,謝謝。)

instance
再來,就是一個我很容易很object搞混的一個詞了;對我來說很像,又似乎有點不同。
依照前面的例子,我們同樣是這樣宣告的。

 1: 女人   寶貝女兒;

這時候我們會說,寶貝女兒是女人的一個instance
有人說這是一個is kind of 的關係,也就是說“寶貝女兒是一個女人”,這句話我也有點看不懂沒關係。XD

method
看來我舉的例子有點不太好,總覺得解釋使用女人的方法有點怪怪的,請大家將就點,感謝…( ̄□ ̄|||)a
幾個詞搞懂了以後,我們來看方法(method);方法分為類別方法(class method)與實例方法(instance method)。
這…依照我們很爛的例子來直譯的話,就是「使用女人的方法」與「使用寶貝女兒的方法」。

冏rz||||| 我們繼續用程式來舉例,希望大家理解,不對,是幫助我理解Q_____Q。

 1: class 女人{
 2: public:
 3:          int 請問你幾歲(int);
 4:          bool 妳有男友嗎(bool );
 5:          char 有哪些興趣(enum );
 6:          string 相處看看她的個性(string );
 7: 
 8: private:
 9:           int    _出生日期;
 10:           bool   _死會了嗎;
 11:           enum  _興趣{A,B,C,D};
 12:           string _個性;
 13: };

扯到方法(method)就需要同時扯到資料(data),通常在private裡的資料,只有class自己看的到,也就是說,只有這個女人自己知道,我們通常在命名的前面習慣加上底線( _ ),代表的是資訊隱藏,你沒辦法直接知道,可是透過public裡的提問方法,可能就可以問到答案囉!@@”

所謂的類別方法(class method)就是告訴你說,對任何一個女人這樣提問,或許都能夠得到答案,答案看人。
但是實例方法(instance method)也就是你家寶貝女兒的內容呢?就專屬於她自己的,答案就是你寶貝女兒的。

所以,我們用這些方法將寶貝女兒的資料叫出來可能是這樣的。
「我們家的小寶貝幾歲了啊?」『三歲…』
「我們家的小寶貝愛不愛爸爸啊?」『…』(
陷阱題:小孩子還不知道什麼是愛的意思。)
「我們家的小寶貝喜歡什麼啊?」 『蘋果…』(模糊的問題,會造成錯誤的結果。Q Q)
「我們家的小寶貝乖不乖啊?」 (請欣賞以下影片…)

台灣高雄的Sandy與Mandy

 

好吧!影片完全無關,純粹是我自己想放!被毆飛…( ‵□′)───C<(─___-)|||

interface
關於介面,也是一個我會跟方法(method)會有點搞不清狀況的地方,這部分尚在理解當中。
如果你很清楚差別,拜託你教我<(____ _____)>

iheritance
有的時候,我們在某個已經確定的類別裡面,會希望再增加更多的條件,來讓女人的歸類更細。
譬如,正妹這個例子,哈哈~因為之前看到有個網誌介紹的太有趣了。

 1: class 正妹{
 2: 
 3: public:
 4:           string  女人名字;
 5:           bool    第二性徵;
 6:           bool    長得漂亮;
 7: 
 8: };

 

當然,你也可以繼續歸納下去。
譬如:性感正妹、甜美正妹、火辣正妹、氣質正妹之類的,注意這只是分類。
(小聲說:不知道為什麼一直用正妹這個詞,瞬間會讓我覺得自己像個宅男Orz||||)

如果分開定義時,大概就是這個樣子,我們會發現第4行與第5行的定義是和女人定義重疊的。
因此,我們可以將正妹視為女人的子類別或衍生類別,在女人的定義之上加了長得漂不漂亮的條件。

這個時候,正妹(derived class)女人(base class)之間的關係可以這樣使用。

 1: class 正妹 : public 女人{
 2: public:
 3:          //balbala 可以問正妹的問題
 4: 
 5: private:
 6:          //balabala正妹的秘密
 7: };

好!我掰不下去了,先休息去了:) 目前自己慢慢釐清中,等到想到更好的講法再來掰(誤)。

 

(待續…)

About the author

蕾咪

蕾咪,來自台東,卻不定期旅居歐洲的工程師女孩,身兼作家、部落客、創業家等多重身份。畢業於台大電子所,曾在義大利商與美商擔任研發工程師;走訪世界後,發現對台灣有段割捨不了的愛,讓我們一起努力成為想要的自己吧!:) 合作邀稿請聯繫:[email protected]

15 Comments

  • 您好,

    最近剛好有些心得, 來分享下
    把class想成一個新的type就行了, 就類似在C中用struct關鍵字定義一個新的type一樣, 就像int/double這類的type一樣, 所以一個obj就是那個type的變數, 只不過class能包含function進去且其member的scope也可以設定為外面看不到(還有class的this指標的運用也不大相同), 這是從C的struct談過來, 我覺得有相似的地方

    class method 跟 instance method的差異, 主要應該在class method它是屬於class level的method, 不需要宣告變數(object)就能用, 也不能acess到非static的member; 而instance method一定得宣告變數(object)才能用, 能access到非static member
    僅是個人想法, 有錯還請指教

    • 呵呵 謝謝妳的分享。
      這樣的說明很清楚。:)

      不過因為不是每個人都是學過C,再學過C++的。
      所以,不見得每個人都清楚struct的使用方式。
      這對於從C轉換成C++的開發者是相對好理解的方式。
      class與struct在用法上,還是有些許的不同。

      Method的部分,我不太會表達,很謝謝妳的補充。XD

  • 想請教一下class method 和instance method
    因為我依然有點不太明白
    在我理解中..class 可以比作一張設計圖.而object 就是一個根據設計圖make 出來的物件
    那..instance method 是不是指在object 中的method? 根據不同object 就有不同的參數?
    那..class method 就一定是設計圖中的method 吧
    感覺硬是有點怪怪的

Leave a Comment