?? 教學--第二十三章 類(一)封裝.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://d2school.com/bcyl/bhcpp/newls/ls23.htm -->
<HTML><HEAD><TITLE>教學--第二十三章 類(一)封裝</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.節標題 {
FONT-WEIGHT: bold; FONT-SIZE: 12pt
}
TD {
FONT-SIZE: 9pt
}
.tdtitle {
FONT-SIZE: 20pt
}
.celltopline {
BORDER-TOP: #000000 1px solid
}
.menucell {
FONT-SIZE: 10pt
}
#glowtext {
FONT-SIZE: 10pt; FILTER: glow(color=red,strength=1); WIDTH: 100%
}
A:link {
FONT: 10pt 宋體; COLOR: blue; TEXT-DECORATION: none
}
A:visited {
FONT: 10pt 宋體; COLOR: purple; TEXT-DECORATION: none
}
A:active {
FONT: 10pt 宋體; COLOR: red; TEXT-DECORATION: underline
}
A:hover {
COLOR: blue; TEXT-DECORATION: underline
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=3>
<CENTER>
<TABLE height=105 cellSpacing=4 cellPadding=4 width=760 border=0>
<TBODY>
<TR>
<TD
style="FONT-SIZE: 10pt; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; FONT-FAMILY: ËÎÌå"
width="100%" height=210>
<H2>第二十<SPAN lang=zh-cn>三</SPAN>章 <SPAN lang=zh-cn>類/class (一)
封裝</SPAN></H2>
<P> </P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.1">23.1
從“我吃飯”開始</A> </P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.2">23.2
從“結構”到“類”</A> </P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.3">23.3
類的成員數據與成員函數</A> </P>
<P><SPAN lang=zh-cn> </SPAN><A
href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.3.1">23.3.1
成員數據初始化的疑問</A> </P>
<P><SPAN lang=zh-cn> </SPAN><A
href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.3.2">23.3.2
成員函數的實現</A> </P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.4">23.4 封裝
</A></P>
<P><SPAN lang=zh-cn> </SPAN><A
href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.4.1">23.4.1
私有成員/private member </A></P>
<P><SPAN lang=zh-cn> </SPAN><A
href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.4.2">23.4.2
保護成員/protected member</A> </P>
<P><SPAN lang=zh-cn> </SPAN><A
href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.4.3">23.4.3
公有成員/public member </A></P>
<P><SPAN lang=zh-cn> </SPAN><A
href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.4.4">23.4.4
“封裝”的作用</A> </P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.5">23.5
作業</A></P>
<P> </P>
<H1><B><FONT size=4><A name=23.1>2<SPAN lang=zh-cn>3</SPAN>.1</A> <SPAN
lang=zh-cn>從“我吃飯”開始</SPAN></FONT></B></H1>
<P> </P>
<P><SPAN lang=zh-cn>我吃飯……</SPAN></P>
<P><SPAN lang=zh-cn>其中,“我”是一個變量,“我”的類型是“人類”;</SPAN></P>
<P><SPAN lang=zh-cn>“吃”是一個函數。</SPAN></P>
<P><SPAN lang=zh-cn>“飯”也是一個變量,它的類型是“食物”。這里用于做函數“吃”的參數。</SPAN></P>
<P> </P>
<P><SPAN
lang=zh-cn>“我吃飯”!這是一種面向對象的思想的表達。其中的對象是“我”。以我為中心。我因為是人類,所以具備“吃”這種能力。如果說“桌子吃飯”,那么編譯器會報錯,因為桌子屬于家具類,而家具不提供“吃”的函數。</SPAN></P>
<P><SPAN
lang=zh-cn>C++是一種具備面向對象能力的編程語言,所以,用C++來表達“我吃飯”這樣一件事時,它的代碼風格貼近這種人類的自然語言,即:我.吃(飯);“我”是一個對象,“吃”是“我”所屬對象(人類)的一個函數,而“飯”是函數參數。</SPAN></P>
<P><SPAN
lang=zh-cn>換成C語言,因為它不具備面向對象的設計思想,所以,它只能說成:“吃(我,飯)”。“吃”是函數,“我”和“飯”是兩個參數。沒有人規則一定要把“我”作為第一個參數,你盡可寫成“吃(飯,我)”。二者比較,面向對象的最基本的好處或許您已經有所體會:自然,從而不容易出錯。</SPAN></P>
<P> </P>
<H1><B><FONT size=4><A name=23.2>23.2</A> 從“結構”到“類”</FONT></B></H1>
<P> </P>
<P><SPAN
lang=zh-cn>上一章我們學習了結構(struct)。(強烈建議你暫時放下新課程,重溫一下struct)。</SPAN></P>
<P><SPAN lang=zh-cn>結構讓我們具備了把多種相同或不同的類型,組成一種新類型的能力。</SPAN></P>
<P><SPAN lang=zh-cn>比如上一章講的“寶寶/BaoBao”這一結構,它的組合為:</SPAN></P>
<P> </P>
<P><B>struct</B> BaoBao</P>
<P><B>{</B></P>
<P> char xingMing[11];<SPAN lang=zh-cn>
//用字符數組,來存儲姓名</SPAN></P>
<P> int shenGao;<SPAN lang=zh-cn> //身高,整型</SPAN></P>
<P> float tiZhong;<SPAN lang=zh-cn> //體重,實型</SPAN></P>
<P><B>};</B> </P>
<P> </P>
<P><SPAN
lang=zh-cn>通過struct,我們通過將簡單數據類型(int,float,bool……)或簡單數據類型的數組、指針,組合成一個新的<B>數據類型</B>。由此,我們在用程序表達復雜的現實世界時,更接近了一步。但是別忘了,我們說過世界是由“數據”和“動作”組成的。光能定義出各種數據類型,還只是編程世界的一半。你可能會說,我們有函數啊,函數不是可以表達“動作”?</SPAN></P>
<P><SPAN
lang=zh-cn>沒錯,比如說,寶寶肯定有“吃”的動作,所以我來聲明一個“吃”的函數。為了直觀,我們的函數命名為“Chi”。并且我們假充有一種數據類型叫“飯”,同樣用拼音Fan表示,首字母大寫,而小寫的fan用來做形參。</SPAN></P>
<P> </P>
<P><SPAN lang=zh-cn>void Chi(Fan fan);</SPAN></P>
<P> </P>
<P><SPAN
lang=zh-cn>乍一看,感覺這個函數這樣聲明也就對了。“吃飯”函數嘛,有“吃”又有“飯”……可仔細一想,誰吃飯啊?這個光有吃的動作和吃的東西,和我們前面的“寶寶”數據類型有何關系?所以,顯然不夠,需要再加一個參數,用于傳一個“要吃飯”的寶寶進去。因此函數變成:</SPAN></P>
<P> </P>
<P><SPAN lang=zh-cn>void Chi(BaoBao bb, Fan fan);</SPAN></P>
<P> </P>
<P><SPAN
lang=zh-cn>得,“吃我飯”的表達出來了。過程化的編程,其設計重在關心“過程”,比如:“如何吃”,但這個世界要求我們完整地關心“誰?如何吃?吃什么?”。事實上,同一樣一個“吃”,寶寶吃的動作,和一個大男人吃的動作;或者,吃飯還是吃奶的動作?怕是完全不一樣。如果真寫,就不得不寫很多版本的“吃”這一函數:</SPAN></P>
<P><SPAN lang=zh-cn>假設用DNR表大男人(暈,好像大女人也可以?):</SPAN></P>
<P><SPAN lang=zh-cn>void DNRChi(DNR dnr, PingGuo pg);
//吃函數版本一:大男人吃蘋果</SPAN></P>
<P><SPAN lang=zh-cn>void DNRChi(DNR dnr,Fan fan);
//吃函數版本二:大男人吃飯</SPAN></P>
<P><SPAN lang=zh-cn>void BaoBaoChi(BaoBao bb, Nai nai);
//吃函數版本三:寶寶吃奶</SPAN></P>
<P><SPAN lang=zh-cn>void BaoBaoChi(BaoBao bb, Fan fan);
//吃函數版本四:寶寶吃飯</SPAN></P>
<P><SPAN lang=zh-cn>......</SPAN></P>
<P> </P>
<P><SPAN
lang=zh-cn>這樣的函數還可以有很多。函數多或許并沒有錯,必竟所要表達事物本來就復雜。然而問題是我們如何去理解,區分,記憶這些函數呢?僅靠函數名和函數參數的不同嗎?在超市付款時,看過收款員拉開過放錢的小抽屜嗎?拉開一看,都是錢,但10元的5元,100元的及硬幣分門別類地放好……聰明的你一定會提出:如果能把函數也歸類就好了……這就有了“類”,英文稱為:class。</SPAN></P>
<P> </P>
<P><SPAN lang=zh-cn>請仔細看,下面示例的class定義里,加入了一個函數:</SPAN></P>
<P> </P>
<P><SPAN lang=zh-cn>class BaoBao</SPAN></P>
<P><SPAN lang=zh-cn>{</SPAN></P>
<P> char xingMing[11];<SPAN lang=zh-cn>
//用字符數組,來存儲姓名</SPAN></P>
<P> int shenGao;<SPAN lang=zh-cn> //身高,整型</SPAN></P>
<P> float tiZhong;<SPAN lang=zh-cn> //體重,實型</SPAN></P>
<P> </P>
<P><SPAN lang=zh-cn> void Chi(Fan fan);
//加入“吃”的函數。 </SPAN></P>
<P><SPAN lang=zh-cn>};</SPAN></P>
<P> </P>
<P><SPAN
lang=zh-cn>這算是一個“突變”——我們一直說著的“動作”與“數據”從這里開始合二為一,表面看來或許不過如此:無非是在類的定義里,同時可以包括數據及函數。然而卻由此開啟了“面向對象”世界之門。如果你喜歡武俠,那你可以把它看成一門語言打通了任督二脈……</SPAN></P>
<P> </P>
<P><SPAN lang=zh-cn>類的數據定義里,出現函數,那么,這個函數的<B>聲明</B>它占用類的大小嗎?</SPAN></P>
<P> </P>
<P><SPAN
lang=zh-cn>來看兩個數據定義,前者是struct,后者是class。前者沒有包括函數,后者包括一個函數。其余的數據定義完全一樣。</SPAN></P>
<P> </P>
<DIV align=center>
<CENTER>
<TABLE id=AutoNumber1 cellSpacing=0 cellPadding=0 width="72%"
bgColor=#008080 border=1>
<TBODY>
<TR>
<TD width="47%"><FONT color=#ffffff><SPAN lang=zh-cn>struct
SBaoBao</SPAN></FONT>
<P><FONT color=#ffffff><SPAN lang=zh-cn>{</SPAN></FONT></P>
<P><FONT color=#ffffff><SPAN lang=zh-cn> char
xingMing[11];</SPAN></FONT></P>
<P><FONT color=#ffffff><SPAN lang=zh-cn> int
shenGao;</SPAN></FONT></P>
<P><FONT color=#ffffff><SPAN lang=zh-cn> float
tiZhou;</SPAN></FONT></P>
<P><FONT color=#ffffff><SPAN lang=zh-cn>};</SPAN></FONT></P></TD>
<TD width="53%"><FONT color=#ffffff><SPAN lang=zh-cn>class
CBaoBao</SPAN></FONT>
<P><FONT color=#ffffff><SPAN lang=zh-cn>{</SPAN></FONT></P>
<P><FONT color=#ffffff><SPAN lang=zh-cn> char
xingMing[11];</SPAN></FONT></P>
<P><FONT color=#ffffff><SPAN lang=zh-cn> int
shenGao;</SPAN></FONT></P>
<P><FONT color=#ffffff><SPAN lang=zh-cn> float
tiZhou;</SPAN></FONT></P>
<P> </P>
<P><FONT color=#ffffff><SPAN lang=zh-cn> void Chi(int
a); //參數可不能用Fan了</SPAN></FONT></P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -