﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-我的编程乐园-文章分类-C/C++</title><link>http://www.cppblog.com/deercoder/category/11912.html</link><description>身是菩提树，
      心如明镜台；
               时时勤拂拭，
                     莫使惹尘埃</description><language>zh-cn</language><lastBuildDate>Sat, 27 Mar 2010 14:30:49 GMT</lastBuildDate><pubDate>Sat, 27 Mar 2010 14:30:49 GMT</pubDate><ttl>60</ttl><item><title>cin读取失败后进入死循环？-------剖析输入流的条件</title><link>http://www.cppblog.com/deercoder/articles/110696.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Sat, 27 Mar 2010 13:59:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/110696.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/110696.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/110696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/110696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/110696.html</trackback:ping><description><![CDATA[<div id=blog_text class=cnt>
<p><font color=#ff0000><strong>考虑如下代码：</strong></font></p>
<p>&#160;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_53_171_Open_Image onclick="this.style.display='none'; Codehighlighter1_53_171_Open_Text.style.display='none'; Codehighlighter1_53_171_Closed_Image.style.display='inline'; Codehighlighter1_53_171_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_53_171_Closed_Image onclick="this.style.display='none'; Codehighlighter1_53_171_Closed_Text.style.display='none'; Codehighlighter1_53_171_Open_Image.style.display='inline'; Codehighlighter1_53_171_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_53_171_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_53_171_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">input&nbsp;a&nbsp;integer&nbsp;(1-&nbsp;10)&nbsp;:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,cin</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">a,</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;a</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">))<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">try&nbsp;again!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p><br><br>本意是让用户选择一个1-10的数，如果不是1-10的数则重新输入。</p>
<p><font color=#ff0000><strong>分析：</strong></font></p>
<p>如果用户输入了一个不在1-10的 int，那么，程序会正确的执行，并且提示用户重新输入。</p>
<p>但是如果用户错误的输入了一个字符char，那么，后果就是一直执行while循环！</p>
<p><strong><font color=#ff0000>错误分析：</font></strong></p>
<p>当cin尝试将输入的字符读为int型数据失败后，会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据，输入流必须处于无错误状态。因此，由于错误状态的存在，会一直执行while循环。</p>
<p><font color=#ff0000><strong>错误修正：</strong></font></p>
<p><font color=#0000ff>#include &lt;iostream&gt;<br>using namespace std;</font></p>
<p><font color=#0000ff>int main()<br>{<br>int a;<br>while(cout&lt;&lt;"input a integer (1-10) :",cin&gt;&gt;a,! (a&gt;=1 &amp;&amp; a&lt;=10) || cin.fail())<br>{<br>&nbsp;&nbsp; cout&lt;&lt;"try again!"&lt;&lt;endl;<br>&nbsp;&nbsp; cin.clear(); //清除std::cin的错误状态<br>&nbsp;&nbsp; cin.sync(); //清空输入缓冲区<br>}<br>return 0;<br>}</font></p>
<p>加上判断输入是否成功的cin.fail()以及修正错误输入的cin.clear()和cin.sync();</p>
<p>其中std::cin.sync();这一句必不可少，因为所有从标准输入设备输入的数据都是先保存在缓冲区中，然后istream对象再从缓冲区中进行提取。如果不清空缓存，下次在读取数据的时候又会再次产生错误，也会陷入死循环。<br><br><br><br><br></p>
</div>
<br><script language=javascript type=text/javascript>
/*<![cdata[*/
function HI_MOD_IN_RELATED_DOC_CALLBACK(arg){
if(arg.length <= 1) return false;
var hasMore = arg[0];
var D=function(A,B){A[A.length]=B;}
if(arg.length % 2 == 0) D(arg, ["","","",""]);
var html = ['
<div id="in_related_doc">
<div class="tit">相关文章：</div>
'];
D(html, '
<table cellpadding="0" cellspacing="3" border="0">
    ');
    for(var i = 1, j = arg.length; i <j; i += 2){
    D(html, '
    <tr>
        ');
        D(html, '
        <td width="15px"><a style="font-size:25px" >&#8226;</a></td>
        <td><a href="http://hi.baidu.com/' + arg[i][3] + '/blog/item/' + arg[i][2] + '.html" href_cetemp="http://hi.baidu.com/' + arg[i][3] + '/blog/item/' + arg[i][2] + '.html" target="_blank" title="' + arg[i][0] + '">' + arg[i][1] + '</a>');
        D(html, new Array(10).join('\u3000'));
        D(html, '</td>
        ');
        if(arg[i + 1][0] != "")
        D(html, '
        <td width="15px"><a style="font-size:25px" >&#8226;</a></td>
        <td><a href="http://hi.baidu.com/' + arg[i + 1][3] + '/blog/item/' + arg[i + 1][2] + '.html" href_cetemp="http://hi.baidu.com/' + arg[i + 1][3] + '/blog/item/' + arg[i + 1][2] + '.html" target="_blank" title="' + arg[i + 1][0] + '">' + arg[i + 1][1] + '</a></td>
        ');
        else
        D(html, '
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        ');
        D(html, '
    </tr>
    ');
    }
    if(hasMore) D(html, '
    <tr>
        <td colspan="4"><a target="_blank" href="/sys/search?pageno=1&type=7&sort=1&word=cin%CA%E4%C8%EB%C1%F7%20fail%28%29%20clear%28%29%20sync%28%29%20%5BC%2B%2B%5D%28Zz%29&item=2e515b8668d74720c75cc351" href_cetemp="/sys/search?pageno=1&type=7&sort=1&word=cin%CA%E4%C8%EB%C1%F7%20fail%28%29%20clear%28%29%20sync%28%29%20%5BC%2B%2B%5D%28Zz%29&item=2e515b8668d74720c75cc351">更多&gt;&gt;</a></td>
    </tr>
    ');
    D(html, '
</table>
</div>
<div class="line">&nbsp;</div>
');
var div = document.getElementById('in_related_tmp');
if(div){
div.innerHTML = html.join('');
while(div.firstChild){
div.parentNode.insertBefore(div.firstChild, div);
}
div.parentNode.removeChild(div);
}
window.setTimeout("tracker_init('in_related_doc')",100);
}
if(RelatedDocData == -1){	// not supported xhr
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = '/sys/search?type=8&word=cin%CA%E4%C8%EB%C1%F7%20fail%28%29%20clear%28%29%20sync%28%29%20%5BC%2B%2B%5D%28Zz%29&item=2e515b8668d74720c75cc351&t=' + new Date().getTime();
document.getElementsByTagName('HEAD')[0].appendChild(script);
}else if(RelatedDocData == null){
GetAndEval = true;
}else{
eval(RelatedDocData);
}
/*]]&gt;*/
</script>
<div id=in_reader>转自：<a href="http://hi.baidu.com/luosiyong/blog/item/384f9d8b0280b8799e2fb4c8.html"><u><font color=#0066cc>http://hi.baidu.com/luosiyong/blog/item/384f9d8b0280b8799e2fb4c8.html</font></u></a></div>
<img src ="http://www.cppblog.com/deercoder/aggbug/110696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2010-03-27 21:59 <a href="http://www.cppblog.com/deercoder/articles/110696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的tips </title><link>http://www.cppblog.com/deercoder/articles/105216.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Fri, 08 Jan 2010 16:20:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/105216.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/105216.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/105216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/105216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/105216.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<span style="FONT-SIZE: 14pt">题记：一直以来都被一些细节忽略了，然后，遇到很多的问题就杯具了&#8230;&#8230;从现在开始，觉得很有必要从小事做起，认真的来看看曾经犯过的错误，做过的事情。特别是对于曾经以为很习以为常的事情，要特别的重视，于是便有了tips，下面不断的更新中&#8230;&#8230;&#8230;&#8230; </span></p>
<p><span style="FONT-SIZE: 14pt">题外话：（<span style="COLOR: red">如何在Office 2007中创建并发布博文？</span>）今天发现可以在Word 2007中编辑博客，然后直接点击发布，就可以发布到C++博客网上了，很贴心的服务，不是吗？其实这个也是Office的一个功能，在新建中，点击新建博客文章，就可以创建一个新的blog，然后会提示你创建一个账户，估计这个是最关键的，需要选择其他运营商，然后下一步，会有个API让你选择，选择下面的按个MetaWebLog，然后输出你的账号密码，这里的昂URL，不是你的主页的，开始的时候我也是选择这个，错误，连接不上。需要的是：在你的主页上，点击管理，然后点击选项，下面有个configure选项，进入后，最下面就有一个你的那个URL了，添加进去，OK！然后就可以发布了！ </span></p>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 14pt">下面开始正式的tips： </span></p>
<ol>
    <li>
    <div><span style="FONT-SIZE: 14pt">int到底占用多少个字节？ </span></div>
    <p><span style="FONT-SIZE: 14pt">一直以来都被这个问题纠结，因为上过汇编和C的课，然后又看了《C++ Primer》一书，总是会出现各种的不一致，如果按照平时我们的认为，都是4个Byte（字节），可是无奈很多书上讲解不一致，所以造成了迷惑&#8230;&#8230;今天找时间上网搜了下，发现答案很多，不过大致上都是一个解答，于是我也就凭借自己的思考，来说说了。 </span></p>
    <p><span style="FONT-SIZE: 14pt">答：首先摘录网上的朋友们的留言： </span></p>
    </li>
</ol>
<div>
<table style="BORDER-COLLAPSE: collapse" border=0>
    <colgroup>
    <col style="WIDTH: 590px"></colgroup>
    <tbody vAlign=top>
        <tr style="HEIGHT: 65px">
            <td style="BORDER-BOTTOM: #4f81bd 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: #4f81bd 1pt solid; BORDER-RIGHT: medium none">
            <p><span style="COLOR: #365f91"><strong>int的字节长度是由CPU和操作系统编译器共同决定的，一般情况下，主要是由操作系统决定，比如，你在64位AMD的机器上安装的是32位操作系统，那么，int默认是32位的；如果是64位操作系统，64位操作系统分为两种，1种是int为32位long为64位，2种int long均为64位。之所以说int同时也与编译器有关，编译器完全可以在32位系统模拟64位整数，例如Unix/Linux下的long long和Windows下的__int64均为64位整数。</strong></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<div>
<table style="BORDER-COLLAPSE: collapse" border=0>
    <colgroup>
    <col style="WIDTH: 590px"></colgroup>
    <tbody vAlign=top>
        <tr>
            <td style="BORDER-BOTTOM: #4f81bd 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: #4f81bd 1pt solid; BORDER-RIGHT: medium none">
            <p><span style="COLOR: #365f91"><strong>机器第一作用，编译器第二作用. <br>现在新出的机器开始有64位的，编译器也逐渐的要适应这个改变，由32位向64位过渡. <br>如果机器是16位的，编译器强制为32位的话，效率及其低下，没那家厂商会做如此SB的事情， <br>我们现在的机器一般都是32位的，编译器所以一般也是32位，但也支持64位的， <br>__int64&nbsp; 就是64字节的， <br>总之int 只是一个类型，没有太大的意义，机器的位数才是关键所在! <br>离开机器，说有编译器决定的人，实在不敢恭维. <br>难道要在8位机上实现64bit的编译器? <br>机器进步了，编译器跟不上，就要被淘汰， <br>编译器超前了，效率低下，也不会有市场， <br>所以不要单纯的讨论编译器或者机器了。 <br>OVER！</strong></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<div>
<table style="BORDER-COLLAPSE: collapse" border=0>
    <colgroup>
    <col style="WIDTH: 590px"></colgroup>
    <tbody vAlign=top>
        <tr>
            <td style="BORDER-BOTTOM: #4f81bd 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: #4f81bd 1pt solid; BORDER-RIGHT: medium none">
            <p><span style="COLOR: #365f91"><strong><br>int仅是语言标准中的一项定义，定义了这类数据的性质、范围、操作等； <br>具体少长，标准并未硬性规定，而由编译器自行决定，甚至编译器也可由用户根据需要自行设定。 <br>基于此，可认为还是受编译器决定，所谓县官不如现管。</strong></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 14pt">综合上面的说法，我也觉得对于int到底占用多少个字节，其实是和机器以及编译器都有关系。这么来说吧，我觉得机器起决定性作用，如果是32位机，那么在这个平台上面运行的编译器，可以使32位版本的，也可以是16位版本的（向下兼容，只不过浪费了好机子，没有充分发挥效果），这也就是说我们在网上下载驱动的时候，有时候会发现官网上面有32位操作系统Windows版本和64位操作系统Windows的不同分类了。而决定这个位数的，就是你的CPU，也就是机器。 </span></p>
<p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 14pt">但是，编译器没有必要一定要这么做，对于TC 2.0这样的16位软件，曾经在Dos下呼风唤雨，但是到了32位机下，仍然是可以用的，这样的话，也就是说，它运算的结果是2个字节，可是因为软件的限制，只能够模拟出来16位机，所以虽然可以在32位上面跑，但是不能反映实际的字长。但是，没有多少人会在32位机子上面模拟出128位或者64位，因为这样寻址的话效率很低下，硬件条件没有达到，利用软件来模拟是不够的。于是，就是上面的那种说法。由于VC以及其他软件更新很快，而且及时开发了Win 32下的版本，所以是32位软件，也就是说，它计算处理的int是4个字节。 </span></p>
<p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 14pt">当然，我们需要知道的是，标准并没有规定int一定要是多少个字节，而只是规定了一个范围，只要你不越轨，那么肯定就没有问题，至于实现，那是你编译器的开发的事情，跟我无关。同样，CPU和机器的制造者，关心的是如何提高计算机的性能，让寻址方式更大，范围更长，也就是位数越多，（这也是为何目前的那些机器都朝着64位或者更高位发展的目的），而软件开发者，面临的则是需要来适应硬件的更新，从而做出更好的软件，充分利用到这个性能。 </span></p>
<p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 14pt">当然，这个问题本身没有多少讨论的价值，不过，如果在面试或者考试中，遇到sizeof的操作，最好问清楚是在32位机子下还是16位或者是64位，这个能够反映你的严谨和认真。 </span></p>
<p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 14pt">注： 32位下：1int = 4 Byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16位下：1 int = 2B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(当然，一般都不会考虑那个TC 2.0的) </span></p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p><span style="FONT-SIZE: 14pt">2).普通类的继承中，如果派生类中的函数和基类函数同名时，是否会覆盖原来的那个函数？ </span></p>
<p><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;在java中，很明显是会覆盖的，因为继承的特性，注意同名函数，要求还有原型相同，否则的话，调用的时候是可以区分开来的，而当原型相同的时候，那么派生类会继承基类的函数，同时由于有一个自己的函数，所以两个同名，同原型的函数，是会发生覆盖的。 </span></p>
<p><span style="FONT-SIZE: 14pt">上代码看之： </span></p>
<div>
<table style="BORDER-COLLAPSE: collapse" border=0>
    <colgroup>
    <col style="WIDTH: 590px"></colgroup>
    <tbody vAlign=top>
        <tr>
            <td style="BORDER-BOTTOM: black 0.5pt solid; BORDER-LEFT: black 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: black 0.5pt solid; BORDER-RIGHT: black 0.5pt solid">
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">#include &lt;iostream&gt; </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">using namespace std; </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">class A </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">{ </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;public: </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void moveto(){cout &lt;&lt; "1" &lt;&lt; endl;} </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">}; </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">class B:public A </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">{ </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;public: </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void moveto(){cout &lt;&lt; "2" &lt;&lt; endl;} </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">}; </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">int main() </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">{ </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;A a; </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;B b; </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;A *pstra = &amp;b; </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">B *pstrb = (B *)&amp;a; </span></span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;pstra-&gt;moveto(); </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;<strong>pstrb-&gt;moveto</strong>(); </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;a.moveto(); </span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;<strong>b.A::moveto(); </strong></span></p>
            <p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;return 0; </span></p>
            <p><span style="FONT-SIZE: 12pt">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span style="FONT-SIZE: 14pt">输出的结果是： </span></p>
<p><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img border=0 src="http://www.cppblog.com/images/cppblog_com/deercoder/sfe.jpg" width=443 height=299></span></p>
<p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 14pt">从上面的结果可以看到，派生类的指针是调用派生类的对应的函数，配套的，而且还选择作用域较小的，而这样的优先级就要高些。这里有一个强制类型转换，因为是要将派生类的指针指向基类的对象，会发生截断，所以<span style="COLOR: red">一定</span>要强制类型转换，与此对比的是，基类的指针指向派生类的话不需要强制类型转换也可以实现。从结果可以看到，如果实行了转换，那么还是声明时候的类型，所以抓住了这点，声明时是B类型的，那么就调用B的moveto，所以输出时2，下面的另外一些的输出，就都是1了，也可以看到，如果要显示的调用被隐藏的基类，需要用作用域限定符来指示。 </span></p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;2.隐藏的this指针不是实际的一个参数，也就是说，实际调用函数中，不能够使用这个参数。<br>上代码：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_75_415_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_415_Open_Text.style.display='none'; Codehighlighter1_75_415_Closed_Image.style.display='inline'; Codehighlighter1_75_415_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_75_415_Closed_Image onclick="this.style.display='none'; Codehighlighter1_75_415_Closed_Text.style.display='none'; Codehighlighter1_75_415_Open_Image.style.display='inline'; Codehighlighter1_75_415_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;STRING</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_75_415_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_75_415_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">str;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;STRING(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;STRING(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;strlen(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;strcmp(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">STRING();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_441_446_Open_Image onclick="this.style.display='none'; Codehighlighter1_441_446_Open_Text.style.display='none'; Codehighlighter1_441_446_Closed_Image.style.display='inline'; Codehighlighter1_441_446_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_441_446_Closed_Image onclick="this.style.display='none'; Codehighlighter1_441_446_Closed_Text.style.display='none'; Codehighlighter1_441_446_Open_Image.style.display='inline'; Codehighlighter1_441_446_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">STRING::STRING(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_441_446_Closed_Text>/**/</span><span id=Codehighlighter1_441_446_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">=0</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_448_500_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_448_500_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[::strlen(s)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;::strcpy(str,s);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_519_534_Open_Image onclick="this.style.display='none'; Codehighlighter1_519_534_Open_Text.style.display='none'; Codehighlighter1_519_534_Closed_Image.style.display='inline'; Codehighlighter1_519_534_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_519_534_Closed_Image onclick="this.style.display='none'; Codehighlighter1_519_534_Closed_Text.style.display='none'; Codehighlighter1_519_534_Open_Image.style.display='inline'; Codehighlighter1_519_534_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">STRING::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">STRING()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_519_534_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_519_534_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;str;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_566_619_Open_Image onclick="this.style.display='none'; Codehighlighter1_566_619_Open_Text.style.display='none'; Codehighlighter1_566_619_Closed_Image.style.display='inline'; Codehighlighter1_566_619_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_566_619_Closed_Image onclick="this.style.display='none'; Codehighlighter1_566_619_Closed_Text.style.display='none'; Codehighlighter1_566_619_Open_Image.style.display='inline'; Codehighlighter1_566_619_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;STRING::strlen(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_566_619_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_566_619_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;::strlen(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">str)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">采用字符串的通用表示，不含null</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_662_699_Open_Image onclick="this.style.display='none'; Codehighlighter1_662_699_Open_Text.style.display='none'; Codehighlighter1_662_699_Closed_Image.style.display='inline'; Codehighlighter1_662_699_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_662_699_Closed_Image onclick="this.style.display='none'; Codehighlighter1_662_699_Closed_Text.style.display='none'; Codehighlighter1_662_699_Open_Image.style.display='inline'; Codehighlighter1_662_699_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;STRING::strcmp(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_662_699_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_662_699_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;::strcmp(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">str,b.str);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_743_788_Open_Image onclick="this.style.display='none'; Codehighlighter1_743_788_Open_Text.style.display='none'; Codehighlighter1_743_788_Closed_Image.style.display='inline'; Codehighlighter1_743_788_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_743_788_Closed_Image onclick="this.style.display='none'; Codehighlighter1_743_788_Closed_Text.style.display='none'; Codehighlighter1_743_788_Open_Image.style.display='inline'; Codehighlighter1_743_788_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">STRING::</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_743_788_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_743_788_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;::strcat(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">str,b.str);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_832_869_Open_Image onclick="this.style.display='none'; Codehighlighter1_832_869_Open_Text.style.display='none'; Codehighlighter1_832_869_Closed_Image.style.display='inline'; Codehighlighter1_832_869_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_832_869_Closed_Image onclick="this.style.display='none'; Codehighlighter1_832_869_Closed_Text.style.display='none'; Codehighlighter1_832_869_Open_Image.style.display='inline'; Codehighlighter1_832_869_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">STRING::</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_832_869_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_832_869_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">str&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b.str;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_914_959_Open_Image onclick="this.style.display='none'; Codehighlighter1_914_959_Open_Text.style.display='none'; Codehighlighter1_914_959_Closed_Image.style.display='inline'; Codehighlighter1_914_959_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_914_959_Closed_Image onclick="this.style.display='none'; Codehighlighter1_914_959_Closed_Text.style.display='none'; Codehighlighter1_914_959_Open_Image.style.display='inline'; Codehighlighter1_914_959_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">STRING::</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;STRING&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_914_959_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_914_959_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;::strcat(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">str,b.str);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1002_1023_Open_Image onclick="this.style.display='none'; Codehighlighter1_1002_1023_Open_Text.style.display='none'; Codehighlighter1_1002_1023_Closed_Image.style.display='inline'; Codehighlighter1_1002_1023_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1002_1023_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1002_1023_Closed_Text.style.display='none'; Codehighlighter1_1002_1023_Open_Image.style.display='inline'; Codehighlighter1_1002_1023_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">STRING::</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1002_1023_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1002_1023_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">str;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_1036_1228_Open_Image onclick="this.style.display='none'; Codehighlighter1_1036_1228_Open_Text.style.display='none'; Codehighlighter1_1036_1228_Closed_Image.style.display='inline'; Codehighlighter1_1036_1228_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1036_1228_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1036_1228_Closed_Text.style.display='none'; Codehighlighter1_1036_1228_Open_Image.style.display='inline'; Codehighlighter1_1036_1228_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1036_1228_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1036_1228_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;STRING&nbsp;s(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello,world</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;STRING&nbsp;e(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">I&nbsp;Love&nbsp;C++</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">STRING:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\t&nbsp;strlen:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;s.strlen()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">STRING:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;e&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\t&nbsp;strlen:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;strlen(e)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp; 仅仅看输出，前面的一个是调用类函数strlen，没有参数，看到没有，如果有参数的话，就是下面的那个，那么此时就是调用的系统函数了。两者的输出不一样，我特意在自定义的strlen函数上面加5以表示区别，最后果然，前者就是调用自己的函数。<br>得到的结论就是，类的成员函数，都是有一个默认的this指针的，这个没有错，不过这个是编译器加的，我们手动是不能自己占有的，也就是说不能理解为有一个参数，然后放上面去，自己定义的是void参数，就没有参数，编译器加的是它的事情，那个地方提供给我们用户使用的就是无参的函数。此点要铭记，而且，即使你调用无参的，在具体编译器处理的时候，还是会给你加上，所以这部分你根本用不上，也不需要担心。</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt">&nbsp;</p>
<p style="MARGIN-LEFT: 36pt"><span style="FONT-SIZE: 14pt"></span>&nbsp;</p>
<img src ="http://www.cppblog.com/deercoder/aggbug/105216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2010-01-09 00:20 <a href="http://www.cppblog.com/deercoder/articles/105216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中形参和数据成员同名的情况</title><link>http://www.cppblog.com/deercoder/articles/105124.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Thu, 07 Jan 2010 15:46:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/105124.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/105124.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/105124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/105124.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/105124.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在C++中，如果出现函数的形参和类的数据成员同名的情况，一定不要为了图简省而使用下面的写法。例： </p>
<div>
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 590px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-left: 7px; padding-right: 7px;">
            <p>#include &lt;iostream&gt; </p>
            <p>using namespace std; </p>
            <p>&nbsp;</p>
            <p>class A </p>
            <p>{ </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;int x; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;int y; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;public : </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A(int x,int y); </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void print(); </p>
            <p>}; </p>
            <p>&nbsp;</p>
            <p><span style="color: red;">A::A(int x,int y) </span></p>
            <p><span style="color: red;">{ </span></p>
            <p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;x = x; </span></p>
            <p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;y = y; </span></p>
            <p><span style="color: red;">} </span></p>
            <p>void A::print() </p>
            <p>{ </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "x:" &lt;&lt; x &lt;&lt; " y: " &lt;&lt; y &lt;&lt; endl; </p>
            <p>} </p>
            <p>int main() </p>
            <p>{ </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;A *a = new A(34,56); </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;a-&gt;print(); </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;delete a; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;return 0; </p>
            <p>}&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>在红色部分突出显示的就是错误的写法，实际上，形参的值根本没有传入到这个函数中，而在你输出的时候，根本没有x，y的值，也就是一个随机的。说明形参根本没有传入。 </p>
<p>这个也是Java中遇到的，如果有这种情况，java中用到的是this引用来显示的圈定范围，而C++中，也需要用this指针来显示的解决这个问题。或者用作用域限定符来解决。 </p>
<p>更改后才会出现正确的结果，而以前，自己一直都没有注意到。 </p>
<p>为何会这样呢？因为按照范围从小到大的顺序，形参的范围更小，所以替换的就是恒等式，那么自然不会显示的来给成员赋值，因为类的成员作用范围更小，此处，要谨记。 </p>
<p>而且对于Java也是一样，都要显示的来指出。 </p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/deercoder/aggbug/105124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2010-01-07 23:46 <a href="http://www.cppblog.com/deercoder/articles/105124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>特殊成员变量的初始化</title><link>http://www.cppblog.com/deercoder/articles/104790.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Mon, 04 Jan 2010 14:58:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/104790.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/104790.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/104790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/104790.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/104790.html</trackback:ping><description><![CDATA[<p>有些成员变量的数据类型比较特别，它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括：</p>
<p><br>a.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 常量型成员变量</p>
<p>b.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用型成员变量</p>
<p>c.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 静态成员变量</p>
<p>d.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 整型静态常量成员变量</p>
<p>e.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非整型静态常量成员变量</p>
<p>&nbsp;</p>
<p><br>对于常量型成员变量和引用型成员变量的初始化，必须通过构造函数初始化列表的方式进行。在构造函数体内给常量型成员变量和引用型成员变量赋值的方式是行不通的。</p>
<p>&nbsp;</p>
<p>静态成员变量的初始化也颇有些特别。</p>
<p>&nbsp;</p>
<p>参考下面的代码以及其中注释：</p>
<p>// Initialization of Special Data Member</p>
<p>#include &lt;iostream&gt;</p>
<p>using namespace std;</p>
<p>&nbsp;</p>
<p>class BClass</p>
<p>{</p>
<p>public:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BClass() : i(1), ci(2), ri(i)&nbsp;&nbsp; // 对于常量型成员变量和引用型成员变量，必须通过</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 参数化列表的方式进行初始化。在构造函数体内进</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 行赋值的方式，是行不通的。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void print_values()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "i =\t" &lt;&lt; i &lt;&lt; endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "ci =\t" &lt;&lt; ci &lt;&lt; endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "ri =\t" &lt;&lt; ri &lt;&lt; endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "si =\t" &lt;&lt; si &lt;&lt; endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "csi =\t" &lt;&lt; csi &lt;&lt; endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "csi2 =\t" &lt;&lt; csi2 &lt;&lt; endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "csd =\t" &lt;&lt; csd &lt;&lt; endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>private:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 普通成员变量</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int ci;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 常量成员变量</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int &amp;ri;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 引用成员变量</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static int si;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 静态成员变量</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //static int si2 = 100;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // error: 只有静态常量成员变量，才可以这样初始化</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static const int csi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 静态常量成员变量</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static const int csi2 = 100;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 静态常量成员变量的初始化(Integral type)&nbsp;&nbsp;&nbsp; (1)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static const double csd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 静态常量成员变量(non-Integral type)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //static const double csd2 = 99.9;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // error: 只有静态常量整型数据成员才可以在类中初始化</p>
<p>};</p>
<p>&nbsp;</p>
<p>// 静态成员变量的初始化(Integral type)</p>
<p>int BClass::si = 0;</p>
<p>// 静态常量成员变量的初始化(Integral type)</p>
<p>const int BClass::csi = 1;</p>
<p>// 静态常量成员变量的初始化(non-Integral type)</p>
<p>const double BClass::csd = 99.9;</p>
<p>&nbsp;</p>
<p>// 在初始化(1)中的csi2时，根据Stanley B. Lippman的说法下面这行是必须的。</p>
<p>// 但在VC2003中如果有下面一行将会产生错误，而在VC2005中，下面这行则可有可无，</p>
<p>// 这个和编译器有关。</p>
<p>const int BClass::csi2;</p>
<p>&nbsp;</p>
<p>int main(void)</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BClass b_class;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b_class.print_values();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</p>
<p>}</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/pathuang68/archive/2009/11/25/4867323.aspx">http://blog.csdn.net/pathuang68/archive/2009/11/25/4867323.aspx</a></p>
<img src ="http://www.cppblog.com/deercoder/aggbug/104790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2010-01-04 22:58 <a href="http://www.cppblog.com/deercoder/articles/104790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++中的字符串字面值</title><link>http://www.cppblog.com/deercoder/articles/104213.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Sun, 27 Dec 2009 10:48:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/104213.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/104213.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/104213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/104213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/104213.html</trackback:ping><description><![CDATA[<div style="BORDER-BOTTOM: #4f81bd 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 2pt; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0cm; mso-element: para-border-div">
<p style="MARGIN: 2pt 0cm 0pt" class=underline><span style="FONT-SIZE: 22pt" lang=EN-US><font face=Calibri>C/C++</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 22pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">中的字符串字面值</span><span style="FONT-SIZE: 22pt" lang=EN-US><o:p></o:p></span></p>
</div>
<p style="MARGIN: 0cm 0cm 6pt" class=PadderBetweenControlandBody><span lang=EN-US><o:p><font size=1 face=Calibri>&nbsp;</font></o:p></span></p>
<p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 18pt; mso-add-space: auto; mso-list: l0 level1 lfo1" class=MsoListParagraphCxSpFirst><span style="FONT-SIZE: 14pt; mso-fareast-font-family: Calibri; mso-bidi-font-family: Calibri" lang=EN-US><span style="mso-list: Ignore"><font face=Calibri>1.</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">字符串数组的大小如何得到。我们都知道，对于一个字符串数组，要得到它的大小，有多种办法，常见的有下面的两种。</span><span style="FONT-SIZE: 14pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-INDENT: 14pt; MARGIN: 0cm 0cm 0pt 18.05pt; mso-add-space: auto; mso-para-margin-left: 1.64gd; mso-char-indent-count: 1.0" class=MsoListParagraphCxSpMiddle><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt">Ⅰ</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>.</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">利用</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>sizeof</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">运算符来实现。现在假设有一个字符数组</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>str[] = &#8220;hello,world&#8221;,</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">为了得到的它的长度，我们利用这种办法</span><span style="FONT-SIZE: 14pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-INDENT: 35pt; MARGIN: 0cm 0cm 0pt 18.05pt; mso-add-space: auto; mso-para-margin-left: 1.64gd; mso-char-indent-count: 2.5" class=MsoListParagraphCxSpMiddle><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">具体就是</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>sizeof(str) /sizeof(char);</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">结果是</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>12</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，比较发现，实际的字符串大小事</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>11</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">啊，为什么会得到</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>12</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的结果呢？</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri> <o:p></o:p></font></span></p>
<p style="TEXT-INDENT: 35pt; MARGIN: 0cm 0cm 0pt 18.05pt; mso-add-space: auto; mso-para-margin-left: 1.64gd; mso-char-indent-count: 2.5" class=MsoListParagraphCxSpMiddle><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">有这种疑问，是因为对我们字符数组没有一个更好的理解。上面初始化一个字符数组，是利用字符串来初始化的，</span><span style="FONT-SIZE: 14pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-INDENT: 35pt; MARGIN: 0cm 0cm 0pt 18.05pt; mso-add-space: auto; mso-para-margin-left: 1.64gd; mso-char-indent-count: 2.5" class=MsoListParagraphCxSpMiddle><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">而字符串的话，默认的是会有一个以</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>null</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">结尾的标志，这个具体的就是</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>&#8217;\0&#8217;,</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">有很多人的程序有问题，可能都是因为这里</span><span style="FONT-SIZE: 14pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-INDENT: 35pt; MARGIN: 0cm 0cm 0pt 18.05pt; mso-add-space: auto; mso-para-margin-left: 1.64gd; mso-char-indent-count: 2.5" class=MsoListParagraphCxSpMiddle><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">出现了问题，比如数组没有封口，造成了指针非法访问其他内存单元，等等。所以实际上的长度就是</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>12.<o:p></o:p></font></span></p>
<p style="TEXT-INDENT: 35pt; MARGIN: 0cm 0cm 0pt 18.05pt; mso-add-space: auto; mso-para-margin-left: 1.64gd; mso-char-indent-count: 2.5" class=MsoListParagraphCxSpMiddle><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">具体来说说这个原理吧：</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>sizeof</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">是表示计算大小，即字节数。这里以一个数组名来作为参数，就是计算这个数组的大小。</span><span style="FONT-SIZE: 14pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-INDENT: 35pt; MARGIN: 0cm 0cm 0pt 18.05pt; mso-add-space: auto; mso-para-margin-left: 1.64gd; mso-char-indent-count: 2.5" class=MsoListParagraphCxSpMiddle><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">上面说到，字符串数组的话是有一个默认的</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>null</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">来封口的，所以，计算的大小事包括这个单元的。于是</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>sizeof(str)</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的大小</span><span style="FONT-SIZE: 14pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-INDENT: 35pt; MARGIN: 0cm 0cm 10pt 18.05pt; mso-add-space: auto; mso-para-margin-left: 1.64gd; mso-char-indent-count: 2.5" class=MsoListParagraphCxSpLast><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">就是</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>12 </font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">个字节，然后计算一个单元，即一个字符</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>char</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">类型的占据的字节数，也就是</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>1</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">个字节，两者相除，就是</span><span style="FONT-SIZE: 14pt" lang=EN-US><font face=Calibri>12</font></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的结果。</span><span style="FONT-SIZE: 14pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 10pt 56.95pt; mso-para-margin-left: 3.27gd; mso-char-indent-count: -1.5" class=MsoNormal><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt">Ⅱ<span lang=EN-US>.</span>利用循环来实现，这个部分是很多人都常常想到的。因为一个字符串来定义的数组，默认是以<span lang=EN-US>null</span>即为的，所以，通过<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>循环遍历的方式来实现，这个方法还是可行的。定义一个变量<span lang=EN-US>i</span>，然后利用<span lang=EN-US>for</span>循环，判断<span lang=EN-US>str[i]</span>不为<span lang=EN-US>&#8217;\0&#8217;</span>，即可判断<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>得到最后一个元素的下标，注意到的是这里是最后一个字符元素，但是不是最后一个真正的元素，有一个<span lang=EN-US>null</span>，因此，还<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>要加上<span lang=EN-US>1</span>才是真正的个数，经过这个过程，得到的就是总的长度。这个方法比较容易理解。但是容易忽略了最后一个的作用。<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>实际上，我们使用的很多<span lang=EN-US>C</span>提供的函数，关于字符串操作的，都需要用到这个知识，我们在做计算的时候，很容易误以为返<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>回的。就是那个字符串的长度，从而导致了错误。实际在我们拷贝字符串的时候，尤其要注意这一点。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-INDENT: -21pt; MARGIN: 0cm 0cm 10pt 56.95pt; mso-para-margin-left: 3.27gd; mso-char-indent-count: -1.5" class=MsoNormal><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 10pt 18pt; mso-list: l0 level1 lfo1" class=MsoNormal><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt; FONT-SIZE: 14pt; mso-bidi-font-family: 宋体" lang=EN-US><span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt; FONT-SIZE: 14pt">在《<span lang=EN-US>C++ Primer</span>》一书中，将以<span lang=EN-US>null</span>结束的字符数组称为字符数组，标准库提供一批处理这类字符数组的函数，包括<span lang=EN-US>strlen,strcmp,strcat,strcpy,strncat,strncpy</span>等等，而这些函数中的参数，都是以<span lang=EN-US>null</span>结束的字符数组名，也就是字符数组的指针，而得到长度，返回的就是一个长度，没有包括<span lang=EN-US>null</span>这个单元，所以实际上，上面的那个还有一个方法，可以调用此函数来实现。当然，还有一点要注意的是，<span lang=EN-US>strcat</span>连接函数，将右边的字符串连接到左边，所以对于左边的字符串，一定要准确的计算出长度，如果不慎，就会溢出，出现严重的错误。看看下面这个例子：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="MARGIN: 0cm 0cm 10pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt; FONT-SIZE: 14pt" lang=EN-US>Char s1[25] = &#8220;hello,world&#8221;;<span style="mso-tab-count: 1">&nbsp; </span>char s2[20] = &#8220;0123456789012345678&#8221;(</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt; FONT-SIZE: 14pt">刚好是<span lang=EN-US>20</span>个字符，为何，因为有一个<span lang=EN-US>null).</span>所以现在的那个<span lang=EN-US>s2[20] = &#8220;01234567890123456789&#8221;,</span>此时你会发现，字符串就有<span lang=EN-US>20</span>个，含有一个<span lang=EN-US>null</span>，注意就溢出了，<span lang=EN-US>OK</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="MARGIN: 0cm 0cm 10pt 18pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt; FONT-SIZE: 14pt">下面，如果我将上面的那个采用字符串连接函数来做，就是<span lang=EN-US>strcat(s1,s2)</span>，那么又会出现错误。因为溢出了。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-INDENT: -12pt; MARGIN: 0cm 0cm 10pt 12pt; mso-char-indent-count: -1.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt; FONT-SIZE: 14pt" lang=EN-US>3.C++</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt; FONT-SIZE: 14pt">中提供了一个标准库<span lang=EN-US>string</span>来处理字符串，这个<span lang=EN-US>string</span>类提供了很多操作，是一种更安全的做法，然而了，为了新旧代码的兼容，需要进行两者之间的转换，而把<span lang=EN-US>string</span>的一个类函数<span lang=EN-US>c_str()</span>返回值是<span lang=EN-US>C</span>风格字符串。<span lang=EN-US>const char *str = st2.c_str();</span>其中<span lang=EN-US>st2</span>是一个<span lang=EN-US>string</span>类型的对象，返回值就是一个指向它的字符串。<span lang=EN-US><span style="mso-tab-count: 1"> </span></span>此即为字符串的处理，作为<span lang=EN-US>C/C++</span>的字符串值得注意的地方。<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/deercoder/aggbug/104213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-12-27 18:48 <a href="http://www.cppblog.com/deercoder/articles/104213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的引用</title><link>http://www.cppblog.com/deercoder/articles/104211.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Sun, 27 Dec 2009 10:47:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/104211.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/104211.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/104211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/104211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/104211.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C++的引用和指针&nbsp;&nbsp;1.&nbsp;&nbsp;&nbsp;&nbsp; C++的引用。关于C++的引用，需要有很多的注意的地方。首先，引用的对象必须是实际存在的。而不能使不存在的对象。例如 int &amp;&amp; a = i;这个就是不对的，为何，因为引用的是一个引用，而实际上引用时不存在的，不是一个实体，而只是一个别名，所以违反了该条规则...&nbsp;&nbsp;<a href='http://www.cppblog.com/deercoder/articles/104211.html'>阅读全文</a><img src ="http://www.cppblog.com/deercoder/aggbug/104211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-12-27 18:47 <a href="http://www.cppblog.com/deercoder/articles/104211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]操作系统的进程</title><link>http://www.cppblog.com/deercoder/articles/102918.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Thu, 10 Dec 2009 06:41:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/102918.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/102918.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/102918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/102918.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/102918.html</trackback:ping><description><![CDATA[&nbsp;
<p align=center><span>Linux</span><span>学习</span></p>
<p align=left><span><span>1．</span></span><span>操作系统的实验基本上都是以</span><span>linux</span><span>下面的系统编程为内容，进程的调度和创建都是很基本的内容。很幸运的是，</span><span>linux</span><span>为我们提供了很多的系统函数，供我们来使用。通过熟悉这些函数，使得我们可以能够对进程和程序有一个更良好的认识。</span></p>
<p align=left><span><span>2．</span></span><span>Fork</span><span>函数的使用。下面引用自百度百科：</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=568>
            <p align=left><strong><span>　</span></strong><strong><span>fork()</span></strong><strong><span>函数，</span></strong><strong><span>Linux</span></strong><strong><span>系统调用</span></strong><strong></strong></p>
            <p align=left><strong><span>　　头文件：</span></strong><strong></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>#include &lt;unistd.h&gt;</span></strong></p>
            <p align=left><strong><span>　　函数定义：</span></strong><strong></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>int fork( void );</span></strong></p>
            <p align=left><strong><span>　　返回值：</span></strong><strong></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>子进程中返回</span></strong><strong><span>0</span></strong><strong><span>，父进程中返回子进程</span></strong><strong><span>ID</span></strong><strong><span>，出错返回</span></strong><strong><span>-1</span></strong></p>
            <p align=left><strong><span>　　函数说明：</span></strong><strong></strong></p>
            <p align=left><strong><span>　　一个现有进程可以调用</span></strong><strong><span>fork</span></strong><strong><span>函数创建一个新进程。由</span></strong><strong><span>fork</span></strong><strong><span>创建的新进程被称为子进程（</span></strong><strong><span>child process</span></strong><strong><span>）。</span></strong><strong><span>fork</span></strong><strong><span>函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回</span></strong><strong><span>0</span></strong><strong><span>值而父进程中返回子进程</span></strong><strong><span>ID</span></strong><strong><span>。</span></strong><strong></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>子进程是父进程的副本，它将获得父进程数据空间、堆、栈等资源的副本</span></strong><strong><span>。注意，子进程持有的是上述存储空间的</span></strong><strong><span>&#8220;</span></strong><strong><span>副本</span></strong><strong><span>&#8221;</span></strong><strong><span>，这意味着父子进程间不共享这些存储空间，它们之间共享的存储空间只有代码段。</span></strong><strong></strong></p>
            <p align=left><strong><span>　　示例代码：</span></strong><strong></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>#include &lt;unistd.h&gt;</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>#include &lt;stdio.h&gt;</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>int main(int argc, void ** argv )</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>{</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>int pid = fork();</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>if(pid == -1 ) {</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>// print("error!");</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>} else if( pid = =0 ) {</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>// print("This is the child process!");</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>} else {</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>// print("This is the parent process! child process id = %d", pid);</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>}</span></strong></p>
            <p align=left><strong><span>　　</span></strong><strong><span>return 0;</span></strong></p>
            <p align=left><span>　　</span><span>}</span><strong></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>下面来详细的说说我的程序和问题，通过比较学习，相信对于</span><span>linux</span><span>的学习，特别是进程和程序直接的关系有一个更好的理解。</span></p>
<p align=left><span>Process2.c</span></p>
<p align=left><span>Code</span><span>：</span></p>
<p align=left><span>#include &lt;stdio.h&gt;</span></p>
<p align=left><span>#include &lt;unistd.h&gt;</span></p>
<p align=left><span>int main()</span></p>
<p align=left><span>{</span></p>
<p align=left><span>&nbsp;int p1;</span></p>
<p align=left><span>&nbsp;p1=fork();</span></p>
<p align=left><span>&nbsp;if (p1 == 0)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span>子进程，输出它的父进程和当前进程的</span><span>PID</span></p>
<p align=left><span>&nbsp;{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("current PID is %d\n",getpid());</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;printf("father PID is %d\n",getppid());</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("\n");</span></p>
<p align=left><span>&nbsp;}</span></p>
<p align=left><span>&nbsp;else<span>&nbsp;&nbsp; </span>//</span><span>这里是父进程吗？</span></p>
<p align=left><span>&nbsp;{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("father PID is %d\n",getppid());</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("current PID is %d\n",getpid());</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("\n");</span></p>
<p align=left><span>&nbsp;}</span></p>
<p align=left><span>&nbsp;return 0;</span></p>
<p align=left><span>}</span></p>
<p align=left><span>分析：此进程的运行结果是？（思考后再回答）</span></p>
<p align=left><span>是的，有两种情况。首先，程序运行到</span><span>fork</span><span>语句之后，创建进程，此时有两种情况，创建成功和不成功，而成功又有两种情况，</span><span>fork</span><span>的返回值为</span><span>0</span><span>，则运行的是创建的子进程，</span><span>fork</span><span>的返回值为</span><span>1</span><span>，则运行的是父进程。用</span><span>if</span><span>语句来判断，</span><span>OK</span><span>。</span></p>
<p align=left><span>那么问题就是，</span><span>if</span><span>语句中没有问题，</span><span>p1</span><span>为</span><span>0</span><span>，说明创建成功，运行的是子进程，可是</span><span>else</span><span>语句来说，却又两种情况，如果创建不成功也在</span><span>else</span><span>语句中，那么此时当前进程就是那个原始的进程，而它的父进程却是</span><span>1</span><span>号</span><span>PID</span><span>，因为所有的进程都是</span><span>1</span><span>号进程的子进程，这个是</span><span>linux</span><span>下面的结论。操作系统的知识。</span></p>
<p align=left><span>所以，此时的结果应该是：</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=568>
            <p align=left><strong><span>father PID is 32667</span></strong></p>
            <p align=left><strong><span>current PID is 15254</span></strong></p>
            <p align=left><strong>&nbsp;</strong></p>
            <p align=left><strong><span>current PID is 15255</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left><span>先放着，先解释下面的这个，注意，这个对上面是有帮助的。</span></p>
<p align=left><span>（看完之后回头过来看看），看到没有，首先输出的那个</span><span>father PID</span><span>是什么，刚好就是下面的那个</span><span>32667</span><span>，这个不是偶然的，说明什么，当然，这个进程就是父进程，而创建它的那个进程的</span><span>PID</span><span>是</span><span>32667</span><span>，可以认为是系统创建的。就是说这种情况下面是，先运行的父进程。而它创建失败了，那么它没有子进程啊，那么那个下面的这个进程的父进程就不是上面的那个了，为何，从结果可以看到，它的</span><span>PID</span><span>是</span><span>1</span><span>，而不会是</span><span>15254</span><span>，说明不是上面的那个创建。而创建却是</span><span>1</span><span>，说明是系统创建的，所以</span><span>fork</span><span>语句之后，没有创建成功，而是由系统来亲自创建一个进程，所以</span><span>PID</span><span>号当然是下一个，不过父进程就是</span><span>1</span><span>号了。（<span>有兴趣的可以查阅下资料，我们也是刚学，所以我还有继续探究中！！</span>）</span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=568>
            <p align=left><strong><span>current PID is 15302&nbsp;//</span></strong><strong><span>子进程</span></strong><strong></strong></p>
            <p align=left><strong><span>father PID is <a>15301</a></span></strong><span><span><a language=JavaScript id=_anchor_1 onmouseover="msoCommentShow('_anchor_1','_com_1')" onmouseout="msoCommentHide('_com_1')" href="#_msocom_1" name=_msoanchor_1>[l1]</a>&nbsp;</span></span><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong></p>
            <p align=left><strong>&nbsp;</strong></p>
            <p align=left><strong><span>father PID is 32667&nbsp;//</span></strong><strong><span>父进程</span></strong><strong></strong></p>
            <p align=left><strong><span>current PID is 15301</span></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<p align=left>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>PID = 13501 </span></p>
            <p><span>父进程</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>PID = 13504</span></p>
            <p><span>子进程</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>系统创建了当前的那个父进程，就是程序运行的进程</span></p>
            <p><span>PID = 32667</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<br clear=all>
<p align=left><span>下面还想讨论这样一个问题，这个问题是从上面那个第一种情况引申来的。</span></p>
<p align=left><span>如下：</span></p>
<p align=left><span>Code</span><span>：</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=568>
            <p align=left><a><span>#include &lt;stdio.h&gt;</span></a></p>
            <p align=left><span><span>int main()</span></span></p>
            <p align=left><span><span>{</span></span></p>
            <p align=left><span><span>&nbsp;int p1;</span></span></p>
            <p align=left><span><span>&nbsp;while (( p1 = fork())!= -1);</span></span></p>
            <p align=left><span><span>&nbsp;if (p1 == -1)</span></span></p>
            <p align=left><span><span>&nbsp;{</span></span></p>
            <p align=left><span><span><span>&nbsp;&nbsp;&nbsp; </span>printf("current PID is %d\n",getpid());</span></span></p>
            <p align=left><span><span><span>&nbsp;&nbsp;&nbsp; </span>printf("father PID is %d\n",getppid());</span></span></p>
            <p align=left><span><span>&nbsp;}</span></span></p>
            <p align=left><span><span>&nbsp;return 0;</span></span></p>
            <p align=left><span><span>}</span></span><span><span><a language=JavaScript id=_anchor_2 onmouseover="msoCommentShow('_anchor_2','_com_2')" onmouseout="msoCommentHide('_com_2')" href="#_msocom_2" name=_msoanchor_2>[l2]</a>&nbsp;</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span>结果如下，虽然比较多，不过很能说明问题：</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=568>
            <p align=left><strong><span>current PID is 17600</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17761</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17602</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18545</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17608</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17767</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17624</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17773</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17616</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18551</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17630</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18552</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17636</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17779</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17642</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17785</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17648</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17787</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17654</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17795</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18510</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17801</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18511</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17807</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17656</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17815</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17384</span></strong></p>
            <p align=left><strong><span>father PID is 32667</span></strong></p>
            <p align=left><strong><span>current PID is 17819</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17660</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17825</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17668</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18571</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17672</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18572</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17678</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17831</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17684</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17839</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17690</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17845</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17696</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17851</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17702</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17857</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17710</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17863</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18531</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17786</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17714</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18566</span></strong></p>
            <p align=left><strong><span>father PID is 17786</span></strong></p>
            <p align=left><strong><span>current PID is 17720</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18533</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17728</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18538</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17730</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 18548</span></strong></p>
            <p align=left><strong><span>father PID is 17740</span></strong></p>
            <p align=left><strong><span>current PID is 17738</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17794</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17740</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17804</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17750</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17810</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17756</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17814</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17764</span></strong></p>
            <p align=left><strong><span>current PID is 17820</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17768</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17826</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17774</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17832</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17780</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>current PID is 17838</span></strong></p>
            <p align=left><strong><span>father PID is 17913</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 17929</span></strong></p>
            <p align=left><strong><span>father PID is 17927</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 17941</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            <p align=left><strong><span>father PID is 17950</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<p align=left><span>看完了上面的那个例子，下面的这个例子就是小</span><span>case</span><span>了，当然，其实上面的那个例子就是由下面的这个例子引申来的，是因为写错了代码而引起的。当然，根据错误，我们收获不小啊！</span></p>
<p align=left><span>Code</span><span>：</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=568>
            <p align=left><strong><span>#include &lt;stdio.h&gt;</span></strong></p>
            <p align=left><strong><span>#include &lt;unistd.h&gt;</span></strong></p>
            <p align=left><strong><span>int main()</span></strong></p>
            <p align=left><strong><span>{</span></strong></p>
            <p align=left><strong><span>&nbsp;int p1;</span></strong></p>
            <p align=left><strong><span>&nbsp;while ((p1=fork())==-1) ;</span></strong></p>
            <p align=left><strong><span>&nbsp;if (p1 == 0)</span></strong></p>
            <p align=left><strong><span>&nbsp;{</span></strong></p>
            <p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("current PID is %d\n",getpid());</span></strong></p>
            <p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("father PID is %d\n",getppid());</span></strong></p>
            <p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("\n");</span></strong></p>
            <p align=left><strong><span>&nbsp;}</span></strong></p>
            <p align=left><strong><span>&nbsp;else</span></strong></p>
            <p align=left><strong><span>&nbsp;{</span></strong></p>
            <p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("father PID is %d\n",getppid());</span></strong></p>
            <p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("current PID is %d\n",getpid());</span></strong></p>
            <p align=left><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("\n");</span></strong></p>
            <p align=left><strong><span>&nbsp;}</span></strong></p>
            <p align=left><strong><span>&nbsp;return 0;</span></strong></p>
            <p align=left><strong><span>}</span></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<p align=left><span>结果如下：</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=568>
            <p align=left><strong><span>current PID is<a> 20312</a></span></strong><span><span><a language=JavaScript id=_anchor_3 onmouseover="msoCommentShow('_anchor_3','_com_3')" onmouseout="msoCommentHide('_com_3')" href="#_msocom_3" name=_msoanchor_3>[l3]</a>&nbsp;</span></span><strong></strong></p>
            <p align=left><strong><span>father PID is 20311</span></strong></p>
            <p align=left><strong>&nbsp;</strong></p>
            <p align=left><strong><span>father PID is 32667</span></strong></p>
            <p align=left><strong><span>current PID is 20311</span></strong></p>
            <p align=left><strong>&nbsp;</strong></p>
            <p align=left><strong><span>----------------------------------------------------------------------------------------------------------------</span></strong></p>
            <p align=left><strong><span>father PID is 32667</span></strong></p>
            <p align=left><strong><span>current PID is <a>20309</a></span></strong><span><span><a language=JavaScript id=_anchor_4 onmouseover="msoCommentShow('_anchor_4','_com_4')" onmouseout="msoCommentHide('_com_4')" href="#_msocom_4" name=_msoanchor_4>[l4]</a>&nbsp;</span></span><strong></strong></p>
            <p align=left><strong>&nbsp;</strong></p>
            <p align=left><strong><span>current PID is 20310</span></strong></p>
            <p align=left><strong><span>father PID is 1</span></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<div>
<hr align=left width="33%" SIZE=1>
<div>
<div language=JavaScript id=_com_1 onmouseover="msoCommentShow('_anchor_1','_com_1')" onmouseout="msoCommentHide('_com_1')"><span><a name=_msocom_1></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_1">[l1]</a></span></span></span><span>父进程的</span><span>PID</span><span>刚好就是下面的那个父进程的</span><span>current PID</span><span>，说明下面的那个进程就是父进程。</span></p>
</div>
</div>
<div>
<div language=JavaScript id=_com_2 onmouseover="msoCommentShow('_anchor_2','_com_2')" onmouseout="msoCommentHide('_com_2')"><span><a name=_msocom_2></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_2">[l2]</a></span></span></span><span>看看这个程序，虽然比较流氓，不过可以根据结果知道，如果创建失败的话，那么也会有一个当前的</span><span>PID</span><span>，而且还是由一个</span><span>1</span><span>号进程创建。</span></p>
</div>
</div>
<div>
<div language=JavaScript id=_com_3 onmouseover="msoCommentShow('_anchor_3','_com_3')" onmouseout="msoCommentHide('_com_3')"><span><a name=_msocom_3></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_3">[l3]</a></span></span></span><span>当前是子进程，而它的父进程恰好是下面的这个进程！</span></p>
</div>
</div>
<div>
<div language=JavaScript id=_com_4 onmouseover="msoCommentShow('_anchor_4','_com_4')" onmouseout="msoCommentHide('_com_4')"><span><a name=_msocom_4></a></span>
<p><span><span><span>&nbsp;<a href="#_msoanchor_4">[l4]</a></span></span></span><span>父进程就是这个进程，而它的那个子进程却是由系统创建的！</span></p>
</div>
</div>
<br>后来通过查阅资料知道，如果父进程创建一个子进程后其先结束，那么子进程就变成了孤儿进程，这样的话，就会由初始化进程，即1号进程来领养。所以会显示它的父进程为1.至此，完美的解决了。。<br><br>最近在看《Linux程序设计》（第三版）一书，收获颇丰。本书是Linux下面程序设计的经典，值得一睹。。而且最近的感触是，懂得linux的操作和会在Linux下面进程程序设计完全是两回事，就像你会用windows和会开发windows下面的程序一样。我辈任重而道远啊。。</div>
<img src ="http://www.cppblog.com/deercoder/aggbug/102918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-12-10 14:41 <a href="http://www.cppblog.com/deercoder/articles/102918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]gcc使用</title><link>http://www.cppblog.com/deercoder/articles/102581.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Fri, 04 Dec 2009 16:45:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/102581.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/102581.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/102581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/102581.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/102581.html</trackback:ping><description><![CDATA[<table style="WIDTH: 100%; TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div id=blog_text class=cnt>
            <p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">GCC(gcc) </span><span style="COLOR: #333333; FONT-SIZE: 9pt">的不断发展完善使许多商业编译器都相形见绌，<span> GCC </span>由<span> GNU </span>创始人<span> Richard Stallman</span>首创，是<span> GNU </span>的标志产品，由于<span> UNIX </span>平台的高度可移植性，<span> GCC </span>几乎在各种常见的<span> UNIX </span>平台上都有，即使是<span> Win32/DOS </span>也有<span> GCC </span>的移植。 比如说<span> SUN </span>的<span> Solaris </span>操作系统配置的编译器就是<span>GNU </span>的<span> GCC </span>。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">GNU </span><span style="COLOR: #333333; FONT-SIZE: 9pt">软件包括<span> C </span>编译器<span> GCC </span>，<span> C++ </span>编译器<span> G++ </span>，汇编器<span> AS </span>，链接器<span> LD </span>，二进制转换工具<span>(OBJCOPY </span>， <span>OBJDUMP) </span>，调试工具<span> (GDB </span>，<span> GDBSERVER </span>，<span> KGDB) </span>和基于不同硬件平台的开发库。 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>在<span> GNU GCC </span>支持下用户可以使用流行的<span> C/C++ </span>语言开发应用程序，满足生成高效率运行代码、易掌握的编程语言的用户需求。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>这些工具都是按<span> GPL </span>版权声明发布，任何人可以从网上获取全部的源代码，无需使用任何费用。关于<span> GNU </span>和公共许可证协议的详细资料， 读者可以参看<span> GNU </span>网站的介绍， <span></span></font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">http://www.gnu.org/home.html</span><span style="COLOR: #333333; FONT-SIZE: 9pt">。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">GNU </span><span style="COLOR: #333333; FONT-SIZE: 9pt">开发工具都是采用命令行的方式，用户掌握起来相对比较困难，不如基于<span> Windows </span>系统的开发工具好用，但是<span> GNU </span>工具的复杂性是由于它更贴近编译器和操作系统的底层，并提供了更大的灵活性。一旦学习和掌握了相关工具后，就了解了系统设计的基础知识。 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>运行于<span> Linux </span>操作系统下的自由软件<span> GNU gcc </span>编译器，不仅可以编译<span> Linux </span>操作系统下运行的应用程序，还可以编译<span> Linux </span>内核本身，甚至可以作交叉编译，编译运行于其它<span> CPU </span>上的程序。所以，在进行嵌入式系统应用程序开发时，这些工具得到了日益广泛的应用。 <span></span></font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">GCC </span><span style="COLOR: #333333; FONT-SIZE: 9pt">是 <span>GNU </span>组织的免费<span> C </span>编译器，<span> Linux </span>的很多发布缺省安装的就是这种。很多流行的自由软件源代码基本都能在<span> GCC </span>编译器下编译运行。 所以掌握<span> GCC </span>编译器的使用无论是对于编译系统内核还是自己的应用程序都是大有好处的。 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>下面通过一个具体的例子，学习如何使用<span> GCC </span>编译器。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>在<span> Linux </span>操作系统中，对一个用标准<span> C </span>语言写的源程序进行编译，要使用<span> GNU </span>的<span> gcc </span>编译器。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>例如下面一个非常简单的<span> Hello </span>源程序<span> (hello.c)</span>： <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>/******************************************************* </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>* Institute of Automation, Chinese Academy of Sciences </font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">* File Name </span><span style="COLOR: #333333; FONT-SIZE: 9pt">：<span> hello.c </span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">* Description </span><span style="COLOR: #333333; FONT-SIZE: 9pt">：<span> introduce how to compile a source file with gcc </span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">* Author </span><span style="COLOR: #333333; FONT-SIZE: 9pt">：<span> Xueyuan Nie </span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">* Date </span><span style="COLOR: #333333; FONT-SIZE: 9pt">： <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>*******************************************************/ </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>void main() </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>{ </font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">printf("Hello the world\n") </span><span style="COLOR: #333333; FONT-SIZE: 9pt">； <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>} </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>要编译这个程序，我们只要在<span> Linux </span>的<span> bash </span>提示符下输入命令： <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>$ gcc -o hello hello.c </font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">gcc </span><span style="COLOR: #333333; FONT-SIZE: 9pt">编译器就会生成一个<span> hello </span>的可执行文件。在<span> hello.c </span>的当前目录下执行<span> ./hello </span>就可以看到程序的输出结果，在屏幕上打印出 &#8220;<span> Hello the world </span>&#8221; 的字符串来。 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>命令行中<span> gcc </span>表示是用<span> gcc </span>来编译源程序； <span></span></font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-o outputfilename </span><span style="COLOR: #333333; FONT-SIZE: 9pt">选项表示要求编译器生成文件名为<span> outputfilename </span>的可执行文件，如果不指定<span> -o </span>选项，则缺省文件名是<span> a.out </span>。在这里生成指定文件名为<span> hello </span>的可执行文件，而<span> hello.c </span>是我们的源程序文件。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">gcc </span><span style="COLOR: #333333; FONT-SIZE: 9pt">是一个多目标的工具。<span> gcc </span>最基本的用法是： <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">gcc [options] file... </span><span style="COLOR: #333333; FONT-SIZE: 9pt">， <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>其中的<span> option </span>是以<span> - </span>开始的各种选项，<span> file </span>是相关的文件名。在使用<span> gcc </span>的时候，必须要给出必要的选项和文件名。<span> gcc </span>的整个编译过程，实质上是分四步进行的，每一步完成一个特定的工作， <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>这四步分别是：预处理，编译，汇编和链接。它具体完成哪一步，是由<span> gcc </span>后面的开关选项和文件类型决定的。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>清楚的区别编译和连接是很重要的。编译器使用源文件编译产生某种形式的目标文件<span> (objectfiles) </span>。在这个过程中，外部的符号引用并没有被解释或替换，然后我们使用链接器来链接这些目标文件和一些标准的头文件，最后生成一个可执行文件。在这个过程中，一个目标文件中对别的文件中的符号的引用被解释，并报告不能被解释的引用，一般是以错误信息的形式报告出来。 <span></span></font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">gcc </span><span style="COLOR: #333333; FONT-SIZE: 9pt">编译器有许多选项，但对于普通用户来说只要知道其中常用的几个就够了。在这里为读者列出几个最常用的选项： <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-o </span><span style="COLOR: #333333; FONT-SIZE: 9pt">选项表示要求编译器生成指定文件名的可执行文件； <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-c </span><span style="COLOR: #333333; FONT-SIZE: 9pt">选项表示只要求编译器进行编译，而不要进行链接，生成以源文件的文件名命名但把其后缀由<span> .c </span>或<span> .cc </span>变成<span> .o </span>的目标文件； <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-g </span><span style="COLOR: #333333; FONT-SIZE: 9pt">选项要求编译器在编译的时候提供以后对程序进行调试的信息； <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-E </span><span style="COLOR: #333333; FONT-SIZE: 9pt">选项表示编译器对源文件只进行预处理就停止，而不做编译，汇编和链接； <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-S </span><span style="COLOR: #333333; FONT-SIZE: 9pt">选项表示编译器只进行编译，而不做汇编和链接； <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-O </span><span style="COLOR: #333333; FONT-SIZE: 9pt">选项是编译器对程序提供的编译优化选项，在编译的时候使用该选项，可以使生成的执行文件的执行效率提高； <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-Wall </span><span style="COLOR: #333333; FONT-SIZE: 9pt">选项指定产生全部的警告信息。 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>如果你的源代码中包含有某些函数，则在编译的时候要链接确定的库，比如代码中包含了某些数学函数，在<span> Linux </span>下，为了使用数学函数，必须和数学库链接，为此要加入<span> -lm </span>选项。也许有读者会问，前面那个例子使用<span> printf </span>函数的时候为何没有链接库呢？在<span> gcc </span>中对于一些常用函数的实现，<span> gcc </span>编译器会自动去链接一些常用库，这样用户就没有必要自己去指定了。有时候在编译程序的时候还要指定库的路径，这个时候要用到编译器的<span> -L </span>选项指定路径。比如说我们有一个库在<span>/home/hoyt/mylib </span>下，这样我们编译的时候还要加上<span> -L/home/hoyt/mylib </span>。对于一些标准库来说，没有必要指出路径。只要它们在起缺省库的路径下就可以了，<span> gcc </span>在链接的时候会自动找到那些库的。 <span></span></font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">GNU </span><span style="COLOR: #333333; FONT-SIZE: 9pt">编译器生成的目标文件缺省格式为<span> elf(executive linked file) </span>格式，这是<span> Linux </span>系统所采用的可执行链接文件的通用文件格式。<span> elf </span>格式由若干段<span> (section) </span>组成，如果没有特别指明，由标准<span> c </span>源代码生成的目标文件中包含以下段：<span> .text( </span>正文段<span> ) </span>包含程序的指令代码，<span> .data( </span>数据段<span> ) </span>包含固定的数据，如常量，字符串等，<span> .bss( </span>未初始化数据段<span> ) </span>包含未初始化的变量和数组等。 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>读者若想知道更多的选项及其用法，可以查看<span> gcc </span>的帮助文档，那里有许多对其它选项的详细说明。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>当改变了源文件<span> hello.c </span>后，需要重新编译它： <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>$ gcc -c hello.c </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>然后重新链接生成： <span></span></font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">$ gcc </span><span style="COLOR: #333333; FONT-SIZE: 9pt">&#8211;<span> o hello.o </span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>对于本例，因为只含有一个源文件，所以当改动了源码后，进行重新的编译链接的过程显得并不是太繁琐，但是，如果在一个工程中包含了若干的源码文件，而这些源码文件中的某个或某几个又被其他源码文件包含，那么，如果一个文件被改动，则包含它的那些源文件都要进行重新编译链接，工作量是可想而知的。幸运的是，<span> GNU </span>提供了使这个步骤变得简单的工具，就是下面要介绍给大家的<span> GNU Make </span>工具。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>GNU Make </font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">make </span><span style="COLOR: #333333; FONT-SIZE: 9pt">是负责从项目的源代码中生成最终可执行文件和其他非源代码文件的工具。<span> make </span>命令本身可带有四种参数：标志、宏定义、描述文件名和目标文件名。 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>其标准形式为： <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>make [flags] [macro definitions] [targets] </font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">Unix </span><span style="COLOR: #333333; FONT-SIZE: 9pt">系统下标志位<span> flags </span>选项及其含义为： <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-f file </span><span style="COLOR: #333333; FONT-SIZE: 9pt">指定<span> file </span>文件为描述文件，如果<span> file </span>参数为<span> '-' </span>符，那么描述文件指向标准输入。如果没有<span> '-f' </span>参数，则系统将默认当前目录下名为<span> makefile </span>或者名为<span> Makefile </span>的文件为描述文件。在<span>Linux </span>中，<span> GNU make </span>工具在当前工作目录中按照<span> GNUmakefile </span>、<span> makefile </span>、<span> Makefile </span>的顺序搜索<span>makefile </span>文件。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-i </span><span style="COLOR: #333333; FONT-SIZE: 9pt">忽略命令执行返回的出错信息。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-s </span><span style="COLOR: #333333; FONT-SIZE: 9pt">沉默模式，在执行之前不输出相应的命令行信息。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-r </span><span style="COLOR: #333333; FONT-SIZE: 9pt">禁止使用隐含规则。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-n </span><span style="COLOR: #333333; FONT-SIZE: 9pt">非执行模式，输出所有执行命令，但并不执行。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-t </span><span style="COLOR: #333333; FONT-SIZE: 9pt">更新目标文件。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-q make </span><span style="COLOR: #333333; FONT-SIZE: 9pt">操作将根据目标文件是否已经更新返回<span> "0" </span>或非<span> "0" </span>的状态信息。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-p </span><span style="COLOR: #333333; FONT-SIZE: 9pt">输出所有宏定义和目标文件描述。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-d Debug </span><span style="COLOR: #333333; FONT-SIZE: 9pt">模式，输出有关文件和检测时间的详细信息。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">Linux </span><span style="COLOR: #333333; FONT-SIZE: 9pt">下<span> make </span>标志位的常用选项与<span> Unix </span>系统中稍有不同，下面只列出了不同部分： <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-c dir </span><span style="COLOR: #333333; FONT-SIZE: 9pt">在读取<span> makefile </span>之前改变到指定的目录<span> dir </span>。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-I dir </span><span style="COLOR: #333333; FONT-SIZE: 9pt">当包含其他<span> makefile </span>文件时，利用该选项指定搜索目录。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-h help </span><span style="COLOR: #333333; FONT-SIZE: 9pt">文挡，显示所有的<span> make </span>选项。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">-w </span><span style="COLOR: #333333; FONT-SIZE: 9pt">在处理<span> makefile </span>之前和之后，都显示工作目录。 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>通过命令行参数中的<span> target </span>，可指定<span> make </span>要编译的目标，并且允许同时定义编译多个目标，操作时按照从左向右的顺序依次编译<span> target </span>选项中指定的目标文件。如果命令行中没有指定目标，则系统默认<span> target </span>指向描述文件中第一个目标文件。 <span></span></font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">make </span><span style="COLOR: #333333; FONT-SIZE: 9pt">如何实现对源代码的操作是通过一个被称之为<span> makefile </span>的文件来完成的，在下面的小节里，主要向读者介绍一下<span> makefile </span>的相关知识。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">makefile </span><span style="COLOR: #333333; FONT-SIZE: 9pt">基本结构 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">GNU Make </span><span style="COLOR: #333333; FONT-SIZE: 9pt">的主要工作是读一个文本文件<span> makefile </span>。<span> makefile </span>是用<span> bash </span>语言写的，<span> bash </span>语言是很像<span> BASIC </span>语言的一种命令解释语言。这个文件里主要描述了有关哪些目标文件是从哪些依赖文件中产生的，是用何种命令来进行这个产生过程的。有了这些信息，<span> make </span>会检查磁盘的文件，如果目标文件的日期<span> ( </span>即该文件生成或最后修改的日期<span> ) </span>至少比它的一个依赖文件日期早的话，<span> make </span>就会执行相应的命令，以更新目标文件。 <span></span></span></font></font></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">makefile </span><span style="COLOR: #333333; FONT-SIZE: 9pt">一般被称为 &#8220;<span>makefile</span>&#8221; 或 &#8220;<span>Makefile</span>&#8221; 。还可以在<span> make </span>的命令行中指定别的文件名。如果没有特别指定的话，<span> make </span>就会寻找 &#8220;<span>makefile</span>&#8221; 或 &#8220;<span>Makefile</span>&#8221; ，所以为了简单起见，建议读者使用这两名字。如果要使用其他文件作为<span> makefile </span>，则可利用类似下面的<span> make </span>命令选项指定<span> makefile </span>文件： <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>$ make -f makefilename </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>一个<span> makefile </span>主要含有一系列的规则，如下： <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>目标文件名<span>: </span>依赖文件名 <span></span></font></font></span></p>
            <p><font face=宋体><font size=3><span style="COLOR: #333333; FONT-SIZE: 9pt">(tab </span><span style="COLOR: #333333; FONT-SIZE: 9pt">键<span> ) </span>命令 <span></span></span></font></font></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>第一行称之为规则，第二行是执行规则的命令，必须要以<span> tab </span>键开始。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>下面举一个简单的<span> makefile </span>的例子。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>executable : main.o io.o </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>gcc main.o io.o -o executable </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>main.o : main.c </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>gcc -Wall -O -g -c main.c -o main.o </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>io.o : io.c </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>gcc -Wall -O -g -c io.c -o io.o </font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>这是一个最简单的<span> makefile </span>，<span> make </span>从第一条规则开始，<span> executable </span>是<span> makefile </span>最终要生成的目标文件。给出的规则说明<span> executable </span>依赖于两个目标文件<span> main.o </span>和<span> io.o </span>，只要 <span>executable </span>比它依赖的文件中的任何一个旧的话，下一行的命令就会被执行。但是，在检查文件<span> main.o </span>和<span> io.o </span>的日期之前，它会往下查找那些把<span> main.o </span>或<span> io.o </span>做为目标文件的规则。<span> make </span>先找到了关于<span> main.o </span>的规则，该目标文件的依赖文件是<span> main.c </span>。<span> makefile </span>后面的文件中再也找不到生成这个依赖文件的规则了。此时，<span> make </span>开始检查磁盘上这个依赖文件的日期，如果这个文件的日期比<span> main.o </span>日期新的话，那么这个规则下面的命令<span> gcc -c main.c </span>&#8211;<span> o main.o </span>就会执行，以更新文件<span> main.o </span>。同样<span> make </span>对文件<span> io.o </span>做类似的检查，它的依赖文件是<span> io.c </span>，对<span> io.o </span>的处理和<span> main.o </span>类似。现在， 再回到第一个规则处，如果刚才两个规则中的任何一个被执行，最终的目标文件<span>executable </span>都需要重建<span> ( </span>因为<span> executable </span>所依赖的其中一个<span> .o </span>文件就会比它新<span> ) </span>，因此链接命令就会被执行。 <span></span></font></font></span></p>
            <p><span style="COLOR: #333333; FONT-SIZE: 9pt"><font face=宋体><font size=3>有了<span> makefile </span>，对任何一个源文件进行修改后，所有依赖于该文件的目标文件都会被重新编译<span> ( </span>因为<span> .o </span>文件依赖于<span> .c </span>文件<span> ) </span>，进而最终可执行文件会被重新链接<span> ( </span>因为它所依赖的<span> .o </span>文件被改变了<span> ) </span>，再也不用手工去一个个修改了。</font></font></span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/deercoder/aggbug/102581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-12-05 00:45 <a href="http://www.cppblog.com/deercoder/articles/102581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的默认构造函数</title><link>http://www.cppblog.com/deercoder/articles/102113.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Fri, 27 Nov 2009 13:42:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/102113.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/102113.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/102113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/102113.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/102113.html</trackback:ping><description><![CDATA[首先来看看下面这段代码：<br>#include &lt;iostream&gt;<br>using namespace std;<br>class test<br>{<br>public:<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> test(int a,float b)<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> x =&nbsp;<wbr> a;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> y = b;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> void show()<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> cout &lt;&lt; "x = " &lt;&lt; x &lt;&lt; endl<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;&lt; "y = " &lt;&lt; y &lt;&lt; endl;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br>private:<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int x ;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> float y;<br>};<br>void main()<br>{<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> test b(1,3.2);<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> b.show();<br>}<br>完全没有问题，自己定义了一个构造函数，而不是系统默认的构造函数，这样就不会出错了！！<br>然后看看下面的这段代码：<br>#include &lt;iostream&gt;<br>using namespace std;<br>class test<br>{<br>public:<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> void show()<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> cout &lt;&lt; "x = " &lt;&lt; x &lt;&lt; endl<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;&lt; "y = " &lt;&lt; y &lt;&lt; endl;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br>private:<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int x;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> double y;<br>};<br>void main()<br>{<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> test b(1,3.2);<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> b.show();<br>}<br>然后就会出错，为什么，因为默认的构造函数是没有形参，所以你传递进去的两个形参就会报错！更不可能把你的那两个参数赋值给它的private内容中的形参。<br>还可以定义一个函数专门进行赋值化或者初始化，这样就相当于一个构造函数，可是实现起来的话就要显示的调用set函数。<br>class test<br>{<br>public:<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> void set(int a,float b)<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>x = a;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>y = b;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> void show()<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> {<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> cout &lt;&lt; "x = " &lt;&lt; x &lt;&lt; endl<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;&lt; "y = " &lt;&lt; y &lt;&lt; endl;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br>private:<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int x;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> float y;<br>};<br><br>void main()<br>{<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> test b;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> b.set(1,3.4);<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> b.show();<br>}<br>
<img src ="http://www.cppblog.com/deercoder/aggbug/102113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-11-27 21:42 <a href="http://www.cppblog.com/deercoder/articles/102113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的重载运算符</title><link>http://www.cppblog.com/deercoder/articles/102110.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Fri, 27 Nov 2009 13:38:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/102110.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/102110.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/102110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/102110.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/102110.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em"><span>1.为何要使用重载运算符？</span></p>
<p style="TEXT-INDENT: 2em"><span>因为我们希望使用到类的一些操作，使得一个类更像内置的数据类型（int，float&#8230;&#8230;&#8230;&#8230;）</span></p>
<p style="TEXT-INDENT: 2em"><span>比如说对于int类型的变量，自增运算符是默认的，即定义int i，即可以用到i++，而现在对于自定义</span></p>
<p style="TEXT-INDENT: 2em"><span>的一个类，如果没有定义++操作，那么程序时不会找到这个操作的相应定义的，更不会执行相应的操</span></p>
<p style="TEXT-INDENT: 2em"><span>作！</span></p>
<p style="TEXT-INDENT: 2em"><span>也就是说，实际上重载运算符是给了++&#8230;&#8230;&#8230;&#8230;这些运算符一些新的定义和操作，结果很明显，我们</span></p>
<p style="TEXT-INDENT: 2em"><span>使用自定义类的时候可以像内置类型一样那么自然，简单，符合我们的用户习惯！</span></p>
<p style="TEXT-INDENT: 2em">&nbsp;<wbr></p>
<p style="TEXT-INDENT: 2em"><span>2.如何定义重载运算符？</span></p>
<p style="TEXT-INDENT: 2em"><span>前面说到重载，对，对于一个运算符，实际上语言的本身是定义默认的操作的，比如说加法运算，对于int类型可以知道是整数相加，对于float类型也是如此，这实际上也是一种重载，对于不同类型的数据，可以用同一个运算符来重载！</span></p>
<p style="TEXT-INDENT: 2em"><span>现在我们的问题是要增加自己定义的类的操作。</span></p>
<p style="TEXT-INDENT: 2em"><span><font style="FONT-SIZE: 14px">OK，言归正传，有两种定义的方法，使用类内置成员函数的方法和友元的方法来定义：</font></span></p>
<p style="TEXT-INDENT: 2em"><span><font style="FONT-SIZE: 14px">&nbsp;<wbr></font></span></p>
<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify; MARGIN-TOP: 5.76pt; TEXT-INDENT: -0.38in; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0.38in; VERTICAL-ALIGN: baseline; language: zh-Cn"><span style="FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 24pt; language: zh-Cn; mso-ascii-font-family: 'Times new roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1"><font style="FONT-SIZE: 14px">运算符的重载形式有两种：重载为类的成员函数和重载为类的友元函数。</font></span></p>
<img src ="http://www.cppblog.com/deercoder/aggbug/102110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-11-27 21:38 <a href="http://www.cppblog.com/deercoder/articles/102110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scanf函数详解</title><link>http://www.cppblog.com/deercoder/articles/102100.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Fri, 27 Nov 2009 13:21:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/102100.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/102100.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/102100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/102100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/102100.html</trackback:ping><description><![CDATA[当读入发生错误，或者是到达文件尾，scanf就会返回EOF这个宏的值。<br>while(scanf("%d%d",&amp;a,&amp;b)!=EOF），这个语句就是说，当读取没有到达文件尾的话，就不停的读取。<br>scanf 函数的返回值反映的是按照指定的格式符正确读入的数据的个数。如果输入数据与指定格式不符，则会产生输入错误。遇到输入错误，scanf函数会立即终止，返回已经成功读取的数据的个数。所以，通过scanf函数的返回值和指定输入数据的个数（由格式符决定）的比较，可以判断数据输入是否成功。<br><br>scanf("%d%d",&amp;a,&amp;b); 这个语句会去读两个整型到a, b。如果读取成功，应该返回2。就是它成功读取变量的个数。<br><br><br>论坛上很多人对scanf的不太了解，导致程序出错，我想把scanf的具体用法贴出来，希望大家可以共同进步，有什么不对的地方可以提出来。<br>int scanf(char *format，...);<br>这应该是scanf的标准形式。先说说关于他的返回值的问题。<br>库函数几乎都是有返回值的，有些人可能很奇怪，怎么很少人用过scanf的返回值呢？<br>scanf会返回成功接收到的变量数量的值。比如scanf（"%d",&amp;j"),与scanf("%d=",&amp;j),如果接受成功的话返回值都是1<br>我用如下语句作了测试<br>#include &lt;stdio.h&gt;<br>int main (){<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>int j;<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>printf ("%d",scanf("%d\n",&amp;j));<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>return 0;<br>}<br>如果你开始就输入回车，程序会继续等待你输入，因为在输入数字的时候，scanf会跳过空白字符。（the c programming language 上说，scanf实际上是用getchar()接受由数字组成的字符串，再转换成数字）<br>如果我输入ctrl-z(unix上是ctrl-d)则会返回-1(随编译器而定）.这实际上就是常量EOF的值，也就是所谓的返回eof<br>如果我键入的不是数字返回值就是0。但是如果我输入浮点数，又会怎么样呢？<br>我举的例子中同样会返回1，但是缓冲区会留下垃圾，如果是scanf("%d%d",&amp;a，&amp;b);则会出错。<br>这是可以使用一个库函数fflush(stdin)来清除缓冲。不过貌似雨中飞燕大姐说这个用法是非标准的。K&amp;R，只是说行为没有定义，但我们可以使用while((c=getchar())!='\n'&amp;&amp;c!=EOF);同样可以清除后面的垃圾<br>scanf的格式匹配还是比较简单，一定要记住的就是普通变量一定要加上&amp;，否则编译器无法检测错误，但运行肯定会段错误。<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┏━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃ 代&nbsp;<wbr>&nbsp;<wbr>码 │&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 意&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>义&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┠────┼────────────────────────────┨<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%a&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读浮点值(仅适用于 C99)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%A&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读浮点值(仅适用于 C99)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%c&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读单字符&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%d&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读十进制整数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%i&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读十进制、八进制、十六进制整数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%e&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读浮点数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%E&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读浮点数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%f&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读浮点数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%F&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读浮点数(仅适用于 C99)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%g&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读浮点数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%G&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读浮点数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%o&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读八进制数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%s&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读字符串&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%x&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读十六进制数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%X&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读十六进制数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%p&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读指针值&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%n&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│至此已读入值的等价字符数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%u&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读无符号十进制整数&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>%[ ]&nbsp;<wbr>&nbsp;<wbr>│扫描字符集合&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┃&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>%%&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>│读 % 符号(百分号)&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>┃<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> ┗━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛<br>前面都很简单，%p,%n很少用到，跳过。要输入%必须要在前面再加一个%,<br>重点来谈谈%s和%[]。%s是读入一个数组，他与gets的区别就在于%s会以任何的空字符结束，而gets是回车结束。<br>同样%s前可以加数字，表示只读多少个。<br>ANSI C 标准向 scanf() 增加了一种新特性，称为扫描集(scanset)。 扫描集定义一个字符集合，可由 scanf() 读入其中允许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义，左方括号前必须缀以百分号。 例如，以下的扫描集使 scanf() 读入字符 A、B 和 C：<br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> %[ABC]<br>使用扫描集时，scanf() 连续吃进集合中的字符并放入对应的字符数组，直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时，数组中放置以 null 结尾、由读入字符组成的字符串。<br>对于许多实现来说，用连字符可以说明一个范围。 例如，以下扫描集使 scanf() 接受字母 A 到 Z：<br>%[A-Z]<br>重要的是要注意扫描集是区分大小写的。因此，希望扫描大、小写字符时，应该分别说明大、小写字母。<br>对于%[]还可以用^+任意字符（包括eof）来结束字符串的输入。比如%[^EOF]就是直到有EOF输入，字符串才中止。<br>但一定要记住就是c语言是缓冲输入，即使你%[^a]，再你输入回车之前输入多少的a都是不可能结束的。<br>%s的输入会跳过空白字符，但是%c则不会。<br>这也就是<br>scanf("%d",&amp;h);<br>scanf("%c",&amp;c);<br>如果这写的话，变量c放的一定是回车。<br>如果想实现这种输入，可以在两个语句之间加入一个getchar(),他可以吃掉这个回车，<br>也可用scanf("%d %c",&amp;h,&amp;c);来做，再输入数字后加一个空格。就可以了<br>但千万别用scanf("%d\n",&amp;h)!!!!!!!!k&amp;r说的十分清楚，任何非格式化的字符都需要完全匹配。<br>意味着，只有输入数字后面再加\n才是合法的。<br>还有就是*加在任何项的前面表示该项不符值，别的就没什么好说的了<br>
<img src ="http://www.cppblog.com/deercoder/aggbug/102100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-11-27 21:21 <a href="http://www.cppblog.com/deercoder/articles/102100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构与STL（一）</title><link>http://www.cppblog.com/deercoder/articles/100748.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Wed, 11 Nov 2009 14:49:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/100748.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/100748.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/100748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/100748.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/100748.html</trackback:ping><description><![CDATA[偶感得到一本好书，所以分享下心得，看的很慢，呵呵。<br>
<meta http-equiv="Content-Type" content="text/html; charset="utf-8"">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 12">
<meta name="Originator" content="Microsoft Word 12">
<link rel="File-List" href="file:///C:%5CUsers%5Cliuchang%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
<o:officedocumentsettings>
<o:relyonvml/>
<o:allowpng/>
</o:officedocumentsettings>
</xml><![endif]-->
<link rel="themeData" href="file:///C:%5CUsers%5Cliuchang%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx">
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5Cliuchang%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:trackmoves/>
<w:trackformatting/>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:donotpromoteqf/>
<w:lidthemeother>EN-US</w:lidthemeother>
<w:lidthemeasian>ZH-CN</w:lidthemeasian>
<w:lidthemecomplexscript>X-NONE</w:lidthemecomplexscript>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:splitpgbreakandparamark/>
<w:dontvertaligncellwithsp/>
<w:dontbreakconstrainedforcedtables/>
<w:dontvertalignintxbx/>
<w:word11kerningpairs/>
<w:cachedcolbalance/>
<w:usefelayout/>
</w:compatibility>
<m:mathpr>
<m:mathfont m:val="Cambria Math"/>
<m:brkbin m:val="before"/>
<m:brkbinsub m:val="--"/>
<m:smallfrac m:val="off"/>
<m:dispdef/>
<m:lmargin m:val="0"/>
<m:rmargin m:val="0"/>
<m:defjc m:val="centerGroup"/>
<m:wrapindent m:val="1440"/>
<m:intlim m:val="subSup"/>
<m:narylim m:val="undOvr"/>
</m:mathpr></w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" defunhidewhenused="true"
DefSemiHidden="true" defqformat="false" defpriority="99"
LatentStyleCount="267">
<w:lsdexception locked="false" priority="0" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Normal"/>
<w:lsdexception locked="false" priority="9" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="heading 1"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"/>
<w:lsdexception locked="false" priority="39" name="toc 1"/>
<w:lsdexception locked="false" priority="39" name="toc 2"/>
<w:lsdexception locked="false" priority="39" name="toc 3"/>
<w:lsdexception locked="false" priority="39" name="toc 4"/>
<w:lsdexception locked="false" priority="39" name="toc 5"/>
<w:lsdexception locked="false" priority="39" name="toc 6"/>
<w:lsdexception locked="false" priority="39" name="toc 7"/>
<w:lsdexception locked="false" priority="39" name="toc 8"/>
<w:lsdexception locked="false" priority="39" name="toc 9"/>
<w:lsdexception locked="false" priority="35" qformat="true" name="caption"/>
<w:lsdexception locked="false" priority="10" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Title"/>
<w:lsdexception locked="false" priority="1" name="Default Paragraph Font"/>
<w:lsdexception locked="false" priority="11" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtitle"/>
<w:lsdexception locked="false" priority="22" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Strong"/>
<w:lsdexception locked="false" priority="20" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Emphasis"/>
<w:lsdexception locked="false" priority="59" semihidden="false"
UnhideWhenUsed="false" name="Table Grid"/>
<w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"/>
<w:lsdexception locked="false" priority="1" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="No Spacing"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 1"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 1"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 1"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 1"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 1"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 1"/>
<w:lsdexception locked="false" unhidewhenused="false" name="Revision"/>
<w:lsdexception locked="false" priority="34" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="List Paragraph"/>
<w:lsdexception locked="false" priority="29" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Quote"/>
<w:lsdexception locked="false" priority="30" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Quote"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 1"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 1"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 1"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 1"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 1"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 1"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 1"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 1"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 2"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 2"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 2"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 2"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 2"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 2"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 2"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 2"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 2"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 2"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 2"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 2"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 2"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 2"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 3"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 3"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 3"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 3"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 3"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 3"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 3"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 3"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 3"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 3"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 3"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 3"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 3"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 3"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 4"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 4"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 4"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 4"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 4"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 4"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 4"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 4"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 4"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 4"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 4"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 4"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 4"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 4"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 5"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 5"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 5"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 5"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 5"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 5"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 5"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 5"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 5"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 5"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 5"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 5"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 5"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 5"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 6"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 6"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 6"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 6"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 6"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 6"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 6"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 6"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 6"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 6"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 6"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 6"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 6"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 6"/>
<w:lsdexception locked="false" priority="19" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtle Emphasis"/>
<w:lsdexception locked="false" priority="21" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Emphasis"/>
<w:lsdexception locked="false" priority="31" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtle Reference"/>
<w:lsdexception locked="false" priority="32" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Reference"/>
<w:lsdexception locked="false" priority="33" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Book Title"/>
<w:lsdexception locked="false" priority="37" name="Bibliography"/>
<w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"/>
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1107304683 0 0 415 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-520092929 1073786111 9 0 415 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
{mso-style-priority:34;
mso-style-unhide:no;
mso-style-qformat:yes;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:21.0pt;
mso-char-indent-count:2.0;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:2029401865;
mso-list-type:hybrid;
mso-list-template-ids:-1850080510 1700677378 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
table.MsoTableLightShadingAccent2
{mso-style-name:"浅色底纹 - 强调文字颜色 2";
mso-tstyle-rowband-size:1;
mso-tstyle-colband-size:1;
mso-style-priority:60;
mso-style-unhide:no;
border-top:solid #C0504D 1.0pt;
mso-border-top-themecolor:accent2;
border-left:none;
border-bottom:solid #C0504D 1.0pt;
mso-border-bottom-themecolor:accent2;
border-right:none;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
color:#943634;
mso-themecolor:accent2;
mso-themeshade:191;
mso-font-kerning:1.0pt;}
table.MsoTableLightShadingAccent2FirstRow
{mso-style-name:"浅色底纹 - 强调文字颜色 2";
mso-table-condition:first-row;
mso-style-priority:60;
mso-style-unhide:no;
mso-tstyle-border-top:1.0pt solid #C0504D;
mso-tstyle-border-top-themecolor:accent2;
mso-tstyle-border-left:cell-none;
mso-tstyle-border-bottom:1.0pt solid #C0504D;
mso-tstyle-border-bottom-themecolor:accent2;
mso-tstyle-border-right:cell-none;
mso-tstyle-border-insideh:cell-none;
mso-tstyle-border-insidev:cell-none;
mso-para-margin-top:0cm;
mso-para-margin-bottom:0cm;
mso-para-margin-bottom:.0001pt;
line-height:normal;
mso-ansi-font-weight:bold;
mso-bidi-font-weight:bold;}
table.MsoTableLightShadingAccent2LastRow
{mso-style-name:"浅色底纹 - 强调文字颜色 2";
mso-table-condition:last-row;
mso-style-priority:60;
mso-style-unhide:no;
mso-tstyle-border-top:1.0pt solid #C0504D;
mso-tstyle-border-top-themecolor:accent2;
mso-tstyle-border-left:cell-none;
mso-tstyle-border-bottom:1.0pt solid #C0504D;
mso-tstyle-border-bottom-themecolor:accent2;
mso-tstyle-border-right:cell-none;
mso-tstyle-border-insideh:cell-none;
mso-tstyle-border-insidev:cell-none;
mso-para-margin-top:0cm;
mso-para-margin-bottom:0cm;
mso-para-margin-bottom:.0001pt;
line-height:normal;
mso-ansi-font-weight:bold;
mso-bidi-font-weight:bold;}
table.MsoTableLightShadingAccent2FirstCol
{mso-style-name:"浅色底纹 - 强调文字颜色 2";
mso-table-condition:first-column;
mso-style-priority:60;
mso-style-unhide:no;
mso-ansi-font-weight:bold;
mso-bidi-font-weight:bold;}
table.MsoTableLightShadingAccent2LastCol
{mso-style-name:"浅色底纹 - 强调文字颜色 2";
mso-table-condition:last-column;
mso-style-priority:60;
mso-style-unhide:no;
mso-ansi-font-weight:bold;
mso-bidi-font-weight:bold;}
table.MsoTableLightShadingAccent2OddColumn
{mso-style-name:"浅色底纹 - 强调文字颜色 2";
mso-table-condition:odd-column;
mso-style-priority:60;
mso-style-unhide:no;
mso-tstyle-shading:#EFD3D2;
mso-tstyle-shading-themecolor:accent2;
mso-tstyle-shading-themetint:63;
mso-tstyle-border-left:cell-none;
mso-tstyle-border-right:cell-none;
mso-tstyle-border-insideh:cell-none;
mso-tstyle-border-insidev:cell-none;}
table.MsoTableLightShadingAccent2OddRow
{mso-style-name:"浅色底纹 - 强调文字颜色 2";
mso-table-condition:odd-row;
mso-style-priority:60;
mso-style-unhide:no;
mso-tstyle-shading:#EFD3D2;
mso-tstyle-shading-themecolor:accent2;
mso-tstyle-shading-themetint:63;
mso-tstyle-border-left:cell-none;
mso-tstyle-border-right:cell-none;
mso-tstyle-border-insideh:cell-none;
mso-tstyle-border-insidev:cell-none;}
table.MsoTableLightShadingAccent3
{mso-style-name:"浅色底纹 - 强调文字颜色 3";
mso-tstyle-rowband-size:1;
mso-tstyle-colband-size:1;
mso-style-priority:60;
mso-style-unhide:no;
border-top:solid #9BBB59 1.0pt;
mso-border-top-themecolor:accent3;
border-left:none;
border-bottom:solid #9BBB59 1.0pt;
mso-border-bottom-themecolor:accent3;
border-right:none;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
color:#76923C;
mso-themecolor:accent3;
mso-themeshade:191;
mso-font-kerning:1.0pt;}
table.MsoTableLightShadingAccent3FirstRow
{mso-style-name:"浅色底纹 - 强调文字颜色 3";
mso-table-condition:first-row;
mso-style-priority:60;
mso-style-unhide:no;
mso-tstyle-border-top:1.0pt solid #9BBB59;
mso-tstyle-border-top-themecolor:accent3;
mso-tstyle-border-left:cell-none;
mso-tstyle-border-bottom:1.0pt solid #9BBB59;
mso-tstyle-border-bottom-themecolor:accent3;
mso-tstyle-border-right:cell-none;
mso-tstyle-border-insideh:cell-none;
mso-tstyle-border-insidev:cell-none;
mso-para-margin-top:0cm;
mso-para-margin-bottom:0cm;
mso-para-margin-bottom:.0001pt;
line-height:normal;
mso-ansi-font-weight:bold;
mso-bidi-font-weight:bold;}
table.MsoTableLightShadingAccent3LastRow
{mso-style-name:"浅色底纹 - 强调文字颜色 3";
mso-table-condition:last-row;
mso-style-priority:60;
mso-style-unhide:no;
mso-tstyle-border-top:1.0pt solid #9BBB59;
mso-tstyle-border-top-themecolor:accent3;
mso-tstyle-border-left:cell-none;
mso-tstyle-border-bottom:1.0pt solid #9BBB59;
mso-tstyle-border-bottom-themecolor:accent3;
mso-tstyle-border-right:cell-none;
mso-tstyle-border-insideh:cell-none;
mso-tstyle-border-insidev:cell-none;
mso-para-margin-top:0cm;
mso-para-margin-bottom:0cm;
mso-para-margin-bottom:.0001pt;
line-height:normal;
mso-ansi-font-weight:bold;
mso-bidi-font-weight:bold;}
table.MsoTableLightShadingAccent3FirstCol
{mso-style-name:"浅色底纹 - 强调文字颜色 3";
mso-table-condition:first-column;
mso-style-priority:60;
mso-style-unhide:no;
mso-ansi-font-weight:bold;
mso-bidi-font-weight:bold;}
table.MsoTableLightShadingAccent3LastCol
{mso-style-name:"浅色底纹 - 强调文字颜色 3";
mso-table-condition:last-column;
mso-style-priority:60;
mso-style-unhide:no;
mso-ansi-font-weight:bold;
mso-bidi-font-weight:bold;}
table.MsoTableLightShadingAccent3OddColumn
{mso-style-name:"浅色底纹 - 强调文字颜色 3";
mso-table-condition:odd-column;
mso-style-priority:60;
mso-style-unhide:no;
mso-tstyle-shading:#E6EED5;
mso-tstyle-shading-themecolor:accent3;
mso-tstyle-shading-themetint:63;
mso-tstyle-border-left:cell-none;
mso-tstyle-border-right:cell-none;
mso-tstyle-border-insideh:cell-none;
mso-tstyle-border-insidev:cell-none;}
table.MsoTableLightShadingAccent3OddRow
{mso-style-name:"浅色底纹 - 强调文字颜色 3";
mso-table-condition:odd-row;
mso-style-priority:60;
mso-style-unhide:no;
mso-tstyle-shading:#E6EED5;
mso-tstyle-shading-themecolor:accent3;
mso-tstyle-shading-themetint:63;
mso-tstyle-border-left:cell-none;
mso-tstyle-border-right:cell-none;
mso-tstyle-border-insideh:cell-none;
mso-tstyle-border-insidev:cell-none;}
</style>
<![endif]-->
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 14pt; font-family: 宋体;">总括：此部分写的还是比较好，特别是第一章，介绍了面向对象编程的特别，关键是从一个解决问题的角度来分析，相比较而言，</span><span style="font-size: 14pt;" lang="EN-US">C++ Primer</span><span style="font-size: 14pt; font-family: 宋体;">更显得杂乱无章。通过对问题深入，根据解决问题的方法，来实现最合理化的得到目的，从而引出继承等等一系列概念和手段。</span><span style="font-size: 14pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 14pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-align: left; text-indent: -18pt;" align="left"><!--[if !supportLists]--><span style="font-size: 14pt;" lang="EN-US"><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 14pt; font-family: 宋体;">构造器</span><span style="font-size: 14pt;" lang="EN-US"><o:p></o:p></span></p>
<table class="MsoTableLightShadingAccent3" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr style="height: 157pt;">
            <td style="border-style: solid none; border-color: #9bbb59 -moz-use-text-color; border-width: 1pt medium; padding: 0cm 5.4pt; width: 426.1pt; height: 157pt;" valign="top" width="568">
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US">e.g<span>&nbsp; </span>Data(int
            monthln,int dayln,int yearln)<o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US">{<o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US"><span>&nbsp; </span>Month = monthln;<o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US"><span>&nbsp; </span>Day<span>&nbsp; </span>=<span>&nbsp;
            </span>dayln;<o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US"><span>&nbsp; </span>Year<span>&nbsp; </span>=<span>&nbsp;
            </span>yearln;<o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US">}<o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US">Date thedate(7,1,2003);<o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US">Date thisdate;<o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体; color: #76923c;">第一个调用了用户定义的构造函数来初始化相应的数据，问题是，如果是</span></strong><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US">0-</span></strong><strong><span style="font-size: 12pt; font-family: 宋体; color: #76923c;">参数的构造器呢？就是下面的那种情况，没有任何参数，默认的，编译器会自动生成一个，这个就是缺省构造函数，但是如果用户定义了一个</span></strong><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US">0-</span></strong><strong><span style="font-size: 12pt; font-family: 宋体; color: #76923c;">参数的构造器，那么就不会自动生成这样一个了。从安全性角度去看，定义类的时候，应当显示的定义一个缺省构造函数（如果有继承的话，没有定义基类的缺省构造函数是会出现编译错误的。）</span></strong><strong><span style="font-size: 12pt; color: #76923c;" lang="EN-US"><o:p></o:p></span></strong></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体; color: #76923c;">注意：一个构造器，不管有没有参数，都不会自动初始化类的字段，所以必须自己显式的写出代码来初始化。</span></strong><strong><span style="font-size: 14pt; color: #76923c;" lang="EN-US"><o:p></o:p></span></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoListParagraph" style="margin-left: 18pt; text-align: left; text-indent: -18pt;" align="left"><!--[if !supportLists]--><span style="font-size: 14pt;" lang="EN-US"><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 14pt; font-family: 宋体;">继承的细节</span><span style="font-size: 14pt;" lang="EN-US"><o:p></o:p></span></p>
<table class="MsoTableLightShadingAccent2" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="border-style: solid none; border-color: #c0504d -moz-use-text-color; border-width: 1pt medium; padding: 0cm 5.4pt; width: 426.1pt;" valign="top" width="568">
            <p class="MsoListParagraph" style="text-align: left; text-indent: 0cm;" align="left"><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">我们可能经常遇到这样的问题，在开发一个类</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">B</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">的时候，发现其他的一些类</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">的方法是非常有用的。一个可能性就是令</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">B</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">从</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">继承，也就是说，</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">B</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">是</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">的子类，这样就可以使用</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">的所有方法；还有一种方案，就是在</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">B</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">中定义一个字段，它的类型是</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">，通过这个字段调用</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">的方法。前者，就是&#8220;</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">Is a</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">&#8221;</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">(</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">是一个</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">)</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">的关系，而后者就是</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">&#8221;Has a&#8221;(</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">有一个的关系</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">)</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">。如何实现这种区分更好的来规划呢，一般，如果类</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">B</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">分享了</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">的全部功能，那么</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">B</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">从</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">继承是更好的选择，但是如果</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">B</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">中只有一个组件能从</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">A</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">中受益，那么就是</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US">Has a</span></strong><strong><span style="font-size: 14pt; font-family: 宋体; color: #943634;">来实现了。。</span></strong><strong><span style="font-size: 14pt; color: #943634;" lang="EN-US"><o:p></o:p></span></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoListParagraph" style="margin-left: 18pt; text-align: left; text-indent: 0cm;" align="left"><span style="font-size: 14pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<br><br><img src ="http://www.cppblog.com/deercoder/aggbug/100748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-11-11 22:49 <a href="http://www.cppblog.com/deercoder/articles/100748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>虚函数的几点注意和重载运算符的疑问</title><link>http://www.cppblog.com/deercoder/articles/97488.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Mon, 28 Sep 2009 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/97488.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/97488.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/97488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/97488.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/97488.html</trackback:ping><description><![CDATA[<p>以下是几点学习C++后续内容的体会和注意之处，更新ing&#8230;&#8230;&#8230;&#8230;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">对于类的几点认识：<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">---------</span><span style="COLOR: #000000">《以下的几条规范是便于多文件管理，分别编译的》</span><span style="COLOR: #000000">---------</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.将类的声明放在h文件中，注意是声明，而不是定义，命名之，最好用类<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">名来给这个h文件命名。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.将类的定义放在cpp文件中，单独一个cpp文件中，以类名命名之。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.将主函数放在单独一个文件cpp中，文件名无所谓，不过取main的话便于<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">找到主体程序在哪里。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">下面要说的是虚函数：</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.在类中要声明virtual，但是放在对应的定义cpp文件中的时候，要注意去<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">掉virtual，否则会报错。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.注意声明和定义的原型都必须完全一样，比如声明中有一个const，那么<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">在定义中必须也要有，否则的话就会报错，说不认识这个函数。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.在类外定义的话一定要加上类型限定符，作用域限定符。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p>&nbsp;下面写点代码：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">student.h头文件&nbsp;<br>1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#ifndef&nbsp;STUDENT_H<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;STUDENT_H</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Student<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_92_604_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_604_Open_Text.style.display='none'; Codehighlighter1_92_604_Closed_Image.style.display='inline'; Codehighlighter1_92_604_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_92_604_Closed_Image onclick="this.style.display='none'; Codehighlighter1_92_604_Closed_Text.style.display='none'; Codehighlighter1_92_604_Open_Image.style.display='inline'; Codehighlighter1_92_604_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_92_604_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_92_604_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Student(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;b</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">):score(b),name(a),number(c)<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_180_181_Open_Image onclick="this.style.display='none'; Codehighlighter1_180_181_Open_Text.style.display='none'; Codehighlighter1_180_181_Closed_Image.style.display='inline'; Codehighlighter1_180_181_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_180_181_Closed_Image onclick="this.style.display='none'; Codehighlighter1_180_181_Closed_Text.style.display='none'; Codehighlighter1_180_181_Open_Image.style.display='inline'; Codehighlighter1_180_181_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_180_181_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_180_181_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id=Codehighlighter1_194_195_Open_Image onclick="this.style.display='none'; Codehighlighter1_194_195_Open_Text.style.display='none'; Codehighlighter1_194_195_Closed_Image.style.display='inline'; Codehighlighter1_194_195_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_194_195_Closed_Image onclick="this.style.display='none'; Codehighlighter1_194_195_Closed_Text.style.display='none'; Codehighlighter1_194_195_Open_Image.style.display='inline'; Codehighlighter1_194_195_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Student()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_194_195_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_194_195_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">void&nbsp;show_score();<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">void&nbsp;modify(Student&amp;&nbsp;a);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;Student&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;a,Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b);<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;Student&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">(Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;a,Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b);<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;std::ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(std::ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a,Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">改变状态的一般都要定义为类成员，++，--及*</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;std::istream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">(std::istream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a,Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">进行算术运算和输入输出的就定义为友元<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Student&amp;&nbsp;operator=(Student&amp;&nbsp;a);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;score;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;name;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;number;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#endif</span></div>
<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">&nbsp;1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">student.cpp文件，实现类函数<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Student.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;std::cout;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;std::cin;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Student&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;a,Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里面又用到了&lt;&lt;这个运算符的。而这个你已经自定义了啊！</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img id=Codehighlighter1_202_296_Open_Image onclick="this.style.display='none'; Codehighlighter1_202_296_Open_Text.style.display='none'; Codehighlighter1_202_296_Closed_Image.style.display='inline'; Codehighlighter1_202_296_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_202_296_Closed_Image onclick="this.style.display='none'; Codehighlighter1_202_296_Closed_Text.style.display='none'; Codehighlighter1_202_296_Open_Image.style.display='inline'; Codehighlighter1_202_296_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_202_296_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_202_296_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;a.name&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">和</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;b.name&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">分数之和为:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;a.score</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;b.score;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Student&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">(Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;a,Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b)<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img id=Codehighlighter1_339_474_Open_Image onclick="this.style.display='none'; Codehighlighter1_339_474_Open_Text.style.display='none'; Codehighlighter1_339_474_Closed_Image.style.display='inline'; Codehighlighter1_339_474_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_339_474_Closed_Image onclick="this.style.display='none'; Codehighlighter1_339_474_Closed_Text.style.display='none'; Codehighlighter1_339_474_Open_Image.style.display='inline'; Codehighlighter1_339_474_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_339_474_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_339_474_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;a.name&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;比&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;b.name&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">多</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a.score&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;b.score)</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">(a.score</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">b.score):(b.score&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;a.score);<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a;<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">std::ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(std::ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a,Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b)<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img id=Codehighlighter1_529_608_Open_Image onclick="this.style.display='none'; Codehighlighter1_529_608_Open_Text.style.display='none'; Codehighlighter1_529_608_Closed_Image.style.display='inline'; Codehighlighter1_529_608_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_529_608_Closed_Image onclick="this.style.display='none'; Codehighlighter1_529_608_Closed_Text.style.display='none'; Codehighlighter1_529_608_Open_Image.style.display='inline'; Codehighlighter1_529_608_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_529_608_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_529_608_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;b.name</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">的分数：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;b.score&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\t&nbsp;学号：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;b.number&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">std::istream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">(std::istream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a,Student</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;b)<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img id=Codehighlighter1_663_715_Open_Image onclick="this.style.display='none'; Codehighlighter1_663_715_Open_Text.style.display='none'; Codehighlighter1_663_715_Closed_Image.style.display='inline'; Codehighlighter1_663_715_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_663_715_Closed_Image onclick="this.style.display='none'; Codehighlighter1_663_715_Closed_Text.style.display='none'; Codehighlighter1_663_715_Open_Image.style.display='inline'; Codehighlighter1_663_715_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_663_715_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_663_715_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;b.name&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">b.number&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;b.score&nbsp;&nbsp;;&nbsp;<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img id=Codehighlighter1_717_842_Open_Image onclick="this.style.display='none'; Codehighlighter1_717_842_Open_Text.style.display='none'; Codehighlighter1_717_842_Closed_Image.style.display='inline'; Codehighlighter1_717_842_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_717_842_Closed_Image onclick="this.style.display='none'; Codehighlighter1_717_842_Closed_Text.style.display='none'; Codehighlighter1_717_842_Open_Image.style.display='inline'; Codehighlighter1_717_842_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_717_842_Closed_Text>/**/</span><span id=Codehighlighter1_717_842_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">33</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">问题1，修改定义函数的时候没有修改声明，为什么这么粗心呢？<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">2.返回值，特别是对于有输入输出流的，要有返回值啊！<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">3.流的返回值和调用。<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">4.返回值怎么能为void呢？因为要输出a+b，所以要返回一个值啊，相当于opreator+(a,b)<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #008000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #008000">*/</span></span></div>
<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">主函数：main.cpp&nbsp;<br>1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Student.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_75_183_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_183_Open_Text.style.display='none'; Codehighlighter1_75_183_Closed_Image.style.display='inline'; Codehighlighter1_75_183_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_75_183_Closed_Image onclick="this.style.display='none'; Codehighlighter1_75_183_Closed_Text.style.display='none'; Codehighlighter1_75_183_Open_Image.style.display='inline'; Codehighlighter1_75_183_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_75_183_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_75_183_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;a,b;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">依次输入姓名，学号，成绩</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;b;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;b;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p style="FONT-FAMILY: courier new">&nbsp;我想说的是自己遇到的几个问题：<br>1.重载&lt;&lt; 和&gt;&gt;操作符：这两个操作符只能作为友元而不是成员函数。作为重载运算符，有两种定义形式，即：成员函数形式和非成员函数形式，对于成员函数的形式，它的声明方式是形参数要比操作数少一个，为什么呢，因为省略了默认的形参this指针，而这个省略的形参正式左操作数，即定义这样的运算符的时候，this指针指向的是左操作数。其次，就是非成员函数，即友元声明方式。友元声明方式较简单合理，形参数和操作数相同，显示的是合理的调用函数的方式。<br>2.什么时候用成员函数的声明方式，什么时候用友元函数的声明方式？此部分需注意的是：1，对于=，（），【】，-&gt;这四个操作符只能作为成员函数来声明，想想这个是为什么呢？<br><span style="FONT-FAMILY: Arial"><font face="Courier New">&nbsp; (1)只能使用成员函数重载的运算符有：=、()、[]、-&gt;、new、delete。<br>&nbsp;&nbsp;(2)单目运算符最好重载为成员函数。<br>&nbsp; (3) 对于复合的赋值运算符如+=、-=、*=、/=、&amp;=、!=、~=、%=、&gt;&gt;=、&lt;&lt;=建议重载为成员函数。<br>&nbsp; (4) 对于其它运算符，建议重载为友元函数。<br></font>关于此问题的详细讨论，见：<a href="http://www.rupeng.com/forum/thread-4468-1-1-uid3573.html">http://www.rupeng.com/forum/thread-4468-1-1-uid3573.html</a><br>在C++编程思想中有述，据网友而言，大意是：如果可以定义为全局变量的话，那么就可以定义为int operator =(int,mytype),而这种方式的话就不对了，因为赋值=是和左边的类紧密相连的，所以会定义为成员函数的&#8230;&#8230;<br></span></p>
<p style="COLOR: #000000"><span style="COLOR: #ff0000">&nbsp;此部分详细关注中&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span><br><br>3.关于重载运算符的返回值的问题：<br><span style="COLOR: #000000">我们是不是已经习惯于重载运算符有一个返回值类型呢？对，是的，我们经常这么干，现在的问题是，如果我定义为void的话，会出错吗？<br></span>不会的，将上面的换成void的返回值照样不会出错！<br>为什么呢？因为定义有返回值只是我们的一个习惯，为何有返回值，因为我们要返回值，很白痴吧？可是事实就是这样，想想这个：<br><span style="COLOR: #ff0000">cout &lt;&lt; a + b;&nbsp; 这个代码很简单是吧，a+b 实际上就是operator+（a,b）的一个等价形式,我要能够cout ，那么必然有一个返回值，否则的话调用这个函数没有返回值的话我怎么cout它呢？于是乎我们在定义加法的重载的时候就只能在前面加上a和b的类型了。<br>好，现在我没有类型了，void，怎么办？很简单，直接用 a + b;&nbsp; 因为它相当于：operator+(a,b);也就是调用一个函数，直接调用，没有返回值。<br></span>当然，结果也还是对的，各位可以看看&#8230;&#8230;&#8230;&#8230;<br><br>注意我想说的，学习计算机主要的是学习那个思想，而不是片面的记住语法或者其他，要想想为什么需要这样，这样我们的思维才会和计算机接近，才能更好的理解计算机，上面的这个例子就是很好的说明，这个函数很另类了吧，可是它完全符合各种语法，能够顺利运行。。<br>可是要记住的是，重载运算符为什么要重载，就是为了使用和内置类型一样的自然，如果像上面我定义的void那样，那么恐怕就很难懂了，如果将减号定义为加法的话，那么就更加的匪夷所思。也很难读了，违背了初衷，也就是一种错误的做法了，虽然理论上是可行的。。<br><br>计算机是一个很奇妙的东西，需要我们用心去体会&#8230;&#8230;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------------------------------&lt;本章完&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/deercoder/aggbug/97488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-09-28 21:36 <a href="http://www.cppblog.com/deercoder/articles/97488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的重载运算符----------------由运算符引起的一个BUG</title><link>http://www.cppblog.com/deercoder/articles/97357.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Sun, 27 Sep 2009 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/articles/97357.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/97357.html</wfw:comment><comments>http://www.cppblog.com/deercoder/articles/97357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/97357.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/97357.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以下是main.h的内容&nbsp;1#include&nbsp;&lt;iostream&gt;&nbsp;2#include&nbsp;&lt;string&gt;&nbsp;3using&nbsp;namespace&nbsp;std;&nbsp;4&nbsp;5class&nbsp;Sales_item&nbsp;6{&nbsp;7public&nbsp;:&nbsp;8&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/deercoder/articles/97357.html'>阅读全文</a><img src ="http://www.cppblog.com/deercoder/aggbug/97357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2009-09-27 14:15 <a href="http://www.cppblog.com/deercoder/articles/97357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>