總結在c++中【宣告】(declaration)與【定義】(definition)是比較重要的兩個概念,只有宣告沒有定義的類和函式是不可以使用的。【宣告】只是告訴編譯器有這麼乙個東西存在,但是沒有給他分配記憶體。所以你即沒有給他分配記憶體,又去使用他,那麼就會報錯誤。
變數是乙個比較特殊的存在。在linux中,用的是g++編譯器,他可能會自動給變數的【宣告】自動分配記憶體,使用時就不會報錯。但是在windows,尤其是用visual studio程式設計的同學,用的是微軟自家的編譯器。這個編譯器比較嚴格,不會給變數的【宣告】自動分配記憶體。所以只要養成【宣告】了就一定要【定義】的好習慣,那麼不管在什麼平台程式設計都不會出錯。
到後面這個兩個概念也會反覆提到,所以別看這兩個概念簡單就忽視了。
int a =10;
//變數的宣告和定義
int b;
//變數的宣告
b =10
;//變數的定義
void
fun();
//函式的宣告
void
fun(
)//函式的定義
classa;
//類的宣告
classa;
//類的定義
如果之前學過c語言的同學,培養的程式設計思維應該是【面向過程】程式設計。這樣的邏輯思維在刷題和解決問題方面沒有什麼問題,但是在大工程面前就會顯得比較吃力。於是有人就提出了另外一種很好的程式設計方案,那就是【物件導向】程式設計(object oriented programming)。
那什麼是【面向過程】,什麼又是【物件導向】呢?
舉個例子:如何把大象放進冰箱裡面?這個問題的答案肯定很多人都知道:開啟冰箱->放入大象->關上冰箱。這就是乙個很典型的【面向過程】的解決問題的思維,解決問題是從步驟下手的。如果是【物件導向】的思維,那麼我會先抽象乙個冰箱出來,這個冰箱能夠開啟和關閉,這是冰箱這個事物的能力;然後再抽象乙個大象出來,這個大象可能會變大和縮小,這是大象這個事物的能力;那麼解決這個問題就是:冰箱.開啟->大象.縮小->冰箱.關閉。
可以看出【面向過程】更注重的是解決問題的過程,而【物件導向】更注重的是參與這個問題的事物是什麼,他們有什麼屬性,他們能夠幹什麼。我們把這樣的事物稱之為「物件」(object)。
c++在c的基礎上增加了物件導向程式設計的語法,使用起來十分具有靈活性。這篇文章只是簡單的入門,以後我會用比較多的博文來更詳細說明c++類與物件程式設計的一些細節。
繼承和多型是【物件導向】的最重要的兩個特點,也他的最大優勢。這些後期都會講到,這裡就大概感受一下什麼是封裝性吧。
乙個共享相同結構和行為的物件的集合。類(class)定義了一件事物的抽象特點。通常來說,類定義了事物的屬性和它可以做到的(它的行為)。舉例來說,「狗」這個類會包含狗的一切基礎特徵,例如它的孕育、毛皮顏色和吠叫的能力。類可以為程式提供模版和結構。乙個類的方法和屬性被稱為「成員」。簡單來說類就是乙個模板,通過這個模板可以刻畫出許多擁有相同基礎特徵的不同事物。
在c++中,我們將類的屬性稱作類的成員變數,將類的方法稱作類的成員函式。
說完類的定義,我們來說說類的例項化。說到底,「狗」是乙個抽象的概念,而隔壁老王家的哈士奇波比是個具體的存在。我們說波比是「狗」這個概念的乙個例項,或者說波比是「狗」這個類例項化的乙個物件。
我們先來定義乙個遊戲角色類,看以下**:
class
character
;
學過c語言的同學不難看出來,這不就是struct嘛。對沒錯,c++的class就是用struct來實現的,而且和struct沒什麼區別。唯一的區別就是,class定義好之後,如果不特定標明屬性或者方法是公有的(public)還是私有的(private),那就都預設是私有的,而struct預設是公有的。(還有乙個protected屬性是跟繼承有關的,以後再說)
公有和私有也很好理解:公有就是我可以用,別人也可以用;私有就是除了我自己之外別人都不可以用。放在類與物件裡面理解就是:類例項化了乙個物件,這個物件的公有成員變數你可以在任何地方任何時刻修改,但是私有成員變數只能由物件自己來修改。
優化一下以上**:
class
character
};
這裡我把角色的hp和mp給私有化了,以保證外部不能隨意修改他們的值。然後我定義了乙個公有的函式heal,用於給角色恢復生命值,這樣外部就可以通過呼叫這個成員函式來改變角色的hp。這就是封裝,我不希望別人能夠隨意玩弄我角色,你只能用我規定的方法來玩弄他。
我們在建立角色的時候,總得先給這個角色一些初始的數值吧,而且上面也說了只有【宣告】沒有【定義】是有可能會出問題的。建構函式就是幹這事的,他在類被例項化的時候被呼叫:
class
character
; character()
void
heal
(int heal_hp)
};
對其進行例項化:
character mario =
character()
;//新建英雄成功!
character link;
//新建英雄成功!
public
://這是編譯器自動補充的建構函式,但是如果自己實現了的話,編譯器就不會補充了
//character(){};
character()
character
(int hp,
int mp)
character mario =
character
(999
,999);
//新建英雄成功!!!
character link
(999
,999);
//新建英雄成功!!!
我剛開始學物件導向程式設計的時候,一直有乙個困惑,那就是我既然是要修改或者訪問類裡面的屬性值,我為啥不直接將他設為public,這樣不是更方便。為何要大費周章地專門寫乙個set函式去修改,專門寫乙個get函式去獲取。後來在我看了浙江大學翁愷老師的c++物件導向課程之後,翁愷老師的解釋令我恍然大悟。
他說將成員變數封裝起來相當於把肌肉包在**裡面,我們可以通過大腦去控制肌肉的收縮,但是我們不會說拿乙個電線,把電線接到肌肉上面去,通過電流讓肌肉收縮。這個是可以實現,但是沒有人會去這麼做,太危險了。類的封裝也是乙個道理。
希望這個解釋,也能幫助有和我一樣困惑的同學。
c 類與物件入門
c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過步驟解決問題 c 物件導向,關注的是物件,將一件事情拆分成不同物件,靠物件之間的互動完成 類的定義 class classname class為定義類的關鍵字,classname為類的名字,中為類的主體,類中的元素為類的成員,類中的資料為類...
C 類和物件入門
物件的含義是指具體的某乙個事物,即在現實生活中能夠看得見摸得著的事物。在物件導向程式設計中,物件所指的是計算機系統中的某乙個成分。在物件導向程式設計中,物件包含兩個含義,其中乙個是資料,另外乙個是動作。物件則是資料和動作的結合體。物件不僅能夠進行操作,同時還能夠及時記錄下操作結果。這是什麼玩意,通俗...
C 類與物件
程式設計模型 所有計算機均由兩種元素組成 和資料.精確的說,有些程式是圍繞著 什麼正在發生 而編寫,有些則是圍繞 誰正在受影響 而編寫的.抽象封裝 封裝是一種把 和 所操作的資料 在一起,使這兩者不受外界干擾和誤用的機制.繼承 繼承是指乙個物件從另乙個物件中獲得屬性的過程.是物件導向程式設計的三大原...