﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-宝杉的博客-随笔分类-C++</title><link>http://www.cppblog.com/robinson119/category/4834.html</link><description>UNIX/LINUX;ACE;SNMP;C++</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 04:01:04 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 04:01:04 GMT</pubDate><ttl>60</ttl><item><title>&lt;转&gt;dll详细介绍</title><link>http://www.cppblog.com/robinson119/archive/2007/09/04/31539.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Tue, 04 Sep 2007 02:46:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/09/04/31539.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/31539.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/09/04/31539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/31539.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/31539.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比...&nbsp;&nbsp;<a href='http://www.cppblog.com/robinson119/archive/2007/09/04/31539.html'>阅读全文</a><img src ="http://www.cppblog.com/robinson119/aggbug/31539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-09-04 10:46 <a href="http://www.cppblog.com/robinson119/archive/2007/09/04/31539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>8-28模板</title><link>http://www.cppblog.com/robinson119/archive/2007/08/30/31197.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Thu, 30 Aug 2007 02:47:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/30/31197.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/31197.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/30/31197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/31197.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/31197.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板是重用机制的一种工具，可以实现类型参数化，即把类型定义为参数，实现代码可重用性。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">F</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：宏定义也可以实现重用，为什么不使用宏？</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">Q</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：宏避开</span><span lang=EN-US style="FONT-SIZE: 9pt">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型检查机制，两个不同类型参数之间的比较将会导致错误。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板，模板函数，模板类和对象之间的关系。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><v:group id=_x0000_s1026 style="MARGIN-TOP: 7.95pt; Z-INDEX: 1; LEFT: 0px; MARGIN-LEFT: 81pt; WIDTH: 3in; POSITION: absolute; HEIGHT: 130.05pt; TEXT-ALIGN: left" coordsize="4320,2601" coordorigin="3420,3783"><v:shapetype id=_x0000_t202 coordsize="21600,21600" path="m,l,21600r21600,l21600,xe" o:spt="202"><v:stroke joinstyle="miter"></v:stroke><v:path o:connecttype="rect" gradientshapeok="t"></v:path></v:shapetype><v:shape id=_x0000_s1027 style="LEFT: 4317px; WIDTH: 2520px; POSITION: absolute; TOP: 3783px; HEIGHT: 780px" filled="f" type="#_x0000_t202"><v:textbox style="mso-next-textbox: #_x0000_s1027">
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent">
            <div>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（函数模板和类模板）</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</v:textbox></v:shape><v:shape id=_x0000_s1028 style="LEFT: 3420px; WIDTH: 1260px; POSITION: absolute; TOP: 5028px; HEIGHT: 468px" filled="f" type="#_x0000_t202"><v:textbox style="mso-next-textbox: #_x0000_s1028">
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent">
            <div>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板函数</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</v:textbox></v:shape><v:shape id=_x0000_s1029 style="LEFT: 6660px; WIDTH: 1080px; POSITION: absolute; TOP: 5028px; HEIGHT: 468px" filled="f" type="#_x0000_t202"><v:textbox style="mso-next-textbox: #_x0000_s1029">
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent">
            <div>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板类</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</v:textbox></v:shape><v:shape id=_x0000_s1030 style="LEFT: 6825px; WIDTH: 900px; POSITION: absolute; TOP: 5916px; HEIGHT: 468px" filled="f" type="#_x0000_t202"><v:textbox style="mso-next-textbox: #_x0000_s1030">
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent">
            <div>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</v:textbox></v:shape><v:line id=_x0000_s1031 style="POSITION: absolute; flip: x" to="4500,5027" from="3960,4559"><v:stroke endarrow="block"></v:stroke></v:line><v:line id=_x0000_s1032 style="POSITION: absolute" to="7200,5028" from="6480,4560"><v:stroke endarrow="block"></v:stroke></v:line><v:line id=_x0000_s1033 style="POSITION: absolute" to="7200,5964" from="7200,5496"><v:stroke endarrow="block"></v:stroke></v:line></v:group><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">箭头代表实例化</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;<v:group id=_x0000_s1026 style="MARGIN-TOP: 177.9pt; Z-INDEX: 1; LEFT: 0px; MARGIN-LEFT: 163.5pt; WIDTH: 3in; POSITION: absolute; HEIGHT: 130.05pt; TEXT-ALIGN: left" coordsize="4320,2601" coordorigin="3420,3783"><font size=3><font face="宋体, MS Song"> <v:shapetype id=_x0000_t202 coordsize="21600,21600" path="m,l,21600r21600,l21600,xe" o:spt="202"><v:stroke joinstyle="miter"></v:stroke><v:path o:connecttype="rect" gradientshapeok="t"></v:path></v:shapetype></font></font><v:shape id=_x0000_s1027 style="LEFT: 4317px; WIDTH: 2520px; POSITION: absolute; TOP: 3783px; HEIGHT: 780px" filled="f" type="#_x0000_t202"><v:textbox style="mso-next-textbox: #_x0000_s1027">
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent">
            <div>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（函数模板和类模板）</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</v:textbox></v:shape><v:shape id=_x0000_s1028 style="LEFT: 3420px; WIDTH: 1260px; POSITION: absolute; TOP: 5028px; HEIGHT: 468px" filled="f" type="#_x0000_t202"><v:textbox style="mso-next-textbox: #_x0000_s1028">
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent">
            <div>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板函数</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</v:textbox></v:shape><v:shape id=_x0000_s1029 style="LEFT: 6660px; WIDTH: 1080px; POSITION: absolute; TOP: 5028px; HEIGHT: 468px" filled="f" type="#_x0000_t202"><v:textbox style="mso-next-textbox: #_x0000_s1029">
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent">
            <div>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板类</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</v:textbox></v:shape><v:shape id=_x0000_s1030 style="LEFT: 6825px; WIDTH: 900px; POSITION: absolute; TOP: 5916px; HEIGHT: 468px" filled="f" type="#_x0000_t202"><v:textbox style="mso-next-textbox: #_x0000_s1030">
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #ffffff; BORDER-TOP: #ffffff; BORDER-LEFT: #ffffff; BORDER-BOTTOM: #ffffff; BACKGROUND-COLOR: transparent">
            <div>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</v:textbox></v:shape><v:line id=_x0000_s1031 style="POSITION: absolute; flip: x" to="4500,5027" from="3960,4559"><v:stroke endarrow="block"></v:stroke></v:line><v:line id=_x0000_s1032 style="POSITION: absolute" to="7200,5028" from="6480,4560"><v:stroke endarrow="block"></v:stroke></v:line><v:line id=_x0000_s1033 style="POSITION: absolute" to="7200,5964" from="7200,5496"><v:stroke endarrow="block"></v:stroke></v:line></v:group><img height=187 alt="" src="http://www.cppblog.com/images/cppblog_com/robinson119/template.jpg" width=307 border=0></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><a href="http://www.cppblog.com/robinson119/admin/C++exams/template_max"><u><font color=#0000ff>C++exams\template_max</font></u></a><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板形参将</span><span lang=EN-US style="FONT-SIZE: 9pt">T</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例化的参数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数模板是一个不完全的函数，首先需要将模板形参</span><span lang=EN-US style="FONT-SIZE: 9pt">T</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例化为确定的类型。这个类型可以是预定义的，也可以是用户自定义。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板函数的异常</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">1 </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先调用顺序遵循什么约定？</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US style="FONT-SIZE: 9pt">1</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）寻找类型完全匹配的函数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US style="FONT-SIZE: 9pt">2</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）寻找函数模板，实例化后，产生匹配的模板函数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US style="FONT-SIZE: 9pt">3</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）若（</span><span lang=EN-US style="FONT-SIZE: 9pt">1</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）（</span><span lang=EN-US style="FONT-SIZE: 9pt">2</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）失败，尝试低一级的对函数重载的方法。例如，通过类型转换。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US style="FONT-SIZE: 9pt">4</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）（</span><span lang=EN-US style="FONT-SIZE: 9pt">1</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）（</span><span lang=EN-US style="FONT-SIZE: 9pt">2</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）（</span><span lang=EN-US style="FONT-SIZE: 9pt">3</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）都为匹配，则是一个错误。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">2 </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先了解了这样的约定，就很容易理解以下：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用非模板函数重载函数模板，只声明非模板类函数的原型，不给出函数体，而函数体借用函数模板的函数体。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">template &lt;class T&gt;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">T max( T x, T y)<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return( x &gt; y )? x : y;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-shading: white; mso-pattern: gray-15 auto">int max( int, int);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">//int max </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重载了函数模板的函数体；</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">int i;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">char c;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">max</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US style="FONT-SIZE: 9pt">i, c</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span><span lang=EN-US style="FONT-SIZE: 9pt">;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">3 </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义一个完整的有函数体的非模板函数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比如：</span><span lang=EN-US style="FONT-SIZE: 9pt">max(char, char)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，上面的函数模板不能比较比一个字符更长的字符串了。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以，像一般的重载函数一样定义。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">char *max( char *x, char *y )<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return ( strcmp(x, y) &gt; 0 ) ? x </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US style="FONT-SIZE: 9pt">y</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">char * max</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重载了函数模板，当调用为：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">max ( &#8220;abcd&#8221;, &#8220;efgh&#8221; );<span style="mso-tab-count: 1"> </span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将执行此函数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/31197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-30 10:47 <a href="http://www.cppblog.com/robinson119/archive/2007/08/30/31197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>08-22</title><link>http://www.cppblog.com/robinson119/archive/2007/08/30/31194.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Thu, 30 Aug 2007 02:33:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/30/31194.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/31194.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/30/31194.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/31194.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/31194.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果不想让别人使用编译器编写构造拷贝和赋值函数，可以声明为私有：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>class A<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span><span lang=EN-US style="FONT-SIZE: 9pt; mso-ascii-font-family: 宋体">&#8230;</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp; </span>private:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>A(const A &amp;a);<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">私有的拷贝构造函数<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>A &amp; operate =(const A &amp;a);<span style="mso-tab-count: 1">&nbsp; </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">私有的赋值函数<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>};<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果有人试图编写如下程序：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>A<span style="mso-spacerun: yes">&nbsp; </span>b(a);<span style="mso-tab-count: 1"> </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">调用了私有的拷贝构造函数<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>b = a;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">调用了私有的赋值函数<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译器将指出错误，因为外界不可以操作</span><span lang=EN-US style="FONT-SIZE: 9pt">A</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的私有函数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是怎样才能使用构造拷贝和赋值函数呢？</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虚拟函数使用：</span><span lang=EN-US style="FONT-SIZE: 9pt"><a href="http://www.cppblog.com/robinson119/admin/C++exams/destructor"><u><font color=#0000ff>C++exams\destructor</font></u></a><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在编写派生类的赋值函数时，注意不要忘记对基类的数据成员重新赋值。例如：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><a href="http://www.cppblog.com/robinson119/admin/C++exams/base_operator"><u><font color=#0000ff>C++exams\base_operator</font></u></a><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/31194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-30 10:33 <a href="http://www.cppblog.com/robinson119/archive/2007/08/30/31194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>08-14 String类</title><link>http://www.cppblog.com/robinson119/archive/2007/08/30/31193.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Thu, 30 Aug 2007 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/30/31193.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/31193.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/30/31193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/31193.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/31193.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 定义：&nbsp;&nbsp;&nbsp;&nbsp; class String&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; public:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(const char *str = NULL);&nbsp; ...&nbsp;&nbsp;<a href='http://www.cppblog.com/robinson119/archive/2007/08/30/31193.html'>阅读全文</a><img src ="http://www.cppblog.com/robinson119/aggbug/31193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-30 10:31 <a href="http://www.cppblog.com/robinson119/archive/2007/08/30/31193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>08-13复习</title><link>http://www.cppblog.com/robinson119/archive/2007/08/30/31192.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Thu, 30 Aug 2007 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/30/31192.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/31192.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/30/31192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/31192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/31192.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">&nbsp; </p>
<p style="FONT-SIZE: 10pt">析构函数</p>
<p style="FONT-SIZE: 10pt">构造函数初始化表：构造函数特殊的初始化方式&#8220;初始化表达式表&#8221;（简称初始化表）。</p>
<p style="FONT-SIZE: 10pt">初始化表位于函数参数表之后，却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。</p>
<p style="FONT-SIZE: 10pt">规则</p>
<p style="FONT-SIZE: 10pt">u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果类存在继承关系，派生类必须在其初始化表里调用基类的构造函数。</p>
<p style="FONT-SIZE: 10pt">u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类的const常量只能在初始化表里被初始化，因为它不能在函数体内用赋值的方式来初始化。</p>
<p style="FONT-SIZE: 10pt">u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式，这两种方式的效率不完全相同。</p>
<p style="FONT-SIZE: 10pt">效率</p>
<p style="FONT-SIZE: 10pt">1 内部成员：</p>
<p style="FONT-SIZE: 10pt">初始化表和函数体内赋值都可以，但效率不完全相同，但后者更为清晰直观。</p>
<p style="FONT-SIZE: 10pt">例子：</p>
<p style="FONT-SIZE: 10pt">class F</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;public:</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; F(int x, int y);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 构造函数</p>
<p style="FONT-SIZE: 10pt">&nbsp;private:</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; int m_x, m_y;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; int m_i, m_j;</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt" vAlign=top width=277>
            <p style="FONT-SIZE: 10pt">F::F(int x, int y)</p>
            <p style="FONT-SIZE: 10pt">&nbsp;: m_x(x), m_y(y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
            <p style="FONT-SIZE: 10pt">{ </p>
            <p style="FONT-SIZE: 10pt">&nbsp;&nbsp; m_i = 0; </p>
            <p style="FONT-SIZE: 10pt">&nbsp;&nbsp; m_j = 0;</p>
            <p style="FONT-SIZE: 10pt">}</p>
            </td>
            <td style="FONT-SIZE: 10pt" vAlign=top width=284>
            <p style="FONT-SIZE: 10pt">F::F(int x, int y)</p>
            <p style="FONT-SIZE: 10pt">{ </p>
            <p style="FONT-SIZE: 10pt">&nbsp;&nbsp; m_x = x;</p>
            <p style="FONT-SIZE: 10pt">&nbsp;&nbsp; m_y = y;</p>
            <p style="FONT-SIZE: 10pt">&nbsp;&nbsp; m_i = 0; </p>
            <p style="FONT-SIZE: 10pt">&nbsp;&nbsp; m_j = 0;</p>
            <p style="FONT-SIZE: 10pt">}</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="FONT-SIZE: 10pt">示例9-2(c) 数据成员在初始化表中被初始化&nbsp;&nbsp;&nbsp;&nbsp; 示例9-2(d) 数据成员在函数体内被初始化</p>
<p style="FONT-SIZE: 10pt">两种方式效率区别不大。</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">2 非内部成员：</p>
<p style="FONT-SIZE: 10pt">只能用初始化表，提高效率。</p>
<p style="FONT-SIZE: 10pt">例子：</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; class A</p>
<p style="FONT-SIZE: 10pt">{&#8230;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; A(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 无参数构造函数</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; A(const A &amp;other);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 拷贝构造函数</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; A &amp; operate =( const A &amp;other); // 赋值函数</p>
<p style="FONT-SIZE: 10pt">}；</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; class B</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; {</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; &nbsp;public:</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B(const A &amp;a);&nbsp;// B的构造函数</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; &nbsp;private:&nbsp;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;m_a;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 成员对象</p>
<p style="FONT-SIZE: 10pt">};</p>
<p style="FONT-SIZE: 10pt">比较与分析：</p>
<p style="FONT-SIZE: 10pt">
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt" vAlign=top width=277>
            <p style="FONT-SIZE: 10pt">B::B(const A &amp;a)</p>
            <p style="FONT-SIZE: 10pt">&nbsp;: m_a(a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
            <p style="FONT-SIZE: 10pt">{ </p>
            <p style="FONT-SIZE: 10pt">&nbsp;&nbsp; &#8230; </p>
            <p style="FONT-SIZE: 10pt">}</p>
            </td>
            <td style="FONT-SIZE: 10pt" vAlign=top width=284>
            <p style="FONT-SIZE: 10pt">B::B(const A &amp;a)</p>
            <p style="FONT-SIZE: 10pt">{</p>
            <p style="FONT-SIZE: 10pt">m_a = a;</p>
            <p style="FONT-SIZE: 10pt">&#8230;</p>
            <p style="FONT-SIZE: 10pt">}</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="FONT-SIZE: 10pt">1 B类构造函数的初始化里，调用了A类的拷贝构造函数。</p>
<p style="FONT-SIZE: 10pt">2 B类构造初始化里，隐藏了以下几个步骤：</p>
<p style="FONT-SIZE: 10pt">先创建了a对象，调用了A类的无参数构造函数；</p>
<p style="FONT-SIZE: 10pt">把a赋值给m_a，调用了A类的赋值函数；</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">深入探讨：</p>
<p style="FONT-SIZE: 10pt">构造和析构的次序？</p>
<p style="FONT-SIZE: 10pt">构造从最深处的基类开始的，先一层层调用基类的构造函数，然后调用成员对象的构造函数。</p>
<p style="FONT-SIZE: 10pt">而析构函数严格按照构造函数相反的次序执行，该次序唯一，以便让编译器自动执行析构函数。</p>
<p style="FONT-SIZE: 10pt">特别之处是，成员对象初始化次序不受构造函数初始化表次序影响，由在类中声明的次序决定。而类声明是唯一的，构造函数却可能有多个，所以有多个不同次序函数初始化表。如果按照构造函数的次序构造，那么解析函数不能得到唯一的逆序。</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/31192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-30 10:28 <a href="http://www.cppblog.com/robinson119/archive/2007/08/30/31192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>08-10 内联函数</title><link>http://www.cppblog.com/robinson119/archive/2007/08/13/29886.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Mon, 13 Aug 2007 02:24:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/13/29886.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29886.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/13/29886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29886.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29886.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内联函数</span></strong><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：既增加安全性，又可以调用类的数据成员。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">故</span><span lang=EN-US style="FONT-SIZE: 9pt">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，用内联取代所有宏，但在</span><span lang=EN-US style="FONT-SIZE: 9pt">Debug</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本中，</span><span lang=EN-US style="FONT-SIZE: 9pt">assert</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是例外。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">assert</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不产生任何副作用，调用函数会引起内存、代码的变动，所以</span><span lang=EN-US style="FONT-SIZE: 9pt">assert</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是宏。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内联格式：</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>void Foo(int x, int y); <span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>inline void Foo(int x, int y)<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>// inline</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">与函数定义体放在一起<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&#8230;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于实现的关键字，而非用于声明的关键字。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在类中的规范格式：</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">class A<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">public:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>void Foo(int x, int y)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">；<span lang=EN-US> <o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">定义文件<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>inline void A::Foo(int x, int y)<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&#8230;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么情况不适合使用内联？</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">1 </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内联函数代码较长，导致内存消耗较高。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">2 </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内联函数包括循环，执行内联函数代码比调用函数的开销大。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">F</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：为什么构造和解析函数不使用内联？</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">Q</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：因为析构函数可能&#8220;隐藏&#8221;一些行为，例如执行基类或成员对象的析构过程。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有时候编译器会自动取消一些不值得的内联，所以在声明时不写</span><span lang=EN-US style="FONT-SIZE: 9pt">inline</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是合理的。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-13 10:24 <a href="http://www.cppblog.com/robinson119/archive/2007/08/13/29886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>08-09 缺省值</title><link>http://www.cppblog.com/robinson119/archive/2007/08/13/29885.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Mon, 13 Aug 2007 02:21:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/13/29885.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29885.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/13/29885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29885.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺省值</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提高程序易用性，避免每次调用函数参数都相同的情况。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-border-alt: solid windowtext .5pt">缺省值只能出现在函数声明中，不能在函数定义中。</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个原因：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一是函数的实现（定义）本来就与参数是否有缺省值无关，所以没有必要让缺省值出现在函数的定义体中。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二是参数的缺省值可能会改动，显然修改函数的声明比修改函数的定义要方便。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-border-alt: solid windowtext .5pt">规则：参数从后向前缺省</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">正确的示例如下：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 20.75pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void Foo(int x, int y=0, int z=0);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">错误的示例如下：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 20.75pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void Foo(int x=0, int y, int z=0);<span style="mso-tab-count: 1">&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-border-alt: solid windowtext .5pt">但要避免二义性</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><a href="http://www.cppblog.com/robinson119/admin/C++exams/default_para"><u><font color=#0000ff>C++exams\default_para</font></u></a><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运算符重载及其规则</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运算符即可定义为成员函数，也可定义为全局函数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规则如下：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<table class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext; mso-table-layout-alt: fixed" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 182.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" vAlign=top width=243>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">运算符<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 114.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=152>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">规则<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 11.4pt; mso-yfti-irow: 1">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 182.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 11.4pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=243>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">所有的一元运算符<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 114.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 11.4pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=152>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">建议重载为成员函数<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.2pt; mso-yfti-irow: 2">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 182.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.2pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=243>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">= () [] -&gt;<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 114.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.2pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=152>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">只能重载为成员函数<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 17.7pt; mso-yfti-irow: 3">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 182.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 17.7pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=243>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">+= -= /= *= &amp;= |= ~= %= &gt;&gt;= &lt;&lt;=<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 114.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 17.7pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=152>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">建议重载为成员函数<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 16.95pt; mso-yfti-irow: 4; mso-yfti-lastrow: yes">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 182.55pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 16.95pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=243>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">所有其它运算符<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 114.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 16.95pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=152>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">建议重载为全局函数<span lang=EN-US><o:p></o:p></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不能重载的运算符</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>1</span>）不能改变<span lang=EN-US>C++</span>内部数据类型（如<span lang=EN-US>int,float</span>等）的运算符。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>2</span>）不能重载<span lang=EN-US>&#8216;.&#8217;</span>，因为<span lang=EN-US>&#8216;.&#8217;</span>在类中对任何成员都有意义，已经成为标准用法。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 22.5pt; TEXT-INDENT: -22.5pt; mso-char-indent-count: -2.5"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>3</span>）不能重载目前<span lang=EN-US>C++</span>运算符集合中没有的符号，如<span lang=EN-US>#,@,$</span>等。原因有两点，一是难以理解，二是难以确定优先级。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>4</span>）对已经存在的运算符进行重载时，不能改变优先级规则，否则将引起混乱。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数内联</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目的：提高执行效率。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">宏</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">Q</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为什么要用？</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">A</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提高执行效率。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">Q</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如何提高？</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">A</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">宏代码本身不是函数，但使用起来象函数。预处理器用复制宏代码的方式代替函数调用，省去了参数压栈、生成汇编语言的</span><span lang=EN-US style="FONT-SIZE: 9pt">CALL</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用、返回参数、执行</span><span lang=EN-US style="FONT-SIZE: 9pt">return</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等过程，从而提高了速度。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">Q</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺点？</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">使用宏代码最大的缺点是容易出错，预处理器在复制宏代码时常常产生意想不到的边际效应。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">#define MAX(a, b)<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(a) &gt; (b) ? (a) : (b)<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">语句<span lang=EN-US> <o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">result = MAX(i, j) + 2 ;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">将被预处理器解释为<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">result = (i) &gt; (j) ? (i) : (j) + 2 ;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: 宋体; mso-border-alt: solid windowtext .5pt">由于运算符<span lang=EN-US>&#8216;+&#8217;</span>比运算符<span lang=EN-US>&#8216;:&#8217;</span>的优先级高，所以上述语句并不等价于期望的<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">result = ( (i) &gt; (j) ? (i) : (j) ) + 2 ;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">如果把宏代码改写为<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">#define MAX(a, b)<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>( (a) &gt; (b) ? (a) : (b) )<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">则可以解决由优先级引起的错误。但是即使使用修改后的宏代码也不是万无一失的，例如语句<span lang=EN-US style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt">result = MAX(i++, j);<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">将被预处理器解释为<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">result = (i++) &gt; (j) ? (i++) : (j);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">对于<span lang=EN-US>C++ </span>而言，使用宏代码还有另一种缺点：<span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt">无法操作类的私有数据成员</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-13 10:21 <a href="http://www.cppblog.com/robinson119/archive/2007/08/13/29885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>08-08 隐藏</title><link>http://www.cppblog.com/robinson119/archive/2007/08/13/29883.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Mon, 13 Aug 2007 02:16:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/13/29883.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29883.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/13/29883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29883.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29883.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">隐藏规则：</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&#8220;隐藏&#8221;是指派生类的函数屏蔽了与其同名的基类函数，规则如下：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>1</span>）如果派生类的函数与基类的函数同名，但是<u style="text-underline: thick">参数不同</u>。此时，不论有无<span lang=EN-US>virtual</span>关键字，基类的函数将被隐藏（注意别与重载混淆）。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>2</span>）如果派生类的函数与基类的函数同名，并且<u style="text-underline: thick">参数也相同</u>，但是基类函数没有<span lang=EN-US>virtual</span>关键字。此时，基类的函数被隐藏（注意别与覆盖混淆）。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">回顾</span></strong><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">静态多态性：函数重载；运算符重载；</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态多态性：继承；虚函数；</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述例子之所以使用指针目的是：表达一种动态性质，即当指针指向不同对象可以调用不同方法。但事实上不能达到这样的效果。虽然可以强制指针的类型转换（（</span><span lang=EN-US style="FONT-SIZE: 9pt">derived *</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span><span lang=EN-US style="FONT-SIZE: 9pt">p-&gt;g();</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），或者直接调用指向派生类的指针，但是只要将成员函数声明为</span><span lang=EN-US style="FONT-SIZE: 9pt">virtual</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就能起到这样的作用。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">隐藏</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不同指针指向同一地址，那么指针的类型决定调用方法，还是指针指向的对象？</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例子：</span><span lang=EN-US style="FONT-SIZE: 9pt"><a href="http://www.cppblog.com/robinson119/admin/C++exams/hide"><u><font color=#0000ff>C++exams\hide</font></u></a><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以看出，</span><span lang=EN-US style="FONT-SIZE: 9pt">virtual</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数可以实现不同类型的指针指向不同对象，调用不同的方法。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><u style="text-underline: wave"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是说，当父类对象和子类对象同时存在，且调用父子对象的同名方法时，只能用虚拟函数实现。</span></u><u style="text-underline: wave"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></u></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外，提供一种思路：</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果基类与派生类的同名函数参数不同，比如：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<table class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 425.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" vAlign=top width=567>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">class Base<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">{<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 27pt; mso-char-indent-count: 3.0"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">public:<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 20.45pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-para-margin-left: 1.95gd"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void f(int x);<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">};<o:p></o:p></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 425.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=567>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">class Derived : public Base<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">{<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 20.45pt; TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-para-margin-left: 1.95gd"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">public:<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 20.45pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-para-margin-left: 1.95gd"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void f(char *str);<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">};<o:p></o:p></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 425.6pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=567>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void Test(void)<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">{<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 20.45pt; TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-para-margin-left: 1.95gd"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">Derived *pd = new Derived;<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 20.45pt; TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-para-margin-left: 1.95gd"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">pd-&gt;f(10);<span style="mso-tab-count: 1">&nbsp; </span>// error<o:p></o:p></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">}<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基类为</span><span lang=EN-US style="FONT-SIZE: 9pt">int,</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">派生类为</span><span lang=EN-US style="FONT-SIZE: 9pt">string.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果想在派生类中调用基类的方法，即在派生类中添加基类方法的调用。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">class Derived : public Base<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 30.95pt; mso-para-margin-left: 2.95gd"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">public:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 30.95pt; mso-para-margin-left: 2.95gd"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void f(char *str);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 30.95pt; mso-para-margin-left: 2.95gd"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void f(int x) { Base::f(x); }<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">};<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但此做法容易混乱，不宜使用。最好的方法还是用</span><span lang=EN-US style="FONT-SIZE: 9pt">virtual</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针类型</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt"> <span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象类型</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt"> <span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向对象动态的设计，应该是对象类型起到关键作用，而不是指针类型。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-13 10:16 <a href="http://www.cppblog.com/robinson119/archive/2007/08/13/29883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重载与覆盖</title><link>http://www.cppblog.com/robinson119/archive/2007/08/13/29880.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Mon, 13 Aug 2007 02:15:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/13/29880.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29880.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/13/29880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29880.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29880.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重载与覆盖</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: 宋体; mso-border-alt: solid windowtext .5pt">成员函数被重载的特征：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>1</span>）相同的范围（在同一个类中）；<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>2</span>）函数名字相同；<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>3</span>）参数不同；<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>4</span>）<span lang=EN-US>virtual</span>关键字可有可无。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: 宋体; mso-border-alt: solid windowtext .5pt">覆盖是指派生类函数覆盖基类函数，特征是：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>1</span>）不同的范围（分别位于派生类与基类）；<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>2</span>）函数名字相同；<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>3</span>）参数相同；<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">（<span lang=EN-US>4</span>）基类函数必须有<span lang=EN-US>virtual</span>关键字。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例子：</span><span lang=EN-US style="FONT-SIZE: 9pt"><a href="http://www.cppblog.com/robinson119/admin/C++exams/cover"><u><font color=#0000ff>C++exams\cover</font></u></a><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-border-alt: solid windowtext .5pt">指向基类的指针可以指向其共有派生类的对象，但反之不行，另外私有派生类也不行。</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比如：车</span><span style="FONT-SIZE: 9pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是基类，小汽车，马车</span><span style="FONT-SIZE: 9pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等是派生类。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个车类的指针可以指向任何派生类，因为它们都属于车。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而反之，不能说指向马车的指针可以指向车，因为车的概念最大。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-13 10:15 <a href="http://www.cppblog.com/robinson119/archive/2007/08/13/29880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>08-07 重载（overloaded）、内联（inline）、const和virtual</title><link>http://www.cppblog.com/robinson119/archive/2007/08/13/29879.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Mon, 13 Aug 2007 02:14:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/13/29879.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29879.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/13/29879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29879.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29879.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重载（</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt">overloaded</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）、内联（</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt">inline</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）、</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt">const</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt">virtual<o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p>
<table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 27pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 82.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" vAlign=top width=110>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 40.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=54>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重载</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 40.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=54>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内联</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 42pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=56>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 9pt">const<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 47.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=63>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 9pt">virtual<o:p></o:p></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 82.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=110>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全局函数</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 40.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=54>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&#8730;</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 40.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=54>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&#8730;</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 42pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=56>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 47.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=63>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes">
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 82.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=110>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的成员函数</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 40.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=54>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&#8730;</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 40.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=54>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&#8730;</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 42pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=56>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&#8730;</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 47.25pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=63>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">&#8730;</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部标识符</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译器根据参数为每个重载函数创建内部标识符，以便区分忽略返回值与有返回值的重载函数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">连接交换指定符号</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">C</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译过的函数，经过编译器标识后与</span><span lang=EN-US style="FONT-SIZE: 9pt">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的表示风格不同。所以</span><span lang=EN-US style="FONT-SIZE: 9pt">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不能直接调用</span><span lang=EN-US style="FONT-SIZE: 9pt">C</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译出的函数。</span><span lang=EN-US style="FONT-SIZE: 9pt">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供</span><span lang=EN-US style="FONT-SIZE: 9pt">extern &#8220;C&#8221;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">extern &#8220;C&#8221;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>void foo(int x, int y);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>&#8230; // </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">其它函数<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者写成</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">extern &#8220;C&#8221;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>#include &#8220;myheader.h&#8221;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>&#8230; // </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">其它<span lang=EN-US>C</span>头文件<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 0.55pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全局函数与成员函数同名</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全局函数与成员函数同名不算重载，因为函数作用域不同。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了区别，调用全局函数时，注意格式：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-border-alt: solid windowtext .5pt">：：函数名（参数）；</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">隐式类型转换导致重载函数产生二义性</span></strong><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">隐式类型转换：数字本身没有类型，把数字当作参数，自动进行类型转换。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">例如：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void output( int x);<span style="mso-tab-count: 1">&nbsp;&nbsp; </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">函数声明<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">void output( float x);<span style="mso-tab-count: 1"> </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">函数声明<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">output(0.5)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">将产生编译错误，因为编译器不知道该将<span lang=EN-US>0.5</span>转换成<span lang=EN-US>int</span>还是<span lang=EN-US>float</span>类型的参数。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正确写法：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>output(int(0.5));<span style="mso-tab-count: 1">&nbsp; </span>// output int 0<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.8pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>output(float(0.5));<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>// output float 0.5<o:p></o:p></span></p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-13 10:14 <a href="http://www.cppblog.com/robinson119/archive/2007/08/13/29879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>08-06 free和delete</title><link>http://www.cppblog.com/robinson119/archive/2007/08/13/29878.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Mon, 13 Aug 2007 02:12:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/13/29878.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29878.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/13/29878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29878.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29878.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt">free</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt">delete<o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只是把指针所指的内存给释放掉，但并没有把指针本身干掉。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意：</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US style="FONT-SIZE: 9pt">1</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）指针消亡了，并不表示它所指的内存会被自动释放。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US style="FONT-SIZE: 9pt">2</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）内存被释放了，并不表示指针会消亡或者成了</span><span lang=EN-US style="FONT-SIZE: 9pt">NULL</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">malloc</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US style="FONT-SIZE: 9pt">free</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：无法满足动态对象的要求。对象在创建同时进行构造，消亡同时析构。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">malloc free</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是库函数，不是运算符，不受编译器控制。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">new</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US style="FONT-SIZE: 9pt">delete</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：不是库函数，能动态内存分配和清理内存。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存耗尽</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存耗尽时</span><span lang=EN-US style="FONT-SIZE: 9pt">new</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US style="FONT-SIZE: 9pt">malloc</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</span><span lang=EN-US style="FONT-SIZE: 9pt">NULL</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。但在</span><span lang=EN-US style="FONT-SIZE: 9pt">WIN32</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下，使用虚拟内存，不会耗尽的。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理内存耗尽大概有两种。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoDate style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt">A<span style="mso-spacerun: yes">&nbsp; </span>*a = new A;</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">1<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一处内存申请</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">if(a == NULL)<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>return;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">2<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">如果有多处申请内存，则<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">if(a == NULL)<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; </span><span lang=EN-US style="FONT-SIZE: 9pt; mso-ascii-font-family: 宋体">&#8220;</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">Memory Exhausted</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-ascii-font-family: 宋体">&#8221;</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"> &lt;&lt; endl;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>exit(1);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt">new</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt">delete</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用要点</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">1 new</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内置了</span><span lang=EN-US style="FONT-SIZE: 9pt">sizeof</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、类型转换和类型安全检查功能。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">2 new</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在创建非内部数据类型的动态对象的同时完成了初始化工作。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">3 </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象有多个构造函数，那么</span><span lang=EN-US style="FONT-SIZE: 9pt">new</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的语句也可以有多种形式。</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如：</span><span lang=EN-US style="FONT-SIZE: 9pt"><a href="http://www.cppblog.com/robinson119/admin/diary%20files/obj.txt"><u><font color=#0000ff>diary files\obj.txt</font></u></a><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">4 </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">如果用<span lang=EN-US>new</span>创建对象数组，那么只能使用对象的无参数构造函数。例如<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>Obj<span style="mso-spacerun: yes">&nbsp; </span>*objects = new Obj[100];<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">创建<span lang=EN-US>100</span>个动态对象<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">不能写成<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>Obj<span style="mso-spacerun: yes">&nbsp; </span>*objects = new Obj[100](1);// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">创建<span lang=EN-US>100</span>个动态对象的同时赋初值<span lang=EN-US>1<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">5</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">在用<span lang=EN-US>delete</span>释放对象数组时，留意不要丢了符号&#8216;<span lang=EN-US>[]</span>&#8217;。例如<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>delete []objects;<span style="mso-tab-count: 1">&nbsp; </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">正确的用法<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">delete objects;<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>// </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">错误的用法<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'">后者相当于<span lang=EN-US>delete objects[0]</span>，漏掉了另外<span lang=EN-US>99</span>个对象。<span lang=EN-US><o:p></o:p></span></span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-13 10:12 <a href="http://www.cppblog.com/robinson119/archive/2007/08/13/29878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指针与数组</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29280.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 05:08:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29280.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29280.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29280.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29280.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">数组要么在静态存储区被创建（如全局数组），要么在栈上被创建。数组名对应着（而不是指向）一块内存，其地址与容量在生命期内保持不变，只有数组的内容可以改变。</p>
<p style="FONT-SIZE: 10pt">指针可以随时指向任意类型的内存块，它的特征是&#8220;可变&#8221;，所以我们常用指针来操作动态内存。指针远比数组灵活，但也更危险。</p>
<p style="FONT-SIZE: 10pt">1 修改内容</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char a[] = "hello";</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[0] = 'X';</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; a &lt;&lt; endl;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *p = "world";&nbsp;&nbsp;&nbsp;&nbsp; // 注意p指向常量字符串</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[0] = 'X';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 编译器不能发现该错误</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; p &lt;&lt; endl;</p>
<img height=145 alt="" src="http://www.cppblog.com/images/cppblog_com/robinson119/err.jpg" width=476 border=0><br>
<p style="FONT-SIZE: 10pt">2 复制与比较</p>
<p style="FONT-SIZE: 10pt">strcpy（new type[strlen（a）+1]），而不能用p = a&nbsp; &nbsp; //把a的地址给了p，而不是a的内容</p>
<p style="FONT-SIZE: 10pt">strcmp（if strcmp（a,p）== 0），而不能用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( a = p) &nbsp; </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 数组&#8230;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char a[] = "hello";</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char b[10];</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(b, a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 不能用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = a;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(strcmp(b, a) == 0)&nbsp;&nbsp;&nbsp;&nbsp; // 不能用&nbsp; if (b == a)</p>
<p style="FONT-SIZE: 10pt">&#8230;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 指针&#8230;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len = strlen(a);</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *p = (char *)malloc(sizeof(char)*(len+1));</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(p,a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 不要用 p = a;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(strcmp(p, a) == 0)&nbsp;&nbsp;&nbsp;&nbsp; // 不要用 if (p == a)</p>
<p style="FONT-SIZE: 10pt">&#8230;</p>
<p style="FONT-SIZE: 10pt">sizeof内存容量计算</p>
<p style="FONT-SIZE: 10pt">1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(p)相当于sizeof(char*)，C++不支持对指针所指内容容量的计算。</p>
<p style="FONT-SIZE: 10pt">char a[] = "hello world";<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; char *p&nbsp; = a;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; cout&lt;&lt; sizeof(a) &lt;&lt; endl;&nbsp;&nbsp; // 12字节<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; cout&lt;&lt; sizeof(p) &lt;&lt; endl;&nbsp;&nbsp; // 4字节</p>
<p style="FONT-SIZE: 10pt">2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数组作为函数参数，退化成同类型指针。</p>
<p style="FONT-SIZE: 10pt">void Func(char a[100])<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; {<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout&lt;&lt; sizeof(a) &lt;&lt; endl;&nbsp;&nbsp; // 4字节而不是100字节<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">指针参数传递内存</p>
<p style="FONT-SIZE: 10pt">首先，考虑函数为参数创建临时副本的问题。对于值传递，有形参和实参的区别。但对于引用和指针传递，则可能会产生问题。</p>
<p style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt">指针作为函数参数，不能动态申请内存。</p>
<p style="FONT-SIZE: 10pt">void GetMemory(char *p, int num)</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = (char *)malloc(sizeof(char) * num);</p>
<p style="FONT-SIZE: 10pt">} </p>
<p style="FONT-SIZE: 10pt">void Test(void)</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *str = NULL;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMemory(str, 100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // str 仍然为 NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(str, "hello");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 运行错误</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本，指针参数p的副本是 _p，编译器使 _p = p。如果函数体内的程序修改了_p的内容，就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中，_p申请了新的内存，只是把_p所指的内存地址改变了，但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上，每执行一次GetMemory就会泄露一块内存，因为没有用free释放内存。<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">如何改正：<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">1 用&#8220;指向指针的指针&#8221;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">void GetMemory2(char **p, int num)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //**p</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *p = (char *)malloc(sizeof(char) * num);</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">void Test2(void)</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *str = NULL;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMemory2(&amp;str, 100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 注意参数是 &amp;str，而不是str</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(str, "hello"); </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt; str &lt;&lt; endl;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(str); </p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">2 用函数返回值来传递动态内存<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">char *GetMemory3(int num)</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *p = (char *)malloc(sizeof(char) * num);</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return p;</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">void Test3(void)</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *str = NULL;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = GetMemory3(100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(str, "hello");</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt; str &lt;&lt; endl;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(str); </p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">注意<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">强调不要用return语句返回指向&#8220;栈内存&#8221;的指针</p>
<p style="FONT-SIZE: 10pt">char *GetString(void)</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char p[] = "hello world";</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return p;&nbsp; // 编译器将提出警告</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">void Test4(void)</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">char *str = NULL;</p>
<p style="FONT-SIZE: 10pt">str = GetString();&nbsp;&nbsp; // str 的内容是垃圾</p>
<p style="FONT-SIZE: 10pt">cout&lt;&lt; str &lt;&lt; endl;</p>
<p style="FONT-SIZE: 10pt">}</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 13:08 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存管理</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29279.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 05:06:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29279.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29279.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29279.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29279.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">内存分配方式</p>
<p style="FONT-SIZE: 10pt">1 静态存储区域&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全局变量 static</p>
<p style="FONT-SIZE: 10pt">2 栈&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 局部变量</p>
<p style="FONT-SIZE: 10pt">3 动态存储区域（堆）(malloc free) (new delete)</p>
<p style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt">常见错误和对策</p>
<p style="FONT-SIZE: 10pt">1 内存分配未成功。</p>
<p style="FONT-SIZE: 10pt">对策：程序入口处，检查指针是否为NULL。</p>
<p style="FONT-SIZE: 10pt">（1）参数*p所指向的内存，用assert( p != NULL)</p>
<p style="FONT-SIZE: 10pt">（2）malloc或new申请的内存，用if ( p != NULL)</p>
<p style="FONT-SIZE: 10pt">2 内存未初始化。</p>
<p style="FONT-SIZE: 10pt">3 内存操作越界。</p>
<p style="FONT-SIZE: 10pt">4 忘记释放内存，内存泄露。</p>
<p style="FONT-SIZE: 10pt">new与delete配对。</p>
<p style="FONT-SIZE: 10pt">5 释放内存，却继续使用。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）return不能返回&#8220;栈内存指针&#8221;和&#8220;引用&#8221;，因为该内存在函数结束时被销毁。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）释放内存后，设为NULL，防止&#8220;野指针&#8221;。</p>
<p style="FONT-SIZE: 10pt">规则</p>
<p style="FONT-SIZE: 10pt">1 申请内存后检查。assert( p != NULL)</p>
<p style="FONT-SIZE: 10pt">2 数组、动态内存初始化。</p>
<p style="FONT-SIZE: 10pt">3 申请释放要配对。</p>
<p style="FONT-SIZE: 10pt">4 释放内存设置NULL，防止产生野指针。</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 13:06 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>引用与指针</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29277.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 05:05:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29277.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29277.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29277.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29277.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">引用的主要作用：传递函数的参数和返回值。</p>
<p style="FONT-SIZE: 10pt">C++语言中，函数的参数和返回值的传递方式有三种：值传递、指针传递和引用传递。<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">值传递<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">函数内的形参是实参（外部变量）的一个拷贝，所以不会影响实参（外部变量）的值。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; void Func1(int x)<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">{<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; x = x + 10;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">}<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&#8230;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">int n = 0;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; Func1(n);<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; cout &lt;&lt; &#8220;n = &#8221; &lt;&lt; n &lt;&lt; endl;&nbsp; // n = 0<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">指针传递<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; void Func2(int *x)<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">{<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; (* x) = (* x) + 10;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">}<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&#8230;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">int n = 0;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; Func2(&amp;n);<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; cout &lt;&lt; &#8220;n = &#8221; &lt;&lt; n &lt;&lt; endl;&nbsp; &nbsp;&nbsp;&nbsp; // n = 10<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">引用传递<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; void Func3(int &amp;x)<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">{<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; x = x + 10;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">}<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&#8230;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">int n = 0;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; Func3(n);<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; cout &lt;&lt; &#8220;n = &#8221; &lt;&lt; n &lt;&lt; endl;&nbsp; &nbsp;&nbsp;&nbsp; // n = 10<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">指针功能强大，但非常危险。恰如其分的使用&#8220;引用&#8221;，发挥其作用。</p>
<p style="FONT-SIZE: 10pt">一般先考虑&#8220;引用&#8221;，如果&#8220;引用&#8221;不能做的事，则再用&#8220;指针&#8221;来完成。</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 13:05 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pragma指示器</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29276.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 05:04:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29276.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29276.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29276.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29276.html</trackback:ping><description><![CDATA[<div style="FONT-SIZE: 10pt">
<p style="FONT-SIZE: 10pt">pragma就是为了让编译器编译出的C或C++程序与机器硬件和操作系统保持完全兼容而定义的宏扩展，#pragma是和特定编译器相关的。</p>
<p style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt">一、Pragma说明(Directives)<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">C和C++程序的每次执行都支持其所在的主机或操作系统所具有的一些独特的特点。<br>一些程序,例如，需要精确控制数据存放的内存区域或控制某个函数接收的参数。<br>#pragma指示为编译器提供了一种在不同机器和操作系统上编译以保持C和C++完全兼容的方法。Pragmas是由机器和相关的操作系统定义的，通常对每个编译器来说是不同的。</p>
<p style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt">二、语法(Syntax)<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">#pragma token-string(特征字符串)特征字符串是一连串的字符，就是要给一个特定编译器提供说明和编译意见。</p>
<p style="FONT-SIZE: 10pt">符号(#)必须是pragma所在那一行的第一个非空格字符;<br>#号和pragma之间可以有任意个空格符。<br>在#pragma之后，是可以被编译器解析的预处理特征字符。<br>一般认为,#pragma属于宏扩展。<br>如果编译器发现不认识的pragma,会提出警告，但继续编译下去。</p>
<p style="FONT-SIZE: 10pt">Pragmas可以用在条件声明上，提供最新的功能性的预处理程序，或者提供给编译器定义执行的信息。</p>
<p style="FONT-SIZE: 10pt">其格式一般为: #pragma&nbsp; para&nbsp;<o:p></o:p></p>
<p style="FONT-SIZE: 10pt">其中para为参数，下面来看一些常用的参数。<br><br></p>
</div>
<br clear=all>
<div style="FONT-SIZE: 10pt">
<p style="FONT-SIZE: 10pt">alloc_text<br>comment //注释<br>init_seg1&nbsp; <br>optimize&nbsp; //最优化<br>auto_inline <br>component&nbsp; //组成部件<br>inline_depth <br>pack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //包<br>bss_seg <br>data_seg <br>inline_recursion&nbsp; //内嵌递归<br>pointers_to_members1 <br>check_stack <br>function&nbsp;&nbsp;&nbsp; <br>intrinsic&nbsp; //内在的<br>setlocale <br>code_seg <br>hdrstop <br>message&nbsp; <br>vtordisp1 <br>const_seg <br>include_alias <br>once <br>warning<o:p></o:p></p>
</div>
<br clear=all>
<p style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt">参数详解<o:p></o:p></p>
<p style="FONT-SIZE: 10pt"><a href="http://www.cppblog.com/robinson119/admin/diary%20files/#pragma  预处理指令详解.doc">diary files\#pragma&nbsp; 预处理指令详解.doc</a></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 13:04 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>递归锁与非递归锁</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29275.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29275.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29275.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29275.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29275.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">&nbsp;&nbsp;&nbsp;* </span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">非递归锁：非递归锁提供互斥的一种高效的形式，它定义一个临界区，每一时刻只有单个线程可在其中执行。它们之所以是非递归的，是因为当前拥有锁的线程在将其释放前不可以再次获取它。否则，就会立即发生死锁。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">SunOS 5.x</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">通过它的</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">mutex_t</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">rwlock_t</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，和</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">sema_t</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">类型（</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">POSIX Pthreads</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">不提供后两种同步机制）为非递归锁提供支持。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">ASX</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">构架提供</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">Mutex</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">、</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">RW_Mutex</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，和</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">Semaphore</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">包装，以分别封装这些语义。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">&nbsp;&nbsp;&nbsp;* </span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">递归锁：另外一方面，递归锁允许</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">acquire</span><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">方法嵌套调用，只要当前拥有该锁的线程就是试图重新获取它的线程。递归锁对于回调驱动的事件分派构架（比如</span><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899"><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma">1.3.2</span></st1:chsdate><span style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">描述的反应堆）特别有用，在其中构架的事件循环执行对预登记的用户定义的对象的回调。因为随后用户定义的对象可能经由它的方法入口重入分派构架，必须使用递归锁以防止在回调过程中构架持有的锁发生死锁。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Tahoma"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 13:03 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>using namespace std;</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29274.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 05:01:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29274.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29274.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29274.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29274.html</trackback:ping><description><![CDATA[&nbsp;
<p style="FONT-SIZE: 10pt"><strong>&nbsp;错误</strong>：</p>
<p style="FONT-SIZE: 10pt">#include &nbsp; &lt;iostream.h&gt;<br>#include &nbsp; &lt;string.h&gt;</p>
<p style="FONT-SIZE: 10pt">&#8230;&#8230;</p>
<p style="FONT-SIZE: 10pt">string &nbsp; st("test &nbsp; string"); &nbsp;</p>
<p style="FONT-SIZE: 10pt">&#8230;&#8230;</p>
<p style="FONT-SIZE: 10pt">error &nbsp; C2065: &nbsp; 'string' &nbsp; : &nbsp; undeclared &nbsp; identifier &nbsp;</p>
<p style="FONT-SIZE: 10pt"><strong>解释</strong>：</p>
<p style="FONT-SIZE: 10pt">#include &nbsp; &lt;string&gt; &nbsp; </p>
<p style="FONT-SIZE: 10pt">using &nbsp; namespace &nbsp; std; &nbsp; </p>
<p style="FONT-SIZE: 10pt">因为在 &nbsp; using &nbsp; namespace &nbsp; std; &nbsp; 情况下，&nbsp;</p>
<p style="FONT-SIZE: 10pt">#include &nbsp; &lt;string&gt; &nbsp; &nbsp; 是使用 &nbsp; C++ &nbsp; &nbsp; string &nbsp; 类库；&nbsp;</p>
<p style="FONT-SIZE: 10pt">#include &nbsp; &lt;cstring&gt; &nbsp; &nbsp; 是使用 &nbsp; C &nbsp; 的string &nbsp; 操作库函数 &nbsp; ... &nbsp;</p>
<p style="FONT-SIZE: 10pt"><strong>细节 加不加&#8220;.h&#8221;</strong></p>
<p style="FONT-SIZE: 10pt">#include &lt;iostream.h&gt;</p>
<p style="FONT-SIZE: 10pt">#include &lt;string&gt;</p>
<p style="FONT-SIZE: 10pt">using&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std;</p>
<p style="FONT-SIZE: 10pt">没有错！！</p>
<p style="FONT-SIZE: 10pt">而</p>
<p style="FONT-SIZE: 10pt">#include &lt;iostream.h&gt;</p>
<p style="FONT-SIZE: 10pt">#include &lt;string.h&gt;</p>
<p style="FONT-SIZE: 10pt">using&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std;</p>
<p style="FONT-SIZE: 10pt">编译有错！！</p>
<p style="FONT-SIZE: 10pt"><strong>解释</strong></p>
<p style="FONT-SIZE: 10pt">&nbsp; &#8220;string.h&#8220;这个头文件是&#8220;旧式c头文件&#8221;，而这个文件中没有定义string类（这点应该不奇怪，c语言中哪有什么类啊），这个头文件里面是有关&#8220;旧式char-based字符串&#8221;的操作函数，注意都是操作char*字符串的&#8220;函数&#8221;，所以你引用这个头文件，编译器肯定找不到&#8220;string&#8221;了。 &nbsp; <br>&nbsp; &#8220;string&#8221;这个头文件（没有扩展名）是C++标准化之后的C++头文件，里面才有string类的相关定义（其实，string并不是类，是一个typedef，但是使用的时候不用去管他），而C++标准头文件中的东西都放在namespace &nbsp; std中了，所以使用的时候要&#8220;using &nbsp; namespace &nbsp; std&#8221;。 &nbsp; <br>&nbsp; 附：建议楼主不要用"iostream.h"，改成&#8220;iostream&#8221;吧，因为标准已经明确规定不在支持"iostream.h"这种头文件了。</p>
<p style="FONT-SIZE: 10pt">标准写法</p>
<p style="FONT-SIZE: 10pt">#include &lt;iostream&gt;</p>
<p style="FONT-SIZE: 10pt">#include &lt;string&gt;</p>
<p style="FONT-SIZE: 10pt">using&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std;</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">F:&nbsp;为什么using &nbsp; namespace &nbsp; std; &nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要写在include后面？</p>
<p style="FONT-SIZE: 10pt">Q:&nbsp;因为include的文件包含名字域std &nbsp; <br>如果你把using &nbsp; namespace &nbsp; std写在前面，编译器就看不到std这个名字</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 13:01 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的引用</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29273.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 05:00:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29273.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29273.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29273.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29273.html</trackback:ping><description><![CDATA[&nbsp;
<p style="FONT-SIZE: 10pt">引用即别名，数组不能引用。</p>
<p style="FONT-SIZE: 10pt">引用提高效率，又不在函数中改变。参考：<a href="http://www.cppblog.com/robinson119/documents/深入探讨C++中的引用%20-%20KiRa的专栏%20-%20CSDNBlog.mht">file:///F:/fragments/documents/深入探讨C++中的引用%20-%20KiRa的专栏%20-%20CSDNBlog.mht</a></p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">常引用</p>
<p style="FONT-SIZE: 10pt">常引用声明方式：const 类型标识符 &amp;引用名 = 目标变量名；</p>
<p style="FONT-SIZE: 10pt">const类型 和 &amp; 是分不开的，引用一般定义成const。</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">引用作为返回值</p>
<p style="FONT-SIZE: 10pt">要以引用返回函数值，则函数定义时要按以下格式：</p>
<p style="FONT-SIZE: 10pt">类型标识符 &amp;函数名（形参列表及类型说明）<br>{</p>
<p style="FONT-SIZE: 10pt">函数体</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">说明：</p>
<p style="FONT-SIZE: 10pt">　　（1）以引用返回函数值，定义函数时需要在函数名前加&amp;</p>
<p style="FONT-SIZE: 10pt">　　（2）用引用返回一个函数值的最大好处是，在内存中不产生被返回值的副本。</p>
<p style="FONT-SIZE: 10pt">例子：<a href="http://www.cppblog.com/robinson119/admin/C++exams/rtn_ref">Diary files\C++exams\rtn_ref</a></p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">引用作为返回值，必须遵守以下规则：</p>
<p style="FONT-SIZE: 10pt">（1）不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁，因此被返回的引用就成为了"无所指"的引用，程序会进入未知状态。 </p>
<p style="FONT-SIZE: 10pt">（2）不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题，可对于这种情况（返回函数内部new分配内存的引用），又面临其它尴尬局面。例如，被函数返回的引用只是作为一个临时变量出现，而没有被赋予一个实际的变量，那么这个引用所指向的空间（由new分配）就无法释放，造成memory leak。</p>
<p style="FONT-SIZE: 10pt">（3）可以返回类成员的引用，但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则（business rule）相关联的时候，其赋值常常与某些其它属性或者对象的状态有关，因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用（或指针），那么对该属性的单纯赋值就会破坏业务规则的完整性。</p>
<p style="FONT-SIZE: 10pt">（4）引用与一些操作符的重载：</p>
<p style="FONT-SIZE: 10pt">　　流操作符&lt;&lt;和&gt;&gt;，这两个操作符常常希望被连续使用，例如：cout &lt;&lt; "hello" &lt;&lt; endl;　因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括：返回一个流对象和返回一个流对象指针。但是对于返回一个流对象，程序必须重新（拷贝）构造一个新的流对象，也就是说，连续的两个&lt;&lt;操作符实际上是针对不同对象的！这无法让人接受。对于返回一个流指针则不能连续使用&lt;&lt;操作符。因此，返回一个流对象引用是惟一选择。这个唯一选择很关键，它说明了引用的重要性以及无可替代性，也许这就是C++语言中引入引用这个概念的原因吧。 赋值操作符=。这个操作符象流操作符一样，是可以连续使用的，例如：x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值，以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 13:00 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANSI C/C++的编译器规范</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29272.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 04:59:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29272.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29272.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29272.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29272.html</trackback:ping><description><![CDATA[&nbsp;
<p style="FONT-SIZE: 10pt">在Visual C++中，可以在函数类型前加_cdecl，_stdcall或者_pascal来表示其调用规范（默认为_cdecl）</p>
<p style="FONT-SIZE: 10pt">// 被调用函数是以int为参数，以int为返回值<br>__stdcall int callee(int); <br><br>// 调用函数以函数指针为参数<br>void caller( __cdecl int(*ptr)(int)); <br><br>// 在p中企图存储被调用函数地址的非法操作<br>__cdecl int(*p)(int) = callee; // 出错</p>
<p style="FONT-SIZE: 10pt">指针p和callee()的类型不兼容，因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p，尽管两者有相同的返回值和参数列。&nbsp;</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 12:59 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数指针</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29271.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 04:58:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29271.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29271.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29271.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29271.html</trackback:ping><description><![CDATA[&nbsp;
<p style="FONT-SIZE: 10pt">声明：</p>
<p style="FONT-SIZE: 10pt">先定义函数，void&nbsp;print(string str)；</p>
<p style="FONT-SIZE: 10pt">声明一个函数指针，void&nbsp;( *p )( string ) = NULL;</p>
<p style="FONT-SIZE: 10pt">指向copy函数，p = &amp; print; 或 p = print；</p>
<p style="FONT-SIZE: 10pt">调用指针函数，p( &#8220;hello&#8221; );</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">可以把多个函数放在一个指针数组里，然后通过数组对应指针方便调用函数。</p>
<p style="FONT-SIZE: 10pt">例子：<a href="http://www.cppblog.com/robinson119/admin/C++exams/pointer_func">Diary files\C++exams\pointer_func</a></p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">动态绑定一个函数</p>
<p style="FONT-SIZE: 10pt">void caller(void(*ptr)())</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">ptr(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 调用ptr指向的函数 */ </p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">void func();</p>
<p style="FONT-SIZE: 10pt">int main()</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">p = func; </p>
<p style="FONT-SIZE: 10pt">caller(p); /* 传递函数地址到调用者 */</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">如果赋了不同的值给p（不同函数地址），那么调用者将调用不同地址的函数。赋值可以发生在运行时，这样使你能实现动态绑定。</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 12:58 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重载</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29270.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 04:57:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29270.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29270.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29270.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29270.html</trackback:ping><description><![CDATA[<pre><span style="FONT-SIZE: 10pt">静态联编：运行之前就完成的联编，系统在编译时就决定如何完成某个动作。</span></pre>
<pre style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">动态联编：程序运行之后才完成的联编，系统在运行时动态实现某一动作。</span></pre>
<pre style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">静态多态性：函数重载；运算符重载；</span></pre>
<pre style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">动态多态性：继承；虚函数；<br></span></pre>
<pre style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">函数重载</span></pre>
<pre style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">1 参数有差别。</span></pre>
<pre style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">2 参数相同，属不同类。</span></pre>
<pre style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">一个重载的例子：</span><a href="http://www.cppblog.com/robinson119/admin/C++exams/func_reload"><span style="FONT-SIZE: 10pt">Diary files\C++exams\func_reload</span></a></pre>
<pre style="FONT-SIZE: 10pt">&nbsp;</pre>
<pre style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">名字压延：</span><span style="FONT-SIZE: 10pt">是编译器根据函数重载的不同类型，在编译时改变函数名字，而达到区分的目的。</span></pre>
<img src ="http://www.cppblog.com/robinson119/aggbug/29270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 12:57 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>友元函数与继承类的友元函数</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29268.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 04:55:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29268.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29268.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29268.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29268.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">友元函数一般在类中声明，如果一个友元需要访问多个类的对象，那么每个类都要声明一次友元函数。</p>
<p style="FONT-SIZE: 10pt">还要注意：友元函数的入口包括多个类，那这些类都要在友元函数之前声明。</p>
<p style="FONT-SIZE: 10pt">如例子：<a href="http://www.cppblog.com/robinson119/admin/C++exams/frnd_vst2_func">Diary files\C++exams\frnd_vst2_func</a></p>
<p style="FONT-SIZE: 10pt">如果是类person的两个继承他的子类boy和girl，那么友元函数如何声明和定义。</p>
<p style="FONT-SIZE: 10pt"><a href="http://www.cppblog.com/robinson119/admin/C++exams/frnd_member">Diary files\C++exams\frnd_member</a></p>
<p style="FONT-SIZE: 10pt">这需要注意的地方有：</p>
<p style="FONT-SIZE: 10pt">基类的数据成员共有；构造函数；构造函数初始化表；类的声明先于友元函数，提高了重用性；</p>
<p style="FONT-SIZE: 10pt">基类的数据成员必须共有，因为构造函数会访问到它们，子类的构造函数也会引用基类的构造函数，如果是私有的会是的子类构造函数不能直接访问基类的私有成员，要通过基类的成员函数来访问。</p>
<p style="FONT-SIZE: 10pt">子类：public基类</p>
<p style="FONT-SIZE: 10pt"><o:p></o:p>&nbsp;</p>
<p style="FONT-SIZE: 10pt">还有写细节问题：</p>
<p style="FONT-SIZE: 10pt">头文件；char *a的声明和使用；分配char*数据；</p>
<p style="FONT-SIZE: 10pt">例如：</p>
<p style="FONT-SIZE: 10pt">char *name;</p>
<p style="FONT-SIZE: 10pt">name = new char[ strlen( s ) + 1 ];</p>
<p style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt">友元函数的声明时的入口参数可以只写类型，不写参数名。</p>
<p style="FONT-SIZE: 10pt">例如：</p>
<p style="FONT-SIZE: 10pt">class boy</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void disp( gril &amp; );</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">注意声明时的入口参数可省略，但要写&amp;。</p>
<p style="FONT-SIZE: 10pt">定义时，写成</p>
<p style="FONT-SIZE: 10pt">void disp( gril &amp;x ){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 12:55 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>this指针</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29267.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 04:53:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29267.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29267.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29267.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29267.html</trackback:ping><description><![CDATA[&nbsp;
<p style="FONT-SIZE: 10pt">声明：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类&nbsp;&nbsp;&nbsp; 对象；&nbsp;&nbsp;&nbsp; &nbsp;类&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *指针；</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int &nbsp;i; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;class&gt; &nbsp;&nbsp;&nbsp;&nbsp; *this；</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">this指针是一个隐含指针，是成员函数所属对象的指针。</p>
<p style="FONT-SIZE: 10pt">每个成员函数都有一个this指针，this指针指向该函数所属类的对象。</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">使用格式：this -&gt; 成员变量</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">不同的对象调用同一个成员函数，C++会根据成员函数的this指针指向哪一个对象，来调用该对象的成员变量。</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">this指针如何得到对象名？</p>
<p style="FONT-SIZE: 10pt">例如：一个类class me的初始化函数：</p>
<p style="FONT-SIZE: 10pt">void&nbsp;init(char ma, int mb)</p>
<p style="FONT-SIZE: 10pt">{ a = ma; b = mb; }</p>
<p style="FONT-SIZE: 10pt">编译时，被编译器转化为：</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void&nbsp;init(me&nbsp;*this, char&nbsp;ma, int mb)&nbsp;&nbsp;&nbsp;&nbsp; //多了一个this指针的参数，指向me类的obj</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ this -&gt; a = ma, this -&gt; b = mb; }</p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 12:53 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指针传递和值传递</title><link>http://www.cppblog.com/robinson119/archive/2007/08/03/29266.html</link><dc:creator>宝杉</dc:creator><author>宝杉</author><pubDate>Fri, 03 Aug 2007 04:52:00 GMT</pubDate><guid>http://www.cppblog.com/robinson119/archive/2007/08/03/29266.html</guid><wfw:comment>http://www.cppblog.com/robinson119/comments/29266.html</wfw:comment><comments>http://www.cppblog.com/robinson119/archive/2007/08/03/29266.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/robinson119/comments/commentRss/29266.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/robinson119/services/trackbacks/29266.html</trackback:ping><description><![CDATA[&nbsp; <br>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;对于只做输入用的指针参数，最好用const，这样避免指针参数被修改。 </p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;比如：对于上面的StringCopy的例子，写成</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;void StringCopy (char *strDestination, const char *strSource);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //比较安全。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;但是如果输入参数以值传递的形式传递对象，则改为使用const &amp;最好，因为省去了临时对象的构造和解析的过程，提高效率和安全性。</p>
&nbsp;
<p style="FONT-SIZE: 10pt"><span>&nbsp;&nbsp;&nbsp;int printf</span><span>（&#8230;&#8230;）；这个函数的参数不确定，没有严格的类型检查，所以最好不用。</span></p>
<img src ="http://www.cppblog.com/robinson119/aggbug/29266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/robinson119/" target="_blank">宝杉</a> 2007-08-03 12:52 <a href="http://www.cppblog.com/robinson119/archive/2007/08/03/29266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>