⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 教学--第二十三章 类(一)封装.htm

📁 《白话c++网页版》是一本用浅显易懂的并具有点幽默的语调来讲述c++的高深的内容
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!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: &Euml;&Icirc;&Igrave;&aring;" 
    width="100%" height=210>
      <H2>第二十<SPAN lang=zh-cn>三</SPAN>章&nbsp; <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>&nbsp; </SPAN><A 
      href="http://d2school.com/bcyl/bhcpp/newls/ls23.htm#23.3.1">23.3.1 
      成员数据初始化的疑问</A> </P>
      <P><SPAN lang=zh-cn>&nbsp; </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>&nbsp; </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>&nbsp; </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>&nbsp; </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>&nbsp; </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>&nbsp;&nbsp;&nbsp; char xingMing[11];<SPAN lang=zh-cn> 
      //用字符数组,来存储姓名</SPAN></P>
      <P>&nbsp;&nbsp;&nbsp; int shenGao;<SPAN lang=zh-cn> //身高,整型</SPAN></P>
      <P>&nbsp;&nbsp;&nbsp; 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>&nbsp;&nbsp;&nbsp; char xingMing[11];<SPAN lang=zh-cn> 
      //用字符数组,来存储姓名</SPAN></P>
      <P>&nbsp;&nbsp;&nbsp; int shenGao;<SPAN lang=zh-cn> //身高,整型</SPAN></P>
      <P>&nbsp;&nbsp;&nbsp; float tiZhong;<SPAN lang=zh-cn> //体重,实型</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp;&nbsp; void Chi(Fan fan); 
      //加入“吃”的函数。&nbsp;&nbsp; </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>&nbsp;&nbsp; char 
            xingMing[11];</SPAN></FONT></P>
            <P><FONT color=#ffffff><SPAN lang=zh-cn>&nbsp;&nbsp; int 
            shenGao;</SPAN></FONT></P>
            <P><FONT color=#ffffff><SPAN lang=zh-cn>&nbsp;&nbsp; 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>&nbsp;&nbsp; char 
            xingMing[11];</SPAN></FONT></P>
            <P><FONT color=#ffffff><SPAN lang=zh-cn>&nbsp;&nbsp; int 
            shenGao;</SPAN></FONT></P>
            <P><FONT color=#ffffff><SPAN lang=zh-cn>&nbsp;&nbsp; float 
            tiZhou;</SPAN></FONT></P>
            <P> </P>
            <P><FONT color=#ffffff><SPAN lang=zh-cn>&nbsp;&nbsp; void Chi(int 
            a); //参数可不能用Fan了</SPAN></FONT></P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -