<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>灵魂机器</title>
    <description>专注于C++。
我的博客http://hi.baidu.com/soulmachine</description>
    <link>http://soulmachine.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>从C++ std/Boost库迁移到Tango</title>
        <author>soulmachine</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://soulmachine.javaeye.com">soulmachine</a>&nbsp;
          链接：<a href="http://soulmachine.javaeye.com/blog/129232" style="color:red;">http://soulmachine.javaeye.com/blog/129232</a>&nbsp;
          发表时间: 2007年10月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp; </p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 16pt; 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: 16pt">C++ std/Boost</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-size: 16pt; 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: 16pt">Tango</span></strong></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">本页目的是为了帮助大家从熟知的</span><span lang="EN-US">C++ </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">库迁移到</span><span lang="EN-US">Tango</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">库。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt">C++/C </span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-size: 14pt; 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: 14pt">D </span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-size: 14pt; 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: 14pt"></span></strong></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">预处理语句</span><span lang="EN-US"></span></strong></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">象下面的条件编译会被完全忽略。</span></p>
<p class="MsoNormal"><span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">#ifndef myclass #define my_class</span></p>
<p class="MsoNormal"><span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">..</span></p>
<p class="MsoNormal"><span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">..</span></p>
<p class="MsoNormal"><span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">#endif</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span lang="EN-US">#define</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">语句可以用</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">const</span></strong><span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto"> <span style="color: #008080;">unint</span> foo;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或枚举</span><span lang="EN-US">(</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">经常被推荐用来减小可执行代码的体积</span><span lang="EN-US">)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代替。</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">至于其它</span><span lang="EN-US">#ifndef (</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">之类的</span><span lang="EN-US">)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">语句，可以用</span><span lang="EN-US">static if </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或</span><span lang="EN-US">version</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 14pt; 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: 14pt"></span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">不要利用异常作为你的程序正常的控制流。例如当你编译代码时加上</span><span lang="EN-US">&rdquo;-release&rdquo;</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">标志数组边界检查会去除。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 14pt; 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: 14pt">C</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-size: 14pt; 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: 14pt"></span></strong></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">time.h</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">为了操作时间，请用</span><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">tango.util.time</span></strong><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">包里的各种模块吧。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt">STL</span></strong></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">std::cout</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对于简单的控制台输出你有不同的选择，例如：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">用</span><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;"><a href="http://dsource.org/projects/tango/docs/current/tango.io.Console.html">tango.io.Console</a></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里的</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto"><span style="mso-spacerun: yes">&nbsp;</span>Cout(<span style="color: #ff9900;">&ldquo;Hello World!&rdquo;</span>);</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">仅进行文本输出。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">用</span><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;"><a href="http://dsource.org/projects/tango/docs/current/tango.io.Stdout.html">tango.io.Stdout</a></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里的</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">Stdout.formatln(<span style="color: #ff9900;">&ldquo;Hello {}&rdquo;</span>, <span style="color: #ff9900;">&ldquo;World&rdquo;</span>);</span></p>
<p class="MsoNormal"><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-LEFT: 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><span style="font-family: 宋体; mso-bidi-font-family: 宋体;"><span style="mso-list: Ignore">●<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: #800000;">tango.io.Prin</span><span lang="EN-US">t</span><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-LEFT: 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><span style="font-family: 宋体; mso-bidi-font-family: 宋体;"><span style="mso-list: Ignore">●<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对于高级日志操作，有</span><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">tango.util.log</span></strong><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">（见</span><span style="color: #800000;"><a href="http://dsource.org/projects/tango/wiki/TutLogging">tutorial</a></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">std::string</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">D</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">提供了一个内置的类似</span><span lang="EN-US">string</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的数据类型</span><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">char[]</span></strong><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。它是一个包含字符指针（不是以</span><span lang="EN-US">\0</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">终止的）和长度属性的结构体。</span><span lang="EN-US">Tango</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">提供了包含了高级自付出操作的</span><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;"><a href="http://dsource.org/projects/tango/docs/current/tango.text.String.html">tango.text.String</a></span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: Arial;">，尽管它对于基本的字符串操作不是必须的。</span><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;"></span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;">std::string::substr</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">substr</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的等价物是</span><span lang="EN-US">D</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">核心提供的的切片操作。</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">std::string::size / std::string::empty</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">每个数组有个</span><span lang="EN-US">length</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">属性存储了数组的长度。它也是测试数组是否为空最快的方法。</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">std::find</span></strong></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;"><a href="http://dsource.org/projects/tango/docs/current/tango.text.Util.html">tango.text.Util</a></span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: Arial;">有不同于</span><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;">locate*</span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: Arial;">（系列函数）</span><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;"> </span><span style="font-size: 10pt; color: #000000; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: Arial;">的功能，不仅能做同样的工作，甚至能做更多的高级操作。</span><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;"></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 14pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;">Boost</span></strong><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt"></span></strong></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">boost::find</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US">boost::regex</span></strong></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #000000; font-family: Verdana; mso-bidi-font-family: Arial;"><a href="http://dsource.org/projects/tango/docs/current/tango.text.Regex.html">tango.text.Regex</a></span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">原文：</span><span lang="EN-US"><a href="http://dsource.org/projects/tango/wiki/BoostTangoMigration">Transition from C++ std / Boost to Tango</a></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://soulmachine.javaeye.com/blog/129232#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Oct 2007 21:00:02 +0800</pubDate>
        <link>http://soulmachine.javaeye.com/blog/129232</link>
        <guid>http://soulmachine.javaeye.com/blog/129232</guid>
      </item>
      <item>
        <title>小结一下众高手的解答</title>
        <author>soulmachine</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://soulmachine.javaeye.com">soulmachine</a>&nbsp;
          链接：<a href="http://soulmachine.javaeye.com/blog/128368" style="color:red;">http://soulmachine.javaeye.com/blog/128368</a>&nbsp;
          发表时间: 2007年09月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: Arial;">最近我发的帖子在群里得到众多高手的细心指点，以及QQ群里热心的老大及时的在线解答和讨论，让我大有所获，故把的解答总结了一下。</span></p>
<p><span style="font-family: Arial;">1. 除了const,定义常量还有几种方法？<br />invariant/final/const</span></p>
<p><span style="font-family: Arial;">2.invariant/const/final 有什么区别？<br />&nbsp;<br />invariant变量不能改变，任何能被invariant变量引用的数据也不能改变。只能用编译期常量来初始化</span></p>
<p><span style="font-family: Arial;">invariant变量，而且声明和初始化不能分开。invriant变量作为类的成员时不占用空间。</span></p>
<p><span style="font-family: Arial;">const变量本身不能改变，但数据可以被其它引用改变，其它跟&nbsp;invariant 相同。</span></p>
<p><span style="font-family: Arial;">final变量的声明和初始化可以分开，如果在构造函数中，还可以被赋值多次。<br />http://www.digitalmars.com/d/final-const-invariant.html</span></p>
<p><span style="font-family: Arial;">3. C++中的引用，在D中怎么表示?如下C++代码，<br />int i;<br />int &amp;j = i;<br />怎么转换成D？</span></p>
<p><span style="font-family: Arial;">对值类型没有显式引用，但可以用如下代码模拟：<br />alias i j; </span></p>
<p><span style="font-family: Arial;">4.<br />int test(T&amp;); //T是一个类 <br />int test(char&amp;); <br />如何把这两个函数写成D的形式？</span></p>
<p><span style="font-family: Arial;">int test(T); //T是一个类 <br />int test(ref char); </span></p>
<p><span style="font-family: Arial;">类类型默认就是引用</span></p>
<p><span style="font-family: Arial;">5. 怎么返回一个引用？ <br />比如C++的函数： <br />string&amp; copy(void); <br />该怎么写成D 的形式，我曾试图改成 <br />ref string copy(void); <br />编译器报错</span></p>
<p><span style="font-family: Arial;">如果是函数要返回引用类型的话,要么用指针,要么把返回值用类包装一下，因为D中类类型总是引用</span></p>
<p><span style="font-family: Arial;">6. D中没有了sizeof运算符，那计算一个类的大小，该怎么办？<br />所有类型都有 .sizeof 属性 </span></p>
<p><span style="font-family: Arial;">7. C/C++可以用malloc,new在堆中分配内存，D中对应的是什么呢？<br />class A <br />{ <br />} <br />writefln(A.sizeof); <br />A pa = new A;</span></p>
<p><span style="font-family: Arial;">类是透明引用类型，不需要指针。 T obj = new T;</span></p>
<p><span style="font-family: Arial;">8.类的成员函数貌似只能在类里面定义，不能象C++可以在类的外面实现，是这样吗？<br />是的</span></p>
<p><span style="font-family: Arial;">7. in 象C++的默认传值调用，ref相当于C ++的引用，out比ref多了一点东西，就是在调用函数时out参</span></p>
<p><span style="font-family: Arial;">数都会被设置为默认值，我的理解对否？</span></p>
<p><span style="font-family: Arial;">D2.0中 in 暗含了 scope；out 是说参数只能写不能读，类似返回值的作用 </span></p>
<p><span style="font-family: Arial;">9.类是透明引用类型，你的意思是D中对类类型默认是引用的，比如： <br />int test(T t);//T是一个类 <br />这个函数调用是是用引用的吗？而不是象C++那样的传值调用<br />是的，跟java/C#相同</span></p>
<p><span style="font-family: Arial;">10. 既然out是只写的，而C++中用const修饰的形参是只读的，D中有没有类似的关键字呢？<br />比如如下代码：<br />class T<br />{<br />&nbsp;int i;<br />};</span></p>
<p><span style="font-family: Arial;">int test(const T t)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />}<br />如何改写成D的形式？</span></p>
<p><span style="font-family: Arial;">以上代码在D2.0中可以通过编译。此外，D 的 const 是一个storage class，而不是type modifier。</span></p>
<p><span style="font-family: Arial;">C++还可以用指针去掉const属性，在D中，它把const的变量都看成是ROM，这样真正变成了常量了。C++</span></p>
<p><span style="font-family: Arial;">中const的类变量是放在内存中的，可以通过指针修改，const只是用来哄编译器的语法糖而已。</span></p>
<p><span style="font-family: Arial;">11. 数组的dup是浅拷贝还是深拷贝？<br />浅拷贝：<br />import std.stdio;</span></p>
<p><span style="font-family: Arial;">class A<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br />};</span></p>
<p><span style="font-family: Arial;">int main(char[][] args)<br />{</span></p>
<p><span style="font-family: Arial;">&nbsp;&nbsp;&nbsp;&nbsp; A[] arrayA = new A[2];<br />&nbsp;&nbsp;&nbsp; foreach(ref e; arrayA)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e = new A();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; for(int i=0; i &nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writefln(&amp;arrayA[i]);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; printf("\n");<br />&nbsp;&nbsp;&nbsp; A[] arrayB = arrayA.dup;<br />&nbsp;&nbsp;&nbsp; for(int i=0; i &nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writefln(&amp;arrayB[i]);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; writefln();</span></p>
<p><span style="font-family: Arial;">&nbsp;&nbsp; arrayA[0].i = 9;<br />&nbsp;&nbsp; arrayB[0].i = 0;<br />&nbsp;&nbsp; writefln(arrayA[0].i);</span></p>
<p><span style="font-family: Arial;">&nbsp;return 0;<br />}<br />12. const数据可以被非const引用修改<br />import std.stdio;</span></p>
<p><span style="font-family: Arial;">class Integer<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; public int i = 10;<br />};</span></p>
<p><span style="font-family: Arial;">int main(char[][] args)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; const int i = 10;<br />&nbsp;&nbsp;&nbsp; &nbsp;int* j = cast(int*)&amp;i;</span></p>
<p><span style="font-family: Arial;">&nbsp;&nbsp;&nbsp;&nbsp; writefln("i = %d",i);<br />&nbsp;&nbsp;&nbsp;&nbsp; *j = 20;&nbsp;//temp viriable modified, not the const i<br />&nbsp;&nbsp;&nbsp;&nbsp; writefln("i = %d",i);</span></p>
<p><span style="font-family: Arial;">&nbsp;&nbsp;&nbsp; const (Integer) si = new Integer();<br />&nbsp;&nbsp;&nbsp; writefln("si = %d", si.i);</span></p>
<p><span style="font-family: Arial;">&nbsp;&nbsp;&nbsp; Integer* sj = cast(Integer*)&amp;si;<br />&nbsp;&nbsp;&nbsp; sj.i = 20;&nbsp;&nbsp; //modified successfully<br />&nbsp;&nbsp;&nbsp; writefln("si = %d", si.i);<br />&nbsp;&nbsp;&nbsp; return(0);<br />}<br /></span></p>
<p><span style="font-family: Arial;">&nbsp;</span></p>
<p><span style="font-family: Arial;">&nbsp;感谢群里的高手细心的解答^_^</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://soulmachine.javaeye.com/blog/128368#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 30 Sep 2007 07:35:39 +0800</pubDate>
        <link>http://soulmachine.javaeye.com/blog/128368</link>
        <guid>http://soulmachine.javaeye.com/blog/128368</guid>
      </item>
      <item>
        <title>争得好凶，不过过瘾！</title>
        <author>soulmachine</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://soulmachine.javaeye.com">soulmachine</a>&nbsp;
          链接：<a href="http://soulmachine.javaeye.com/blog/123393" style="color:red;">http://soulmachine.javaeye.com/blog/123393</a>&nbsp;
          发表时间: 2007年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先这篇文章<a href="http://blog.csdn.net/turingbook/archive/2007/09/07/1775488.aspx" target="_blank">Linux之父炮轰C++：糟糕程序员的垃圾语言</a> 出现在CSDN首页，引来评论无数，接着孟老大出来发话，<a href="http://blog.csdn.net/myan/archive/2007/09/08/1777230.aspx" target="_blank">Linux之父话糙理不糙</a>，似乎也挺C，然后云风也力挺了C一把，<a href="http://blog.codingnow.com/2007/09/c_vs_cplusplus.html" target="_blank">C的回归</a>。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三篇文章都是牛人写的，看着就过瘾！</p>
<p>PS:争论还在继续，孟岩又有新作，<a href="http://blog.csdn.net/myan/archive/2007/09/10/1778843.aspx" target="_blank">用C设计，用C++编码</a>，刘未鹏则挺C++，<a href="http://blog.csdn.net/pongba/archive/2007/09/11/1780545.aspx" target="_blank">Why C++</a>。</p>
<p>一些摘要：</p>
<p>用C设计，用C++编码<br />
<strong>C++的心智包袱</strong>：<br />
&ldquo;这样固然是可以work了，但恐怕有更好的方案吧，会是什么呢？...就这样，兜了一个圈子回来。&rdquo;</p>
<p>&ldquo;反正现在C和C++都是来做系统级开发，那些华丽的抽象机制用不上，思考解决方案的时候，就以C的方式。注意，C也是可以做基于对 象甚至面向对象甚至组件级别的设计的，但是在C的层面上思考问题，设计能够更精益（lean，现在这是个时髦词），更轻便，更直接。当你构思的设计方案出 来以后，如果其中有些部分，恰好是C++现成做好了，而且使用C++又可以提高开发效率，也没什么明显的副作用，那么就用C++来做相应的部分。&rdquo;</p>
<p>C的回归：<br />
&ldquo;没错，我最想说的就是这个。C++ 就是一个&ldquo;带有一些<strong>心智（mental）包袱</strong>的语言&rdquo;。这对软件设计的影响非常之大，没有经年的软件开发实践很难理解这一点。&rdquo;</p>
<p>&ldquo;字符串/内存管理根本无关紧要。这不是重要的部分，而且也不复杂。唯一真正重要的部分是设计。&rdquo;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://hi.baidu.com/soulmachine/blog/item/79c4a47ea919753b0dd7da10.html">原文</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://soulmachine.javaeye.com/blog/123393#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Sep 2007 20:11:37 +0800</pubDate>
        <link>http://soulmachine.javaeye.com/blog/123393</link>
        <guid>http://soulmachine.javaeye.com/blog/123393</guid>
      </item>
      <item>
        <title>请高人改写GUI版本的Hello world!</title>
        <author>soulmachine</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://soulmachine.javaeye.com">soulmachine</a>&nbsp;
          链接：<a href="http://soulmachine.javaeye.com/blog/75871" style="color:red;">http://soulmachine.javaeye.com/blog/75871</a>&nbsp;
          发表时间: 2007年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>改这个程序好久，没有头绪，请圈子里的老大给个示范。要保持是Unicode版本，没有黑黑的控制台。</p>
<p>C++代码如下，在Visual Studio 2005下编译通过：</p>
<p><font face="Arial">#include &lt;windows.h&gt;<windows.h></windows.h><br />
#include &lt;tchar.h&gt;<tchar.h></tchar.h></font></p>
<p><font face="Arial">/*&nbsp; Declare Windows procedure&nbsp; */<br />
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);</font></p>
<p><font face="Arial">int WINAPI WinMain (HINSTANCE hThisInstance,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HINSTANCE hPrevInstance,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPSTR lpszArgument,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nCmdShow)<br />
{<br />
&nbsp;/*&nbsp; Make the class name into a global variable&nbsp; */<br />
&nbsp;TCHAR szClassName[ ] = TEXT(&quot;HelloWorld&quot;);<br />
&nbsp;HWND hwnd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* This is the handle for our window */<br />
&nbsp;MSG messages;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Here messages to the application are saved */<br />
&nbsp;WNDCLASSEX wincl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Data structure for the windowclass */</font></p>
<p><font face="Arial">&nbsp;/* The Window structure */<br />
&nbsp;wincl.hInstance = hThisInstance;<br />
&nbsp;wincl.lpszClassName = szClassName;<br />
&nbsp;wincl.lpfnWndProc = WindowProcedure;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* This function is called by windows */<br />
&nbsp;wincl.style = CS_HREDRAW | CS_VREDRAW;&nbsp;&nbsp;&nbsp; /* Catch double-clicks */<br />
&nbsp;wincl.cbSize = sizeof (WNDCLASSEX);</font></p>
<p><font face="Arial">&nbsp;/* Use default icon and mouse-pointer */<br />
&nbsp;wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);<br />
&nbsp;wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);<br />
&nbsp;wincl.hCursor = LoadCursor (NULL, IDC_ARROW);<br />
&nbsp;wincl.lpszMenuName = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* No menu */<br />
&nbsp;wincl.cbClsExtra = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* No extra bytes after the window class */<br />
&nbsp;wincl.cbWndExtra = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* structure or the window instance */<br />
&nbsp;/* Use Windows's default colour as the background of the window */<br />
&nbsp;wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;</font></p>
<p><font face="Arial">&nbsp;/* Register the window class, and if it fails quit the program */<br />
&nbsp;if (!RegisterClassEx (&amp;wincl))<br />
&nbsp;&nbsp;return 0;</font></p>
<p><font face="Arial">&nbsp;/* The class is registered, let's create the program*/<br />
&nbsp;hwnd = CreateWindowEx (<br />
&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extended possibilites for variation */<br />
&nbsp;&nbsp;szClassName,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Classname */<br />
&nbsp;&nbsp;TEXT(&quot;SDK Verision&quot;),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Title Text */<br />
&nbsp;&nbsp;WS_OVERLAPPEDWINDOW, /* default window */<br />
&nbsp;&nbsp;CW_USEDEFAULT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Windows decides the position */<br />
&nbsp;&nbsp;CW_USEDEFAULT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* where the window ends up on the screen */<br />
&nbsp;&nbsp;CW_USEDEFAULT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* The programs width */<br />
&nbsp;&nbsp;CW_USEDEFAULT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* and height in pixels */<br />
&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* The window is a child-window to desktop */<br />
&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* No menu */<br />
&nbsp;&nbsp;hThisInstance,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Program Instance handler */<br />
&nbsp;&nbsp;NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* No Window Creation data */<br />
&nbsp;&nbsp;);</font></p>
<p><font face="Arial">&nbsp;/* Make the window visible on the screen */<br />
&nbsp;ShowWindow (hwnd, nCmdShow);</font></p>
<p><font face="Arial">&nbsp;/* Run the message loop. It will run until GetMessage() returns 0 */<br />
&nbsp;while (GetMessage (&amp;messages, NULL, 0, 0))<br />
&nbsp;{<br />
&nbsp;&nbsp;/* Translate virtual-key messages into character messages */<br />
&nbsp;&nbsp;TranslateMessage(&amp;messages);<br />
&nbsp;&nbsp;/* Send message to WindowProcedure */<br />
&nbsp;&nbsp;DispatchMessage(&amp;messages);<br />
&nbsp;}</font></p>
<p><font face="Arial">&nbsp;/* The program return-value is 0 - The value that PostQuitMessage() gave */<br />
&nbsp;return messages.wParam;<br />
}</font></p>
<font face="Arial">
<p><br />
/*&nbsp; This function is called by the Windows function DispatchMessage()&nbsp; */<br />
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)<br />
{<br />
&nbsp;HDC&nbsp;&nbsp;hdc;<br />
&nbsp;PAINTSTRUCT&nbsp;ps;<br />
&nbsp;RECT&nbsp;&nbsp;rect;<br />
&nbsp;TCHAR&nbsp;&nbsp;szHello[] = TEXT(&quot;Hello world!&quot;);</p>
<p>&nbsp;switch (message)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* handle the messages */<br />
&nbsp;{<br />
&nbsp;case WM_PAINT:<br />
&nbsp;&nbsp;hdc = BeginPaint(hwnd,&amp;ps); //begin painting<br />
&nbsp;&nbsp;GetClientRect(hwnd,&amp;rect); //get the size of client area<br />
&nbsp;&nbsp;DrawText(hdc,szHello,_tcslen(szHello),&amp;rect,DT_CENTER); //show &quot;hello world&quot;<br />
&nbsp;&nbsp;EndPaint(hwnd,&amp;ps); //end painting<br />
&nbsp;&nbsp;break;<br />
&nbsp;case WM_DESTROY:<br />
&nbsp;&nbsp;PostQuitMessage (0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* send a WM_QUIT to the message queue */<br />
&nbsp;&nbsp;break;<br />
&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* for messages that we don't deal with */<br />
&nbsp;&nbsp;return DefWindowProc (hwnd, message, wParam, lParam);<br />
&nbsp;}</p>
<p>&nbsp;return 0;<br />
}<br />
</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://soulmachine.javaeye.com/blog/75871#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Apr 2007 14:59:05 +0800</pubDate>
        <link>http://soulmachine.javaeye.com/blog/75871</link>
        <guid>http://soulmachine.javaeye.com/blog/75871</guid>
      </item>
      <item>
        <title>我现在想专注于C++，不知能不能冒险？</title>
        <author>soulmachine</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://soulmachine.javaeye.com">soulmachine</a>&nbsp;
          链接：<a href="http://soulmachine.javaeye.com/blog/72880" style="color:red;">http://soulmachine.javaeye.com/blog/72880</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>此贴已经关闭</p>
          <br/>
          <span style="color:red;">
            <a href="http://soulmachine.javaeye.com/blog/72880#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 16:31:16 +0800</pubDate>
        <link>http://soulmachine.javaeye.com/blog/72880</link>
        <guid>http://soulmachine.javaeye.com/blog/72880</guid>
      </item>
      <item>
        <title>高质量软件设计指南-C++/C（第二版）摘要</title>
        <author>soulmachine</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://soulmachine.javaeye.com">soulmachine</a>&nbsp;
          链接：<a href="http://soulmachine.javaeye.com/blog/68029" style="color:red;">http://soulmachine.javaeye.com/blog/68029</a>&nbsp;
          发表时间: 2007年04月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;
<h1 align="center" style="TEXT-ALIGN: center"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第五章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"> <span lang="EN-US">C++/C</span></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序设计入门</span></font><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><o:p></o:p></span></h1>
<p class="MsoNormal"><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准对</span><span lang="EN-US">main</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数有几个不同于一般函数的限制：</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）不能重载；（</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）不能内联；（</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）不能定义为静态的；（</span><span lang="EN-US">4</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）不能取其地址；（</span><span lang="EN-US">5</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）不能由用户直接调用；</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">int a ;<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中为声明，在</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为定义</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">C++/C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，全局变量（</span><span lang="EN-US">extern </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span> <span lang="EN-US">static</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）存放在程序的静态数据区中，在程序进入</span><span lang="EN-US">main</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前创建，在</span><span lang="EN-US">main</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结束之后销毁，因此我们的代码没有机会初始化它们。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全局的声明和定义应放在源文件的开头位置。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的访问控制策略是为了防止意外事件而不是为了防止对编译器的故意欺骗。</span><span lang="EN-US" style="COLOR: red"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">class Base{</span></p>
<p class="MsoNormal"><span lang="EN-US">public:</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual Say() {std::cout&lt;&lt;&rdquo;Base::Say() was invoked&rdquo;&lt;&lt;std::endl;}</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
<p class="MsoNormal"><span lang="EN-US">Class Derived:public Base{</span></p>
<p class="MsoNormal"><span lang="EN-US">private: </span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual Say() {std::cout&lt;&lt;&rdquo;Derived::Say() was invoked&rdquo;&lt;&lt;std::endl;}</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">测试</span></p>
<p class="MsoNormal"><span lang="EN-US">void test(void){</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base *p = new Derived;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>p-&gt;Say();<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">出乎意料的绑定到了一个</span><span lang="EN-US">private</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数上！</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型转换并不是改变原来的类型和值，而是生成了新的临时变元，其类型为目标类型。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准</span><span lang="EN-US">C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">允许非</span><span lang="EN-US">void </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型指针和</span><span lang="EN-US">void </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型指针互相转化，而标准</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只允许非</span><span lang="EN-US">void </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针转化为</span><span lang="EN-US">void </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型指针，反过来是需要强制转换。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">强制转换中的内存截断和内存扩张：</span><span lang="EN-US" style="COLOR: red"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">double d = 1000.25;</span></p>
<p class="MsoNormal"><span lang="EN-US">int *pInt = (int*)&amp;d;</span></p>
<p class="MsoNormal"><span lang="EN-US">int i = 100;</span></p>
<p class="MsoNormal"><span lang="EN-US">double *pDbl = (double*)&amp;i;</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要用前导&ldquo;</span><span lang="EN-US">_</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&rdquo;定义自己的标志符。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基本数据类型的字面常量、枚举常量、</span><span lang="EN-US">sizeof()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、常量表达式，不需要分配存储空间，编译时放到程序的符号表</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是</span><span lang="EN-US">ROM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，不能取地址</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中；而字符串常量、</span><span lang="EN-US">const</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">常量（尤其是</span><span lang="EN-US">ADT/UDT</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">const</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象）就要分配运行时存储空间。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">布尔变量与零值比较：</span><span lang="EN-US">if(flag) </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span><span lang="EN-US">if(!flag)</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">整型变量与零值比较：</span><span lang="EN-US">if(0==value ) </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span><span lang="EN-US"> if(0!=value)</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">浮点变量与零值比较：</span><span lang="EN-US">if(abs(x)&lt;=EPSILON) </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span><span lang="EN-US"> if(abs(x)&gt;=EPSILON)</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针变量与零值比较：</span><span lang="EN-US">if(NULL==p) </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span><span lang="EN-US"> if(NULL!=p)</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要忘记</span><span lang="EN-US">switch</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">default </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即使不需要。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果循环体中出现了</span><span lang="EN-US">continue</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句，要防止它跳过循环变量修改语句，因此最好把循环变量的修改放在前面。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你的循环是确定的，用</span><span lang="EN-US">for</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；不确定，用</span><span lang="EN-US">while</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">for</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中计数器一律用&ldquo;前闭后开法&rdquo;。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在多层嵌套的循环中，应尽可能把最长的循环放在最内层。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果循环体内存在逻辑判断，并且循环次数很大，宜将逻辑判断移到循环体的外面。</span></p>
<h1 align="center" style="TEXT-ALIGN: center"><font size="4"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第六章</span> <span lang="EN-US">C++/C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">常量</span></font></font></h1>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事实上只存在基本数据类型的字面常量。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，</span><span lang="EN-US">const</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义的常量是不能修改的变量，因此会给它分配空间</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">外连接的</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；但</span><span lang="EN-US">C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，对于基本类型常量放到符号表中，对于</span><span lang="EN-US">ADT/UDT</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">const</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象则需要分配内存。还有一些，如强制声明的</span><span lang="EN-US">extern</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的符号常量或取符号常量的地址，会分配存储空间。</span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: red"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">const long lng = 10;<span style="mso-spacerun: yes">&nbsp; </span><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">long *pl = (long*)&amp;lng;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">去取常量地址</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">*pl = 1000;<span style="mso-tab-count: 4">&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; </span>//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&ldquo;迂回修改&rdquo;</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">cout &lt;&lt; *pl &lt;&lt; endl;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//1000,</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改拷贝</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">cout &lt;&lt; lng &lt;&lt; endl;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//10</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，原始常量并没有修改</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于构造类型的</span><span lang="EN-US" style="COLOR: black">const </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，它成了编译时不允许修改的变量，但可以绕过。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">Class Integer<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Public:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Long m_lng;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">};<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">const Integer int_1;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">int_1.m_lng = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">Integer *pInt = (Integer*)&amp;int_1;<span style="mso-tab-count: 1">&nbsp; </span>//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">去除常熟性</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">pInt-&gt;m_lng = 1000;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">cout &lt;&lt; pInt-&gt;m_lng &lt;&lt; endl;<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//1000,</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">cout &lt;&lt; int_1.m_lng &lt;&lt; endl;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US" style="COLOR: black">//1000</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，&ldquo;迂回修改&rdquo;</span><span style="COLOR: black"> </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成功</span><span lang="EN-US" style="COLOR: black">!<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">理论上，只要能得到对象的地址，你就可以设法绕过编译器随意修改它，除非有操作系统的保护。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US" style="COLOR: black">C</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">符号常量默认是外连接的，也就是说不能在两个以上的源文件中定义一个同名的</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">符号常量，或这把一个</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">符号常量放在头文件中而在多个源文件爱您中包含该头文件。而</span><span lang="EN-US" style="COLOR: black">C++</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">默认是内连接的，每个编译单元编译时会分别为它们分配内存，在连接时进行常量折叠。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt; mso-list: l2 level1 lfo1; tab-stops: list 36.0pt"><span lang="EN-US" style="COLOR: black; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">（1）<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">常量有数据类型，而宏常量没有，因此没有类型检查。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt; mso-list: l2 level1 lfo1; tab-stops: list 36.0pt"><span lang="EN-US" style="COLOR: black; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">（2）<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有些调试工具可以对</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">常量进行调试。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此</span><span lang="EN-US" style="COLOR: black">C++</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中应尽量用</span><span lang="EN-US" style="COLOR: black">const </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而不用</span><span lang="EN-US" style="COLOR: black">#define</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">非静态</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据成员是属于每一个对象的成员，只在某个对象的生存期内常量，而对于整个类是可变的，除非是</span><span lang="EN-US" style="COLOR: black">static const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。因此不能在类声明中初始化非静态</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据成员，只能在构造函数的初始化列表中初始化。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如何建立在整个类中都恒定的类常量？</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US" style="COLOR: black">1</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）用枚举常量；（</span><span lang="EN-US" style="COLOR: black">2</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span><span lang="EN-US" style="COLOR: black">static const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">class A{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>enume<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SIZE1 = 100,SIZE2 = 200<o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span lang="EN-US" style="COLOR: black">};<o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span lang="EN-US" style="COLOR: black">int array1[SIZE1];<o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span lang="EN-US" style="COLOR: black">int array2[SIZE2]; <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">};<o:p></o:p></span></p>
<h1 align="center" style="TEXT-ALIGN: center"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第七章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"> </span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数设计基础</span><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><o:p></o:p></span></font></h1>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">连接的本质就是把一个名字的实现绑定到对它的每一个引用上。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果函数没有参数，那么使用</span><span lang="EN-US" style="COLOR: black">void </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而不要空着。因为标准</span><span lang="EN-US" style="COLOR: black">C</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把空参数列表解释为可以接受任何类型和任意个数的参数，而</span><span lang="EN-US" style="COLOR: black">C++</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解释为不接受任何实参。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般，输出参数放在前面，输入参数放在后面。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要忽略返回类型。</span><span lang="EN-US" style="COLOR: black">C</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">认为会返回</span><span lang="EN-US" style="COLOR: black">int</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了避免误解，应当将正常值和错误标志分开，即正常值用输出参数获得，而错误标志用</span><span lang="EN-US" style="COLOR: black">return </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句返回。如将标准</span><span lang="EN-US" style="COLOR: black">C</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US" style="COLOR: black">int getchar()</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">改为</span><span lang="EN-US" style="COLOR: black">bool GetChar(char*)</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就好多了。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尽管语法允许，但请不要在内层程序块中覆盖外层程序块的名字，否则会损害程序的可理解性。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">非静态全局函数和全局变量，名字空间的成员是外连接的。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在函数的入口处，建议用断言来检测参数的有效性。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">Use const whenever you need.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<h1 align="center" style="TEXT-ALIGN: center"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第八章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"> </span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数和指针</span></font><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><o:p></o:p></span></h1>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">int* a,b,c;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会理解为</span><span lang="EN-US" style="COLOR: black">int *a,b,c</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，因此不要用这种声明方式。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">向函数传递多维数组，不需要说明第一维大小而必须说明其它各维大小。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">任何成员函数都是独立于类的对象而存在的，所以能够取到一个成员函数的地址。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了与静态成员函数区别，取</span><span lang="EN-US" style="COLOR: black">virtual </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数和普通成员函数的地址必须要使用</span><span lang="EN-US" style="COLOR: black">&amp;</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运算符，但取静态成员函数地址不必要。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构造类型虽然可以嵌套定义，但其嵌套递定义的类型对象不一定就存在包含关系，存在包含关系的对象类型也不一定是嵌套定义的。当一个类型</span><span lang="EN-US" style="COLOR: black">A</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只会在另一个类型</span><span lang="EN-US" style="COLOR: black">B</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中被使用时，就可以把</span><span lang="EN-US" style="COLOR: black">A</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义在</span><span lang="EN-US" style="COLOR: black">B </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的定义体内，这样可以减少暴露在外面的用户自定义类型的个数。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<h1 align="center" style="TEXT-ALIGN: center"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第九章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"> </span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高级数据类型</span></font><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><o:p></o:p></span></h1>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">默认的拷贝赋值函数就是对象的位拷贝语义，但不能直接比较大小。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; COLOR: black; 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: 14pt; COLOR: black"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要定义超过类型最大维数的位域成员。、</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以定义匿名的位域成员，其语义是占位符。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以定义长度为</span><span lang="EN-US" style="COLOR: black">0 </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的位域成员，其作用是迫使下一个成员从下一个完整的机器字开始分配空间。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要让一个位域成员跨字节，这样会增加计算开销。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black">union<o:p></o:p></span></strong></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用一个成员存入而用另一个成员取出是可以的，但可能不是你想要的。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在定义联合变量时可以指定初值，但是只能指定一个初始值，且该初始值必须与联合的第一个成员的类型匹配。你可以取联合的地址，也可以取其成员的地址，它们都是联合的地址。你可以在同类型联合之间赋值，但你不能比较两个联合变量的大小，不光是因为肯能的填补字节，而且这两个变量可能存储着不同类型的成员，此时它们代表这两个不同类型的变量。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">C++</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对联合进行了扩充，除了数据成员还可以定义成员的访问说明符，可以定义成员函数，甚至可以定义构造函数和析构函数；但联合不能包含虚函数和静态数据成员，不能作为基类。</span><span lang="EN-US" style="COLOR: black">C++</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还支持匿名联合。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">匿名的枚举类型就相当于直接定义的</span><span lang="EN-US" style="COLOR: black">const</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">符号常量。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<h1 align="center" style="TEXT-ALIGN: center"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第十章</span><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"> C++/C </span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译预处理</span><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><o:p></o:p></span></font></h1>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US" style="COLOR: black">1</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）带参数的宏体和各个参数都应用括号括起来。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US" style="COLOR: black">2</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）不要在引用宏定义的参数列表用</span><span lang="EN-US" style="COLOR: black">++</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US" style="COLOR: black">--</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US" style="COLOR: black">3</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）带参数的宏定义不是函数，因此没有函数调用的开销，但是每一处宏扩展会生成重复代码，会使代码体积增大。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">给宏添加注释用</span><span lang="EN-US" style="COLOR: black">/*&hellip;*/</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，不要用</span><span lang="EN-US" style="COLOR: black">//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，因为有些编译器会把宏后面的行注释理解为宏的以部分。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">宏名用大写字母并在各个单词中间用&ldquo;</span><span lang="EN-US" style="COLOR: black">_</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&rdquo;隔开。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果要公布某个宏，那么宏定义应放在头文件中，否则放在源文件顶部。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要使用宏来定义新类型名，应使用</span><span lang="EN-US" style="COLOR: black">typedef</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"># </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构串操作符，</span><span lang="EN-US" style="COLOR: black">##</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">合并操作符。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<h1 align="center" style="TEXT-ALIGN: center"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第十一章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"> <span lang="EN-US">C++/C</span></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件结构和程序版式</span></font><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><o:p></o:p></span></h1>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">ADT/UDT</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版式：</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先</span><span lang="EN-US" style="COLOR: black">public </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后</span><span lang="EN-US" style="COLOR: black">private</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<h1 align="center" style="TEXT-ALIGN: center"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第十二章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"> <span lang="EN-US">C++/C</span></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用程序命名规则</span></font><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><o:p></o:p></span></h1>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类名、函数名首字母应大写，变量名、参数名首字母应小写。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">静态变量以</span><span lang="EN-US" style="COLOR: black">s_</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开头，全局变量以</span><span lang="EN-US" style="COLOR: black">g_</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开头，成员变量以</span><span lang="EN-US" style="COLOR: black">m_</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开头。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<h1 align="center" style="TEXT-ALIGN: center"><font style="BACKGROUND-COLOR: #003366"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第十三章</span><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"> C++/C</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向对象程序设计方法概述</span><span lang="EN-US" style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><o:p></o:p></span></font></h1>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编写拷贝赋值函数的原则：</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2"><span lang="EN-US" style="COLOR: black; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定要检查自赋值，地址相等时才认为是同一个对象；</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2"><span lang="EN-US" style="COLOR: black; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">(2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回本对象引用，用</span><span lang="EN-US" style="COLOR: black">return *this</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如：</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">String&amp; String::operator=(const String&amp; other){<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">检查自赋值</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(this != other){<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">释放原有的内存资源</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delete[] m_data;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分配新的内存资源，并复制内容</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int len = strlen(other.m_data);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m_data = new char[len + 1];<o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span lang="EN-US" style="COLOR: black">strcpy(m_data,other.m_data);<o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span lang="EN-US" style="COLOR: black">m_size = len;<o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span lang="EN-US" style="COLOR: black">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回本对象的引用</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return *this;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果不想编写，也不想让别人调用，可将拷贝构造函数和拷贝赋值函数声明为</span><span lang="EN-US" style="COLOR: black">private</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如何实现派生类的基本函数：</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo3"><span lang="EN-US" style="COLOR: black; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">派生类的构造函数应在其初始化列表里显式地调用基类的构造函数；</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo3"><span lang="EN-US" style="COLOR: black; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">(2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果基类是多态类，那么必须把基类的析构函数定义为虚函数。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如：</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">#include &lt;iostream&gt;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">class Base{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">public:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual ~Base() {std::cout&lt;&lt;&rdquo;Base::~Base()&rdquo;&lt;&lt;std::endl;}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">};<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">class Derived{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">public:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual ~Derived() { delete p_test;std::cout&lt;&lt;&rdquo;Derived::~Derived()&rdquo;&lt;&lt;std::endl;}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">private:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char *p_test;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">};<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">int main(void){<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base *pB = new Derived;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Delete pB;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return(0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="COLOR: black"><o:p>&</o:p></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://soulmachine.javaeye.com/blog/68029#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Apr 2007 18:26:27 +0800</pubDate>
        <link>http://soulmachine.javaeye.com/blog/68029</link>
        <guid>http://soulmachine.javaeye.com/blog/68029</guid>
      </item>
      <item>
        <title>C++Primer(第四版)摘要</title>
        <author>soulmachine</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://soulmachine.javaeye.com">soulmachine</a>&nbsp;
          链接：<a href="http://soulmachine.javaeye.com/blog/67694" style="color:red;">http://soulmachine.javaeye.com/blog/67694</a>&nbsp;
          发表时间: 2007年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第一章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">快速入门</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">main</font></span><span>函数的返回值必须是</span><span><font face="Times New Roman">int</font></span><span>型。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>在写</span><span><font face="Times New Roman">C++</font></span><span>程序时，大部分出现空格的地方可用换行符答题，但字符串字面量中的空格例外。另一个例外是空格不允许出现在预处理器指示中。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>任何允许有制表符、空格或换行的地方都允许放注释对。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第二章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">变量和基本类型</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>基本类型：</span><span><font face="Times New Roman">bool, char, wchar_t, short, int, logn, float, double, long double.</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>整型字面量默认类型为</span><span><font face="Times New Roman">int<span>&nbsp;&nbsp;</span></font></span><span>或</span><span><font face="Times New Roman"> long</font></span><span>。可在后加</span><span><font face="Times New Roman">L</font></span><span>、</span><span><font face="Times New Roman">l</font></span><span>或</span><span><font face="Times New Roman">U</font></span><span>、</span><span><font face="Times New Roman">u</font></span><span>以及</span><span><font face="Times New Roman">UL</font></span><span>指定其类型。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>浮点字面量默认为</span><span><font face="Times New Roman">double</font></span><span>，可在后加上</span><span><font face="Times New Roman">F</font></span><span>或</span><span><font face="Times New Roman">L</font></span><span>。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>可在字符字面量后加</span><span><font face="Times New Roman">L</font></span><span>使之成为</span><span><font face="Times New Roman">wchar_t</font></span><span>。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>连接字符串字面量和宽字符串字面量，其行为是未定义的。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">C++ </font></span><span>保留了一些词用作操作符替代用于支持某些不支持</span><span><font face="Times New Roman">C++ </font></span><span>操作符的字符集，这些词不能用作标志符，如：</span><span><font face="Times New Roman">and or nor xor&hellip;&hellip;</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">C++</font></span><span>还保留了一组标志符用于标准库，标志符不能包含两个连续的下划线，也不能以下划线开头后跟一个大写字符。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">C++</font></span><span>支持两种初始化：复制初始化和直接初始化：</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">int ival(1024);<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>//direct-initialization</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">int ival = 1024;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>//copy-initialization</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>非</span><span><font face="Times New Roman">const </font></span><span>引用只能绑定到同类型的对象；</span><span><font face="Times New Roman">const </font></span><span>引用则可绑定到相关但不同类型的对象或绑定到右值。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第三章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">标准库类型</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>在头文件中，请不要用</span><span><font face="Times New Roman">using </font></span><span>引入命名空间，要用完全限定的标准库名称。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>当</span><span><font face="Times New Roman">string </font></span><span>对象和字符串字面值混合连接时，</span><span><font face="Times New Roman">+ </font></span><span>操作符左右必须至少有一个</span><span><font face="Times New Roman">string </font></span><span>对象。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>现代</span><span><font face="Times New Roman">C++</font></span><span>程序员倾向于使用迭代器而不是下标。所有的标准库容器都定义了相应的迭代器，只有少数几种才定义了下标操作。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第四章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">数组和指针</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>非</span><span><font face="Times New Roman">const </font></span><span>变量和运行时才知道其值的</span><span><font face="Times New Roman"> const </font></span><span>变量不能用做数组的维数。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>允许</span><span><font face="Times New Roman">0</font></span><span>字面量或编译时获得</span><span><font face="Times New Roman">0</font></span><span>值的</span><span><font face="Times New Roman">const</font></span><span>变量赋给指针，但不允许将一个值为</span><span><font face="Times New Roman">0</font></span><span>的</span><span><font face="Times New Roman"> int </font></span><span>型变量赋给指针。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">void </font></span><span>指针只支持几种有限的操作：与另一个指针比较；向函数传递</span><span><font face="Times New Roman">void*</font></span><span>指针或返回</span><span><font face="Times New Roman">void* </font></span><span>指针；给另一个</span><span><font face="Times New Roman">void*</font></span><span>指针赋值。不允许使用</span><span><font face="Times New Roman">void* </font></span><span>指针操纵它所指向的对象。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>指针和引用的差别：引用必须在定义时初始化；引用总是指向同一个对象。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>两个指针的减法操作的结果是</span><span><font face="Times New Roman">ptrdiff_t </font></span><span>类型的。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-SIZE: 9pt; COLOR: blue">typedef</span><span style="FONT-SIZE: 9pt"> string *pstring;</span></p>
<p align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-SIZE: 9pt; COLOR: blue">const</span><span style="FONT-SIZE: 9pt"> pstring cstr;</span></p>
<p align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span>cstr</span><span>是一个指向<span>string </span>对象的 <span>const</span>指针！<span></span></span></p>
<p align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-SIZE: 9pt"></span></p>
<p align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span>动态分配数组时，如果数组元素具有类类型，将使用该类的默认构造函数实现初始化；如果数组元素是基本类型，则无初始化，但可在后加<span>()</span>强制初始化。<span></span></span></p>
<p align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-SIZE: 9pt"></span></p>
<p align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-SIZE: 9pt; COLOR: blue">char</span><span style="FONT-SIZE: 9pt"> *cp = <span style="COLOR: blue">new</span> <span style="COLOR: blue">char</span>[0];<span> </span><span style="COLOR: green">//ok,but can't be dereferenced</span></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>但是此指针可以进行比较运算，</span><span><font face="Times New Roman">+0</font></span><span>，</span><span><font face="Times New Roman">-0</font></span><span>。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第五章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">表达式</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>不要在一个表达式中对同一个变量进行多次</span><span><font face="Times New Roman">++ </font></span><span>或</span><font face="Times New Roman"> <span>&ndash; </span></font><span>操作。</span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第六章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">语句</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>只能在最后一个</span><span><font face="Times New Roman">case </font></span><span>或</span><span><font face="Times New Roman"> default </font></span><span>中定义变量，这是为了避免出现代码跳过变量定义和初始化的情况。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">goto </font></span><span>语句不能向后跳过变量定义语句。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>标准异常类型只定义了一个</span><span><font face="Times New Roman">what </font></span><span>函数，返回一个</span><span><font face="Times New Roman">C</font></span><span>字符串。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第七章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">函数</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>函数不能返回另一个函数或数组，但可以返回指向它们的指针。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">将引用或指针形参定义为</span><span style="COLOR: red"><font face="Times New Roman">const </font></span><span style="COLOR: red">来重载函数是合法的。</span><span style="COLOR: red"></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第八章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">标准</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman">IO</font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">库</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">IO </font></span><span>对象不可复制或赋值。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第九章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">顺序容器</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>将一个容器复制给另一个容器时，类型必须精确匹配。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">vector<int></int> ivec;</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">vector<int></int> ivec2(ivec);<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>//ok</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">vector<double></double>dvec(ivec);<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>//error</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">list<int></int> ilist(ivec);<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>//error</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">stack </font></span><span>可用三个做容器；</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">queue</font></span><span>需要基本容器支持</span><span><font face="Times New Roman">push_front </font></span><span>操作，只能用</span><span><font face="Times New Roman">deque </font></span><span>和</span><font face="Times New Roman"> <span>list </span></font><span>；</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman">priority_queue </font></span><span>要求基本容器有随机访问功能，只能用</span><span><font face="Times New Roman">vector </font></span><span>和</span><font face="Times New Roman"> <span>deque</span></font><span>。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第十章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">关联容器</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>关联容器不能通过大小来定义，因为这样的话就无法知道键所对应的值是什么。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span></span></p>
<span>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第十一章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">泛型算法</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第十二章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">类</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>构造函数分两个阶段执行：</span><span><font face="Times New Roman">(1)</font></span><span>初始化阶段；</span><span><font face="Times New Roman">(2)</font></span><span>计算阶段。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>必须对</span><span><font face="Times New Roman">const </font></span><span>或引用类型成员以及没有默认构造函数的类类型成员使用初始化式。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>在初始化式避免使用成员初始化另一个成员。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>当构造函数被声明为</span><span><font face="Times New Roman">explicit </font></span><span>，编译不使用它作为类型转换操作符。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">当一个类设为友元，友元类的所有方法可以访问自己的非共有成员。</span><span style="COLOR: red"></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red"><font face="Times New Roman">static </font></span><span style="COLOR: red">数据成员必须在类定义体外定义。</span><span style="COLOR: red"><font face="Times New Roman">(P401)</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red"><font face="Times New Roman">const static </font></span><span style="COLOR: red">数据成员在类的定义体中初始化时，该数据成员仍必须在类定义外定义。</span><span style="COLOR: red"><font face="Times New Roman">(P401)</font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red"><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第十三章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">复制控制</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>合成拷贝构造函数直接复制内置类型成员的值，类类型成员使用该类的拷贝构造函数进行复制，数组成员则复制其每一个数组元素。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>为了防止复制，可以将拷贝构造函数声明为</span><span><font face="Times New Roman">private </font></span><span>；如果想连友元和成员中的复制也禁止，就可以声明一个</span><span><font face="Times New Roman">private </font></span><span>拷贝构造函数。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<h1 align="center" style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">第十四章</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%">重载操作符和转换、</span><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 240%"></span></h1>
<p style="MARGIN: 0cm 0cm 0pt"><span>重载操作符必须具有一个类类型操作数。</span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span>重载操作符并不保证操作数的求值顺序。</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l5 level1 lfo1"><font face="Times New Roman"><span><span>(1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span>=</span></font><span>、</span><span><font face="Times New Roman">[]</font></span><span>、</span><span><font face="Times New Roman">()</font></span><span>、</span><span><font face="Times New Roman">-&gt;</font></span><span>必须重载为成员函数，