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

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

📁 《白话c++网页版》是一本用浅显易懂的并具有点幽默的语调来讲述c++的高深的内容
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            <P><FONT color=#ffffff><SPAN 
        lang=zh-cn>};</SPAN></FONT></P></TD></TR></TBODY></TABLE></CENTER></DIV>
      <P><BR><SPAN lang=zh-cn>&nbsp;&nbsp; 然后,我们来做个比较:</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>[略]</SPAN></P>
      <P> </P>
      <H1><B><FONT size=4><A name=23.3>23.<SPAN lang=zh-cn>3</SPAN></A> <SPAN 
      lang=zh-cn>类的成员数据</SPAN>与<SPAN lang=zh-cn>成员函数</SPAN></FONT></B></H1>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>成员?长这么大,肯定填写过什么“家庭成员”的样的表格。我们进行的数据定义或函数定义,它们之所以前面有没加个“成员”的修饰,是因为它们都没有一个家,哎,谁不想有个家呢?在C#和Java里,所有数据及函数都必须有个家才可以存在,而在C++里,允许数据或函数可以没有家(不属于某个类);也可以允许有个家(属于某个类)。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>class CBaoBao</SPAN></P>
      <P><SPAN lang=zh-cn>{&nbsp; </SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; //下面就是CBaoCBao类的成员数据:</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; char xingMing[11];</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; int shenGao;</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; float tiZhou;</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; //而这个是CBaoBao类的成员函数:</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; void Chi(int a); </SPAN></P>
      <P><SPAN lang=zh-cn>};</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>类的成员数据和成员函数,都称为类的成员(像是一句废话?)。</SPAN></P>
      <P> </P>
      <H3><SPAN lang=zh-cn><A name=23.3.1>23.3.1</A> 成员数据初始化的疑问</SPAN></H3>
      <P><SPAN lang=zh-cn>我们以前常有这样的代码:</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>int a = 100; //定义一个变量,同时给它赋值为100.</SPAN></P>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>可是,你一定一定要明白了,当我们在定义一个类或一个结构时,我们只是在“<B>组装</B>”一个新的数据类型。而并没有实际定义一个变量,所以C++不允许在定义一个类的内部,对它的成员数据赋值。下面的代码是错误的:</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>//在定义一个类时,试图初始化它的成员数据!不行!</SPAN></P>
      <P><SPAN lang=zh-cn>class CBaoBao</SPAN></P>
      <P><SPAN lang=zh-cn>{</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp;&nbsp; int shenGao = 70; //不行!</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp;&nbsp; ...</SPAN></P>
      <P><SPAN lang=zh-cn>};</SPAN></P>
      <P><SPAN 
      lang=zh-cn>那么,当我们定义某一个类的具体变量时,这个变量里的成员数据初始值是多少?理论上,它们将是随机的值,也就是不能预定的值。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>...</SPAN><SPAN lang=en>&nbsp;</SPAN></P>
      <P><SPAN lang=zh-cn>CBaoCBao baobao1; </SPAN></P>
      <P><SPAN lang=zh-cn>...</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>定义完baobao1之后,bao1bao1里的shenGao是多少?不知道!</SPAN></P>
      <P><SPAN lang=zh-cn>那么,如何给某个类变量的成员数据一个初始的值(即默认的值)?下章我们会讲到。</SPAN></P>
      <P> </P>
      <H3><A name=23.3.2><SPAN lang=zh-cn>23.3</SPAN>.<SPAN 
      lang=zh-cn>2</SPAN></A><SPAN lang=zh-cn> 成员函数的实现</SPAN></H3>
      <P><SPAN 
      lang=zh-cn>我们可以在类里头加了函数(声明了类的成员函数),比如在前面的BaoBao类加了函数:Chi(...);可是我们还没有实现这个函数呢。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>一个类的成员函数一般在类的外部定义,但要注意它和普通函数定义时的区别。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>//定义,或称为实现CBaoBao的成员函数:Chi:</SPAN></P>
      <P><SPAN lang=zh-cn>void <B>CBaoBao::</B>Chi(int a) 
      //和普通函数区别:类的成员函数定义时,必须加上类名和::</SPAN></P>
      <P><SPAN lang=zh-cn>{</SPAN></P>
      <P><SPAN lang=zh-cn>&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>class CBaoBao</SPAN></P>
      <P><SPAN lang=zh-cn>{&nbsp; </SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; //下面就是CBaoCBao类的成员数据:</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; char xingMing[11];</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; int shenGao;</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; float tiZhou;</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; //而这个是CBaoBao类的成员函数:</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; //并且直接定义:</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; void Chi(int a) //没有分号</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; {</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //函数体...</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; } //没有分号了</SPAN></P>
      <P><SPAN lang=zh-cn>};</SPAN></P>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>不过,直接在类体内的定义的成员函数,将被默认当作inline(内联)函数。关于内联函数,大家可以找一找前面函数章节。</SPAN></P>
      <H1><B><FONT size=4><A name=23.4>23.4</A> </FONT></B><FONT size=4><B><SPAN 
      lang=zh-cn>封</SPAN>装</B></FONT></H1>
      <P><SPAN 
      lang=zh-cn>从有了“类”开始,C++的世界越来越有趣了。前面说类就像一个家,家里有成员(数据或函数),现在,我们还要讲“访问”类的成员……想像有个类叫“美女”。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>class MeiNu //美女类!</SPAN></P>
      <P><SPAN lang=zh-cn>{</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; int XW;&nbsp; //胸围</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; int YW;&nbsp; //我就不说了噢 :)</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; int TW;&nbsp; //我还是不说了噢 :))</SPAN></P>
      <P><SPAN lang=zh-cn>};</SPAN></P>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>我看到部分学员在想入非非了,这可不行。请打开CB,新建一个“控制台/Console”工程。然后把上面新建工程后默认出现的Unit1.cpp中的main()函数之上。(偷偷说一声,后面的章节里,我们学习C++的也可开始慢慢有在Windows下的工程了!因为我们学习类了嘛,任督二脉都打通了,当然得来点更有意思的……)</SPAN></P>
      <P> </P>
      <P align=center><IMG height=250 src="教学--第二十三章 类(一)封装.files/ls23.h2.gif" 
      width=343 border=0></P>
      <P align=center><SPAN lang=zh-cn>(在Unit1.cpp里加入MeiNu类)</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>然后</SPAN>……<SPAN 
      lang=zh-cn>当然是定义一个美女了!我们就在main函数里定义了,我不贴图了,你们对着课程,自己往CB里添代码。</SPAN></P>
      <P> </P>
      <TABLE id=AutoNumber2 cellSpacing=0 cellPadding=0 width="100%" 
      bgColor=#008080 border=1>
        <TBODY>
        <TR>
          <TD width="100%"><FONT color=#ffffff>int main(int argc, char* 
            argv[]) </FONT>
            <P><FONT color=#ffffff>{ </FONT></P>
            <P><FONT color=#ffffff><SPAN lang=zh-cn>&nbsp;&nbsp; 
            <B>&nbsp;</B></SPAN><B>MeiNu zhaoWei;<SPAN lang=zh-cn> 
            //美女赵?</SPAN></B><BR><SPAN 
            lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></FONT></P>
            <P><FONT color=#ffffff><SPAN lang=zh-cn>&nbsp;&nbsp;&nbsp; 
            </SPAN>return 0; </FONT></P>
            <P><FONT color=#ffffff>} </FONT></P></TD></TR></TBODY></TABLE>
      <P> </P>
      <P><SPAN lang=zh-cn>现</SPAN>在<SPAN 
      lang=zh-cn>开始有些为难了,赵薇的三围是多少?甭说她了,一般地说,通常美女的三围是多少啊?上网查一下吧……</SPAN></P>
      <P><SPAN lang=zh-cn>哈哈,终于找到了,不过是三版女朗乔丹的。郁闷中……88了赵薇。现在代码为:</SPAN></P>
      <TABLE id=AutoNumber3 cellSpacing=0 cellPadding=0 width="100%" 
      bgColor=#008080 border=1>
        <TBODY>
        <TR>
          <TD width="100%"><FONT color=#ffffff><SPAN 
            lang=zh-cn>...</SPAN></FONT>
            <P><FONT color=#ffffff><SPAN lang=zh-cn>MeiNu <FONT 
            size=-1>j</FONT></SPAN><FONT size=-1>ordan<SPAN lang=zh-cn>; //now 
            is 乔丹!</SPAN></FONT></FONT></P>
            <P> </P>
            <P><SPAN lang=zh-cn><FONT color=#ffffff size=-1>jordan.XW = 
            34;</FONT></SPAN></P>
            <P><SPAN lang=zh-cn><FONT color=#ffffff size=-1>jordan.YW = 
            24;</FONT></SPAN></P>
            <P><SPAN lang=zh-cn><FONT color=#ffffff size=-1>jordan.TW = 
            34;</FONT></SPAN></P>
            <P><FONT color=#ffffff><SPAN 
        lang=zh-cn>...</SPAN></FONT></P></TD></TR></TBODY></TABLE>
      <P> </P>
      <P><SPAN lang=zh-cn><FONT 
      size=-1>按Ctrl+Shift+S,保存Unit1.cpp和工程,工程我就命令为MeiNuPrj.bpr了。</FONT></SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn><FONT size=-1>然后按Ctrl + 
      F9.试图编译一下!可是,可是,编译好像说:对不起,乔丹的胸围无法访问……(如图)</FONT></SPAN></P>
      <P align=center><IMG height=54 src="教学--第二十三章 类(一)封装.files/ls23.h3.gif" 
      width=359 border=0></P>
      <P align=center><SPAN lang=zh-cn>(not accessible 就是 “无法接触到”,或“无法访问” 
      )</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>我们想给乔丹设置一下三围,可是C++编译器竟义正辞严地拒绝了!这是怎么回事?</SPAN></P>
      <P><SPAN 
      lang=zh-cn>因为,类/class对它的成员(数据或函数),有“保护”机制。不允许“外人”随便访问到它的成员。<B>这也就是传说中“面向对象”的三大基石之一“封装性”</B>。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>[略]</SPAN></P>
      <H3><B><FONT size=4><A name=23.4.1>23.4<SPAN lang=zh-cn>.1</SPAN></A> 
      <SPAN lang=zh-cn>私有成员/private member</SPAN></FONT></B></H3>
      <P><SPAN lang=zh-cn>[略]</SPAN></P>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>从private:开始,后面本类的成员数据或函数,都将是私有的,除非我们又加了一个新的访问等级限制关键字。</SPAN></P>
      <H3><B><FONT size=4><A name=23.4.2>23.<SPAN lang=zh-cn>4.2</SPAN></A> 
      保护成员/protected member</FONT></B></H3>
      <P><SPAN 
      lang=zh-cn>保护成员也不能在类的外部直接访问,但可以在该类的子类(或称为派生类)中访问。所谓子类或派生类,我们后面的章节才会讲到。大致的意思,先不妨认为是,你们家的东西,外人不能用,但你儿子或儿媳(他有自己的家)可以用……这是不合适的比喻。只是为了感性理解一下私有和保护的一种区别。</SPAN></P>
      <H3><B><FONT size=4><A name=23.4.3>23.<SPAN lang=zh-cn>4.3</SPAN></A> 
      公有成员/public member</FONT></B></H3>
      <P><SPAN lang=zh-cn>[略]</SPAN></P>
      <H3><FONT size=4><A name=23.4.4><B>2</B></FONT><FONT 
      size=4><B>3.4.4</B></A><B> “封装”的作用</B></FONT></H3>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>说着说着,这问题就来了。为什么要用private或protected来保护类的成员啊?大家都是公有的,都可以直接访问,多方便啊?这问题如果反过来问,就是面向对象三大基石之一“封装”有什么好处?</SPAN></P>
      <P><SPAN lang=zh-cn>封装的好处,两点,并且两点相辅相成。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>[略]</SPAN></P>
      <P> </P>
      <H3><SPAN lang=zh-cn><A name=23.5>23.5</A> 作</SPAN><B><FONT 
      size=4>业</FONT></B></H3>
      <P><SPAN lang=zh-cn>[略]</SPAN></P>
      <P> </P></TD></TR>
  <TR>
    <TD 
    style="FONT-SIZE: 10pt; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; FONT-FAMILY: &Euml;&Icirc;&Igrave;&aring;" 
    width="100%" height=37> </TD></TR></TBODY></TABLE></CENTER></BODY></HTML>

⌨️ 快捷键说明

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