﻿<?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++博客-f(sixleaves) = sixleaves-随笔分类-program language</title><link>http://www.cppblog.com/sixleaves/category/20815.html</link><description>重剑无锋 大巧不工</description><language>zh-cn</language><lastBuildDate>Sun, 10 May 2015 23:59:32 GMT</lastBuildDate><pubDate>Sun, 10 May 2015 23:59:32 GMT</pubDate><ttl>60</ttl><item><title>Ruby-EX1鲁比入门</title><link>http://www.cppblog.com/sixleaves/archive/2015/05/02/210513.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Fri, 01 May 2015 17:16:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2015/05/02/210513.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/210513.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2015/05/02/210513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/210513.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/210513.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Ruby入门&nbsp;&nbsp;<a href='http://www.cppblog.com/sixleaves/archive/2015/05/02/210513.html'>阅读全文</a><img src ="http://www.cppblog.com/sixleaves/aggbug/210513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2015-05-02 01:16 <a href="http://www.cppblog.com/sixleaves/archive/2015/05/02/210513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++面向对象总结（一）</title><link>http://www.cppblog.com/sixleaves/archive/2014/09/04/208230.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Thu, 04 Sep 2014 09:18:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2014/09/04/208230.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/208230.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2014/09/04/208230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/208230.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/208230.html</trackback:ping><description><![CDATA[<p><strong><font size="3">1.创建对象：</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 在java中创建对象只能用new才行，返回的是引用类型，所以对象名其实是引用。而C++中的对象创建不一样，C++可以用指针存对象，相当于引用。也可以直接用类标识符来创建对象。如Person是类，Person a,b；在C++中就创建了两个对象，在java中是Person对象的引用。</font></strong></p> <p><strong><font size="3">2.C++中了this指针：</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; C++中的this指针和java中的一样。在C++中，this指针指向当前对象，this指针隐含在每个成员函数之中，其类型是class className *.</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 内部机制：</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 在C++中访问数据成员都是隐含的使用this指针操作的。需要注意的是。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 1.this指针是const类型，不可改变。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 2.this指针针对对象，所以静态成员是没有this指针的。</font></strong></p> <p><strong><font size="3">3.构造函数和析构函数</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 构造函数就不说了，只说下默认构造函数就死className() {},默认会生成。但是如果你自己定义了构造函数，而且不是定义成默认构造函数，就要在定义一下默认构造函数，不然创建对象时候必须指定参数，不能用无参数的。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 析构函数，就是用来在对象要销毁时候，回收一些对象自己向系统申请的内存。析构函数调用完后，系统才清除对象本身占据的内存。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tips：</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.析构函数不能重载，只有一种形式~className() {},这是和构造函数的区别</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.三种情况下调用析构函数，对象离开局部作用域后，撤销对象触发，程序终止，触发；delete运算符回收new创建的对象触发；临时匿名函数使用完毕；</font></strong></p> <p><strong><font size="3">4.拷贝构造函数和单参构造函数</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）拷贝构造函数，其实就是构造函数中的单参数形式的构造函数，只是其参数比较特别，是对自身同类对象的引用。拷贝构造函数在一下几个的方会用到。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date a;Date b(a);//调用的就是拷贝构造函数</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date b = a；//调用的也是拷贝构造函数</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function(Date d)｛&#8230;.｝；function(a);//调用的也是拷贝构造函数（先创建Date类的匿名对象，然后调用拷贝构造函数）</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date c = function(a);//这边function返回Date对象，也是调用拷贝构造函数（没有创建匿名对象）</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）单参构造函数</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单参数构造函数。其实拷贝构造函数也是单参构造函数。但是我将他们区别开来，主要是单参构造函数，主要是用在，隐式的类型转换上。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如你定义了一个Integer类，直接Integer a = 1；是会出错的。因为1不能自动或者隐含的转换成Integer对象，所以这时候你就要定义</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单参数构造函数，用来让自动转换，在java中称为包装。由于是构造函数，参数中的类型就是那个要转换的类型。其它和基本构造函数一样。</font></strong></p> <p><strong><font size="3">5.静态成员</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 静态成员又分为静态数据成员和静态函数成员。C++中的静态函数成员和java也没区别。主要是静态数据成员。所以我们总结下静态数据成员</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）静态数据成员和类共存亡而不是和对象。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）静态数据成员在类加载时候分配空间并进行初始化，而不是在对象加载时候。所以静态数据成员默认初始化为0。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重点是：类中的静态数据成员知识一份声明，必须在类外重新定义并初始化静态数据成员。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）类外通过类作用域运算符：：访问静态数据成员。</font></strong></p> <p><strong><font size="3">6.const用法</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）const成员函数，这时候const加载函数名后面 ｛｝之前。表示函数不会改变当前对象的状态，而且只能调用const成员函数。（养成习惯，能加尽量加）</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tips：这里const也是函数签名的一部分。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）const对象，表示常量对象。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）const形参，表示函数中不会改变该形参。注意：常量对象，只能调用const成员函数，因为这才能保证状态不被改变，同时这样保证了他就是常量对象。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tips：这里const也是函数签名的一部分。</font></strong></p> <p><strong><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （4）const返回值，说明返回值是不可以改变的。</font></strong></p> <p><strong><font size="3">以上这些都是总结，不是写给没基础的人看的。只是为了方便整理和记忆。</font></strong></p><img src ="http://www.cppblog.com/sixleaves/aggbug/208230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2014-09-04 17:18 <a href="http://www.cppblog.com/sixleaves/archive/2014/09/04/208230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>运算符重载-友原函数(结构体、类和运算符重载)</title><link>http://www.cppblog.com/sixleaves/archive/2014/08/29/208178.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Fri, 29 Aug 2014 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2014/08/29/208178.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/208178.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2014/08/29/208178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/208178.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/208178.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">最近在练习算法、觉得有必要总结下C++这方面的知识，C++确实是复杂，but i love it。</span><br /><span style="font-size: 12pt;">
第一：运算符重载的基本应用。第二：运算符重载于友原函数的关系。第三：结构体于类关于运算符重载的区别。首先我需要普及下基本的知识：</span><br />
<span style="color: #ff0000; font-size: 14pt;"><strong>预备知识</strong></span><span style="color: #008000; font-size: 14pt;">：</span><span style="color: #008000; font-size: 14pt;"><strong>operator(操作符)、operand(操作数)、表达式</strong></span><br />
<span style="font-size: 12pt;">表达式是由操作符和操作数构成的，而且一般每个表达式都有副作用，并且都有结果（关注结果和副作用）。什么意思？</span><br /><span style="font-size: 12pt;">
关于副作用的理解：其实就是在达到结果的这个过程中所做的一些事情，而这些事情产生了一些影响，但是不影响结果。</span><br /><span style="font-size: 12pt;">
好像有点绕、看看例子在理解吧。</span><br /><span style="font-size: 12pt;">
看例子：</span><br /><span style="font-size: 12pt;">
int a = 1,b=2,c; c = a + b;</span><br /><span style="font-size: 12pt;">
在这段代码里面，c = a + b;就是表达式、其中 = 、 + 又称为操作符、c、a、b又称为操作数。其结果就是计算出了a+b的值，副作用没有。</span><br /><span style="font-size: 12pt;">
又比如：</span><br /><span style="font-size: 12pt;">
cout &lt;&lt; "Helloe" &lt;&lt; endl;其中 &lt;&lt;是操作符、cout、"helloe"、endl是操作数。&lt;&lt;的结果是返回了ostream的引用，而副作用就是将"Helloe"输出到屏幕。</span><br />
<br />
<span style="color: #ff0000; font-size: 14pt;"><strong>第一</strong></span><span style="color: #008000; font-size: 14pt;"><strong>：运算符重载的基本应用。</strong></span><span style="color: #008000;"><strong><br />
</strong></span><span style="font-size: 12pt;">看如下代码：</span><br />
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
好
--><span style="color: #008080; font-size: 12pt;">&nbsp;1</span><span style="font-size: 12pt;">&nbsp;#include&nbsp;&lt;iostream&gt;</span><br />
<span style="color: #008080; font-size: 12pt;">&nbsp;2</span>&nbsp;<br />
<span style="color: #008080; font-size: 12pt;">&nbsp;3</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">using</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">namespace</span><span style="font-size: 12pt;">&nbsp;std;</span><br />
<span style="color: #008080; font-size: 12pt;">&nbsp;4</span>&nbsp;<br />
<span style="color: #008080; font-size: 12pt;">&nbsp;5</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">class</span><span style="font-size: 12pt;">&nbsp;Point&nbsp;{</span><br />
<span style="color: #008080; font-size: 12pt;">&nbsp;6</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">private</span><span style="font-size: 12pt;">:</span><br />
<span style="color: #008080; font-size: 12pt;">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">double</span><span style="font-size: 12pt;">&nbsp;x,y;</span><br />
<span style="color: #008080; font-size: 12pt;">&nbsp;8</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">public</span><span style="font-size: 12pt;">:</span><br />
<span style="color: #008080; font-size: 12pt;">&nbsp;9</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point(</span><span style="color: #0000ff; font-size: 12pt;">double</span><span style="font-size: 12pt;">&nbsp;x&nbsp;=&nbsp;0,&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">double</span><span style="font-size: 12pt;">&nbsp;y&nbsp;=&nbsp;0):x(x),y(y)&nbsp;{</span><br />
<span style="color: #008080; font-size: 12pt;">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; font-size: 12pt;">11</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br />
<span style="color: #008080; font-size: 12pt;">12</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">operator</span><span style="font-size: 12pt;">+(</span><span style="color: #0000ff; font-size: 12pt;">const</span><span style="font-size: 12pt;">&nbsp;Point&nbsp;&amp;p)&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">const</span><span style="font-size: 12pt;">{</span><span style="color: #008000; font-size: 12pt;">//</span><span style="color: #008000; font-size: 12pt;">这种是最基本的方式、其本质是做操作数调用operator+函数&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #008080; font-size: 12pt;">13</span>&nbsp;<span style="color: #008000; "></span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;temp;</span><br />
<span style="color: #008080; font-size: 12pt;">14</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.x&nbsp;=&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">this</span><span style="font-size: 12pt;">-&gt;x&nbsp;+&nbsp;p.x;&nbsp;</span><br />
<span style="color: #008080; font-size: 12pt;">15</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.y&nbsp;=&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">this</span><span style="font-size: 12pt;">-&gt;y&nbsp;+&nbsp;p.y;</span><br />
<span style="color: #008080; font-size: 12pt;">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">return</span><span style="font-size: 12pt;">&nbsp;temp;</span><br />
<span style="color: #008080; font-size: 12pt;">17</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br />
<span style="color: #008080; font-size: 12pt;">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; font-size: 12pt;">/*</span><span style="color: #008000; "><br />
</span><span style="color: #008080; font-size: 12pt;">19</span>&nbsp;<span style="color: #008000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;ostream&amp;&nbsp;operator&lt;&lt;(ostream&amp;&nbsp;out)&nbsp;{<br />
</span><span style="color: #008080; font-size: 12pt;">20</span>&nbsp;<span style="color: #008000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;&lt;&lt;&nbsp;x&nbsp;&lt;&lt;&nbsp;"&nbsp;"&nbsp;&lt;&lt;&nbsp;y;<br />
</span><span style="color: #008080; font-size: 12pt;">21</span>&nbsp;<span style="color: #008000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;out;<br />
</span><span style="color: #008080; font-size: 12pt;">22</span>&nbsp;<span style="color: #008000; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; font-size: 12pt;">23</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; font-size: 12pt;">*/</span><br />
<span style="color: #008080; font-size: 12pt;">24</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;ostream&amp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">operator</span><span style="font-size: 12pt;">&lt;&lt;(ostream&amp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">out</span><span style="font-size: 12pt;">,&nbsp;Point&nbsp;&amp;&nbsp;p);&nbsp;&nbsp;&nbsp;</span><br />
<span style="color: #008080; font-size: 12pt;">25</span><span style="font-size: 12pt;">&nbsp;};</span><br />
<span style="color: #008080; font-size: 12pt;">26</span>&nbsp;<span style="color: #808080; font-size: 12pt;">///</span><span style="color: #008000; font-size: 12pt;">*</span><span style="color: #808080; "><br />
</span><span style="color: #008080; font-size: 12pt;">27</span>&nbsp;<span style="color: #808080; "></span><span style="font-size: 12pt;">ostream&amp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">operator</span><span style="font-size: 12pt;">&lt;&lt;(ostream&amp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">out</span><span style="font-size: 12pt;">,&nbsp;Point&nbsp;&amp;&nbsp;p)&nbsp;{</span><br />
<span style="color: #008080; font-size: 12pt;">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">out</span><span style="font-size: 12pt;">&nbsp;&lt;&lt;&nbsp;p.x&nbsp;&lt;&lt;"&nbsp;"&lt;&lt;&nbsp;p.y;</span><br />
<span style="color: #008080; font-size: 12pt;">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">return</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">out</span><span style="font-size: 12pt;">;</span><br />
<span style="color: #008080; font-size: 12pt;">30</span><span style="font-size: 12pt;">&nbsp;}</span><br />
<span style="color: #008080; font-size: 12pt;">31</span>&nbsp;<span style="color: #008000; font-size: 12pt;">//</span><span style="color: #008000; font-size: 12pt;">*/</span><span style="color: #008000; "><br />
</span><span style="color: #008080; font-size: 12pt;">32</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; font-size: 12pt;">33</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">int</span><span style="font-size: 12pt;">&nbsp;main()&nbsp;{</span><br />
<span style="color: #008080; font-size: 12pt;">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; font-size: 12pt;">35</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;a(1,5);</span><br />
<span style="color: #008080; font-size: 12pt;">36</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;b(5,7);</span><br />
<span style="color: #008080; font-size: 12pt;">37</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;c;</span><br />
<span style="color: #008080; font-size: 12pt;">38</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;a&nbsp;+&nbsp;b;</span><br />
<span style="color: #008080; font-size: 12pt;">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; font-size: 12pt;">//</span><span style="color: #008000; font-size: 12pt;">c&nbsp;&lt;&lt;&nbsp;cout&nbsp;&lt;&lt;&nbsp;endl;</span><span style="color: #008000; "><br />
</span><span style="color: #008080; font-size: 12pt;">40</span>&nbsp;<span style="color: #008000; "></span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;c&nbsp;&lt;&lt;&nbsp;endl;&nbsp;</span><br />
<span style="color: #008080; font-size: 12pt;">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">return</span><span style="font-size: 12pt;">&nbsp;0;</span><br />
<span style="color: #008080; font-size: 12pt;">42</span><span style="font-size: 12pt;">&nbsp;}</span></div><span style="font-size: 12pt;">如上代码：</span><br /><span style="font-size: 12pt;">注释掉的先不用看，12--17行就是最基本的运算符重载、其调用在38行，本质是：c = a.operator+(b);也就是调用做操作数的方法那么还要友元函数干什么呢？考虑下输出，如果你想让cout对象能自动输出Point的对象如何半到。你很聪明一定想到重载&lt;&lt;运算符、yes！right！于是把operator&lt;&lt;作为成员函数，你只能写成上面注释掉的哪样，那么调用时，麻烦就来了、编程39行的样子。尼玛丫、真实变态、我是想让它是cout &lt;&lt; c &lt;&lt; endl。搞得四不像了。是的就是因为这样子不好用，所以我们要结合友元函数的技术和运算重载技术来实现40行的调用。好了重点来了！谨记之！</span><br /><span style="color: #008000; font-size: 12pt;">tips:对于非成员函数的运算符重载，第一个参数就是左操作数，第二个操作数就是右操作数。</span><span style="color: #008000;"><br /></span><strong><span style="color: #ff0000; font-size: 14pt;">第二：</span><span style="color: #008000; font-size: 14pt;">运算符重载和友原函数的关系</span></strong><br /><span style="font-size: 12pt;">所以上面的友元函数的参数顺序是cout对象的引用是第一个参数、Point对象引用为第二个参数。</span><br /><span style="font-size: 12pt;">我们还要解决第二个问题，如何让这个函数访问Point对象的私有部分，只要在Point类中声明，hello我是你的朋友啦、他的东西就是你的啦、你要怎么用怎么用，这才是朋友么！不、是基友！我认为应该叫做基友函数，哈哈。声明格式就是加上friend和函数的声明即可。</span><br /><span style="font-size: 12pt;">tips:</span><span style="color: #008000; font-size: 12pt;">成员函数和非成员函数的运算符重载的区别就是，参数个数不一样。成员函数中的左操作数不用体现出来（用this即可）、而非成员函数的左右操作数都要体现在运算符函数参数里面。</span><span style="color: #008000;"><br /></span><strong style="color: #ff0000; font-size: 14pt;">第三：</strong><strong style="color: #008000; font-size: 14pt;">结构体和类关于运算符重载的区别</strong><br /><span style="font-size: 12pt;">关于区别，其实只有一个，因为结构体默认的权限是public、即其成员对外界都是可见的，所以其不需要友元函数来支持，但是其还是需要用非成员函数来重载&lt;&lt;比较方便、而不是用成员函数来重载&lt;&lt;.原因上面已经说过了。注意这个原因不是友元这项技术体现出来的，而是成员函数和非成员函数体现出来的，友元技术知识用来支撑其在类中的应用。、<br /></span><span style="color: #008000; font-size: 12pt;">tips:对于结构体，非成员函数的运算符重载方法，不需要声明为友元函数。</span><br /><span style="font-size: 12pt;">如下代码：</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; font-size: 12pt;">&nbsp;1</span><span style="font-size: 12pt;">&nbsp;#include&nbsp;&lt;iostream&gt;</span><br /><span style="color: #008080; font-size: 12pt;">&nbsp;2</span>&nbsp;<br /><span style="color: #008080; font-size: 12pt;">&nbsp;3</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">using</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">namespace</span><span style="font-size: 12pt;">&nbsp;std;</span><br /><span style="color: #008080; font-size: 12pt;">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; font-size: 12pt;">&nbsp;5</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">struct</span><span style="font-size: 12pt;">&nbsp;Point{</span><br /><span style="color: #008080; font-size: 12pt;">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">double</span><span style="font-size: 12pt;">&nbsp;x,y;</span><br /><span style="color: #008080; font-size: 12pt;">&nbsp;7</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point(</span><span style="color: #0000ff; font-size: 12pt;">double</span><span style="font-size: 12pt;">&nbsp;x&nbsp;=&nbsp;0,&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">double</span><span style="font-size: 12pt;">&nbsp;y&nbsp;=&nbsp;0):x(x),y(y)&nbsp;{</span><br /><span style="color: #008080; font-size: 12pt;">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; font-size: 12pt;">&nbsp;9</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="color: #008080; font-size: 12pt;">10</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">operator</span><span style="font-size: 12pt;">+(</span><span style="color: #0000ff; font-size: 12pt;">const</span><span style="font-size: 12pt;">&nbsp;Point&nbsp;&amp;p)&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">const</span><span style="font-size: 12pt;">{</span><span style="color: #008000; font-size: 12pt;">//</span><span style="color: #008000; font-size: 12pt;">这种是最基本的方式、其本质是做操作数调用operator+函数&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; font-size: 12pt;">11</span>&nbsp;<span style="color: #008000; "></span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;temp;</span><br /><span style="color: #008080; font-size: 12pt;">12</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.x&nbsp;=&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">this</span><span style="font-size: 12pt;">-&gt;x&nbsp;+&nbsp;p.x;&nbsp;</span><br /><span style="color: #008080; font-size: 12pt;">13</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.y&nbsp;=&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">this</span><span style="font-size: 12pt;">-&gt;y&nbsp;+&nbsp;p.y;</span><br /><span style="color: #008080; font-size: 12pt;">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">return</span><span style="font-size: 12pt;">&nbsp;temp;</span><br /><span style="color: #008080; font-size: 12pt;">15</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="color: #008080; font-size: 12pt;">16</span><span style="font-size: 12pt;">&nbsp;};</span><br /><span style="color: #008080; font-size: 12pt;">17</span>&nbsp;<br /><span style="color: #008080; font-size: 12pt;">18</span><span style="font-size: 12pt;">&nbsp;ostream&amp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">operator</span><span style="font-size: 12pt;">&lt;&lt;(ostream&amp;&nbsp;</span><span style="color: #0000ff; font-size: 12pt;">out</span><span style="font-size: 12pt;">,&nbsp;Point&nbsp;&amp;&nbsp;p)&nbsp;{&nbsp;</span><br /><span style="color: #008080; font-size: 12pt;">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">out</span><span style="font-size: 12pt;">&nbsp;&lt;&lt;&nbsp;p.x&nbsp;&lt;&lt;"&nbsp;"&lt;&lt;&nbsp;p.y;</span><br /><span style="color: #008080; font-size: 12pt;">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">return</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">out</span><span style="font-size: 12pt;">;</span><br /><span style="color: #008080; font-size: 12pt;">21</span><span style="font-size: 12pt;">&nbsp;}</span><br /><span style="color: #008080; font-size: 12pt;">22</span>&nbsp;<br /><span style="color: #008080; font-size: 12pt;">23</span>&nbsp;<br /><span style="color: #008080; font-size: 12pt;">24</span>&nbsp;<span style="color: #0000ff; font-size: 12pt;">int</span><span style="font-size: 12pt;">&nbsp;main()&nbsp;{</span><br /><span style="color: #008080; font-size: 12pt;">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; font-size: 12pt;">26</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;a(1,5);</span><br /><span style="color: #008080; font-size: 12pt;">27</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;b(5,7);</span><br /><span style="color: #008080; font-size: 12pt;">28</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;c;</span><br /><span style="color: #008080; font-size: 12pt;">29</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;a&nbsp;+&nbsp;b;</span><br /><span style="color: #008080; font-size: 12pt;">30</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;c&nbsp;&lt;&lt;&nbsp;endl;&nbsp;</span><br /><span style="color: #008080; font-size: 12pt;">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-size: 12pt;">return</span><span style="font-size: 12pt;">&nbsp;0;</span><br /><span style="color: #008080; font-size: 12pt;">32</span><span style="font-size: 12pt;">&nbsp;}</span></div><img src ="http://www.cppblog.com/sixleaves/aggbug/208178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2014-08-29 16:31 <a href="http://www.cppblog.com/sixleaves/archive/2014/08/29/208178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入探讨函数指针</title><link>http://www.cppblog.com/sixleaves/archive/2014/07/26/207814.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Sat, 26 Jul 2014 10:08:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2014/07/26/207814.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/207814.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2014/07/26/207814.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/207814.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/207814.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">函数指针是一个重难点，看完书本后，决定写篇自己做下总结。</span><br /><span style="color: #ff0000; font-size: 12pt;">首先在C++\C中，函数的函数名本身就是地址</span><span style="font-size: 12pt;">，而函数指针就是存储这个地址的变量。</span><br /><span style="font-size: 12pt;">如下代码void fun(int a, int b) {.....}；函数，其fun就是一个指针，也就是存的是地址，</span><br /><span style="font-size: 12pt;">而void (*p)(int, int) = fun；就是指向这个函数的指针，其实说来p函数指针这时也使指</span><br /><span style="font-size: 12pt;">向这个函数的，所以要使用这个函数的话，理论上应该写成(*p)(2, 3);这种形式，但是实</span><br /><span style="font-size: 12pt;">际上，通过p(2, 3)也可以成功调用，所以我们可以把函数指针在某种情况下当成函数的别</span><br /><span style="font-size: 12pt;">名，虽然这样不符合逻辑，当然，如果你比较较真，可以使用(*p)(2, 3);这边讲了这么多</span><br /><span style="font-size: 12pt;">现在来总结下如何声明一个特定类型的函数指针吧。</span><br /><span style="font-size: 18pt;">知识点1:</span><br /><span style="font-size: 14pt; color: #0000ff;">声明特定类型的函数指针:</span><br /><span style="font-size: 14pt; color: #0000ff;">&nbsp; &nbsp; &nbsp;1.先写出要声明的指定函数的原型prototype。如void fun(int , int );</span><br /><span style="font-size: 14pt; color: #0000ff;">&nbsp; &nbsp; &nbsp;2.把prototype中的函数名替换成(*p)，如void (*p)(int , int );</span><br /><span style="font-size: 12pt;">经过上面两步，你就声明了一个指向无返回值，带有两个int类型的函数的函数指针p。</span><br /><span style="font-size: 12pt;">哇，原来函数指针这么简单啊、谁说指针很复杂的，谁说指针很难的，拉出去斩了、欺骗我们幼小的心灵。</span><br /><span style="font-size: 12pt;">此时你可能会问，怎么调用啊，怎么调用啊，首先你要给他赋值，其次，调用分两种，就是上面一开始说</span><br /><span style="font-size: 12pt;">的那两种。说白了，也就是对于函数指针调用函数，你可以解引用，可以刻直接用地址。</span><br /><br /><font size="5">知识点2:</font><br /><span style="font-size: 19px; color: #0000ff;">声明特定类型的函数指针数组:<br /></span><span style="font-size: 19px; color: #0000ff;">&nbsp; &nbsp; 1.和知识点一1,2步一样,我们先写出一个。第二步在想办法写成一个数组<br /></span><span style="font-size: 19px; color: #0000ff;">&nbsp; &nbsp; 2.把(*p)替换成(*p[3])这样p就是一个包含3个函数指针的数组。也就是说p是函数指针的指针！</span><span style="color: #0000ff;"><br /><span style="color: #000000; font-size: 12pt;">什么意思！什么叫做指针的指针，你在说什么！，哈哈有得人看到这开始晕了，那么后面的你更晕，其实说白了p是指向数组的第一个元素<br /></span></span><span style="color: #000000; font-size: 12pt;">也就是说p的地址值是第一个元素的地址，所以说p是函数指针的指针啊，因为p指向的时函数指针，函数指针指向的才是内存中函数指令区域的那个块!</span><span style="color: #0000ff;"><br /><br /></span><span style="color: #000000; font-size: 18pt;">知识点3:</span><span style="color: #0000ff;"><br /></span><span style="color: #0000ff; font-size: 14pt;">对于数组p[n]区别，p和&amp;p的重大区别:<br /></span><span style="color: #0000ff; font-size: 12pt;">前言：我们知道p指向数组的第一个元素，所以p等价于&amp;p[0]，所以我们可以轻易看出区别了，p和&amp;p<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp; 的相同点是在数字上，他们相同，但是在大小上，或者说类型上，他们不同，&amp;p指向的时整个数<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp; 组，如果&amp;p + 1则跨越的时整个数组。其实我们可以从指针定义的运算来理解，我们知道，指针<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp; 的加加，本质上是地址的跨越，而跨越的长度，取决于地址的类型，&amp;p是指向数组的指针，所以<br /></span>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff; font-size: 12pt;">其跨越的长度，肯定是一整个数组，而p指向的时数组中得第一个元素，所以p + 1，跨越的时数</span><br /><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp; 组的一个元素。</span><span style="color: #0000ff;"><br /></span><span style="color: #0000ff; font-size: 14pt;">1.p和&amp;p的相同点，在于数值上，他们都是那个内存块的地址，而那个内存块用一个地址标志，所以他们的数字相同。<br /></span><span style="color: #0000ff; font-size: 14pt;">2.p和&amp;p的区别在于类型上，p是指向一个元素的，&amp;p是指向一个数组的，所以p + 1和&amp;p + 1有十分大得区别。</span><span style="color: #0000ff; font-size: 14pt;"><br /><br /></span><span style="font-size: 18pt;">知识点4:<br /></span><span style="color: #0000ff; font-size: 19px;">问题:<br /></span><span style="color: #0000ff; font-size: 12pt;">假设有</span><span style="color: #0000ff; font-size: 12pt;">const double * (*pa[3])(const double * , int ) = {f1, f2, f3}，</span><span style="color: #0000ff; font-size: 19px;">声明指向该函数指针数组的指针。<br /></span><br /><span style="color: #0000ff; font-size: 12pt;">有了知识点3，理解知识点4就十分容易了。</span><span style="color: #0000ff; font-size: 14pt;"><br /></span><span style="color: #0000ff; font-size: 14pt;">&nbsp; &nbsp; &nbsp; 1.C11方法auto pc = &amp;pa; &nbsp;C11的方式十分简单方便但是对于不支持C11的请看第二个，最原始的方法<br /></span><span style="color: #0000ff; font-size: 14pt;">&nbsp; &nbsp; &nbsp; 2.分析:因为我们要声明的时一个指针，而不是一个数组所以首先用(*pd)把其扩起来，然后其是指向一个函数指针数组，</span><span style="color: #0000ff; font-size: 14pt;">这个数组有3个元素。所以其核心部分就是(*pd)[3],此时的意思就是所pd是一个指针，其指向包含3个元素的数组<br /></span><span style="color: #0000ff; font-size: 14pt;">所以第三步我们要说明，数组元素的类型了，类型就是const double * (*)(const double *, int),也就是</span><span style="color: #0000ff; font-size: 14pt;">const double * (* (*pd)[3])(const double *, int)。<br /></span><span style="color: #ff0000; font-size: 14pt;">tips:</span><span style="color: #0000ff; font-size: 14pt;"><br /></span><span style="color: #000000; font-size: 14pt;">有人反映第三步类型看不懂，其实很简单，我举个例子，<br />1.int *p;p的类型是int *,<br />2.而int *p[3],p的类型是int * [3]也很好理解就是带有三个数组，元素类型都是int *。<br />3.而int (*p[3])(int )，p的类型是int (*[3])(int),p是指向一个3个元素的数组，且每个元素的类型都是int (*)(int)。<br />(指针是什么类型主要看括号、*号、[]号,和参数列表的结合顺序，如果只有(*p)(int ,....)那p就是函数指针)<br />所以有以下推论。</span><span style="color: #000000; font-size: 14pt;">&nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 14pt;"><br /></span><span style="color: #ff0000; font-size: 14pt;">元素的数据类型推论：<br /></span><span style="font-size: 19px; color: #ff0000;">要判断数组或指针的类型，就是拿掉&lt;数组名、指针名&gt;后组成的，而且[]和*是从右向左结合。<br />要判断数组元素的类型，就是在数组类型的基础上把大小拿掉</span><span style="font-size: 19px; color: #ff0000;">。<br /></span><br /><span style="font-size: 18pt;">知识点5:<br /></span><span style="color: #0000ff; font-size: 14pt;">使用typedef创建函数指针类型别名:<br /></span><span style="color: #0000ff;">&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff; font-size: 14pt;">1.typedef简化函数指针其本质就是为函数指针的类型取别名。</span><span style="color: #0000ff;"><br /></span><span style="font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff; font-size: 12pt;">如下：<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp;typedef const double *(*p_fun)(const double *, int);其是此时相当于typedef Const double *(*)(const double *, int) &nbsp;p_fun;<br />当然你不能这样写，这样写只是方便你理解。<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp;p_fun不是函数指针了，而是这种函数指针类型的别名，所以此时你可以这样做<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp;p_fun p1 = f1;<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp;p_fun pa[3] = {f1, f2, f3};<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp;p_fun (*pd)[3] = &amp;pa;<br /></span><span style="color: #0000ff; font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp;是不是比之前的简单许多！，这个很重要哦<br /></span><span style="color: #0000ff; font-size: 12pt;">好了函数指针就总结到这，如有不足请指教。<br />以下是测试代码：测试代码参考自C++ Primer Plus<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Unit7<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Created&nbsp;by&nbsp;sixleaves&nbsp;on&nbsp;14-7-26.<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2014年&nbsp;sixleaves.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*&nbsp;f1(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;ar[],&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n);<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*&nbsp;f2(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;[],&nbsp;<span style="color: #0000FF; ">int</span>);<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*&nbsp;f3(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*,&nbsp;<span style="color: #0000FF; ">int</span>);<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;av[3]&nbsp;=&nbsp;{1112.3,&nbsp;1542.6,&nbsp;2227.9};<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">pointer&nbsp;to&nbsp;a&nbsp;function</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*&nbsp;(*p1)(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*,&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;f1;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;p2&nbsp;=&nbsp;f2;<span style="color: #008000; ">//</span><span style="color: #008000; ">C++11&nbsp;automatic&nbsp;type&nbsp;deduction<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">pre-C11&nbsp;can&nbsp;use&nbsp;the&nbsp;following&nbsp;code&nbsp;instead<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">const&nbsp;double&nbsp;*&nbsp;(*p2)(const&nbsp;double&nbsp;*,&nbsp;int)&nbsp;=&nbsp;f2;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"Using&nbsp;pointers&nbsp;to&nbsp;functions:\n";<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"Address&nbsp;Value\n";<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;(*p1)(av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;":&nbsp;"&nbsp;&lt;&lt;&nbsp;*(*p1)(av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">严密的逻辑性调用</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;p2(av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;":&nbsp;"&nbsp;&lt;&lt;&nbsp;*p2(av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">感性调用<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">pa&nbsp;an&nbsp;array&nbsp;of&nbsp;pointers<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">auto&nbsp;doesn't&nbsp;work&nbsp;with&nbsp;list&nbsp;initialization</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*(*pa[3])(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*,&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;{f1,&nbsp;f2,&nbsp;f3};<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">but&nbsp;it&nbsp;does&nbsp;work&nbsp;for&nbsp;initializing&nbsp;to&nbsp;a&nbsp;single&nbsp;value<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">pb&nbsp;a&nbsp;pointer&nbsp;to&nbsp;&nbsp;fitst&nbsp;element&nbsp;of&nbsp;pa</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;pb&nbsp;=&nbsp;pa;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">pre-c11&nbsp;can&nbsp;use&nbsp;the&nbsp;following&nbsp;code&nbsp;instead<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">const&nbsp;double&nbsp;*(**pb)(const&nbsp;double&nbsp;*,&nbsp;int)&nbsp;=&nbsp;pa;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"\nUsing&nbsp;an&nbsp;array&nbsp;of&nbsp;pointer&nbsp;to&nbsp;functions:\n";<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"&nbsp;Address&nbsp;Value\n";<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;3;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;pb[i](av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;":&nbsp;"&nbsp;&lt;&lt;&nbsp;*pb[i](av,&nbsp;3)&nbsp;&lt;&lt;endl;<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">what&nbsp;about&nbsp;a&nbsp;pointer&nbsp;to&nbsp;an&nbsp;array&nbsp;of&nbsp;function&nbsp;pointers;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"\nUsing&nbsp;pointers&nbsp;to&nbsp;an&nbsp;array&nbsp;of&nbsp;function&nbsp;pointers:\n";<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"&nbsp;Adress&nbsp;Values\n";<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">easy&nbsp;way&nbsp;to&nbsp;declare&nbsp;pc</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;pc&nbsp;=&nbsp;&amp;pa;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">pre&nbsp;c11&nbsp;can&nbsp;use&nbsp;the&nbsp;following&nbsp;code&nbsp;instead<br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">const&nbsp;double&nbsp;*(*(*pc)[3])(const&nbsp;double&nbsp;*,&nbsp;int)&nbsp;=&nbsp;&amp;pa;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;(*pc)[0](av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;":&nbsp;"&nbsp;&lt;&lt;&nbsp;*(*pc)[0](av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">hard&nbsp;way&nbsp;to&nbsp;declare&nbsp;pd;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*(*(*pd)[3])(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*,&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;&amp;pa;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">store&nbsp;return&nbsp;value&nbsp;in&nbsp;pdb;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*pdb&nbsp;=&nbsp;(*pd)[1](av,&nbsp;3);<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;pdb&nbsp;&lt;&lt;&nbsp;":&nbsp;"&nbsp;&lt;&lt;&nbsp;*pdb&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">alternative&nbsp;notation</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;(*(*pd)[2])(av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;":&nbsp;"&nbsp;&lt;&lt;&nbsp;*(*(*pd)[2])(av,&nbsp;3)&nbsp;&lt;&lt;&nbsp;endl;<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">69</span>&nbsp;}<br /><span style="color: #008080; ">70</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*&nbsp;f1(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;ar[],&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n)&nbsp;{<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ar;<br /><span style="color: #008080; ">72</span>&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*&nbsp;f2(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;ar[],&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;{<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ar&nbsp;+&nbsp;1;<br /><span style="color: #008080; ">75</span>&nbsp;}<br /><span style="color: #008080; ">76</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;*&nbsp;f3(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;ar[],&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;{<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ar&nbsp;+&nbsp;2;<br /><span style="color: #008080; ">78</span>&nbsp;}<br /><span style="color: #008080; ">79</span>&nbsp;</div><img src ="http://www.cppblog.com/sixleaves/aggbug/207814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2014-07-26 18:08 <a href="http://www.cppblog.com/sixleaves/archive/2014/07/26/207814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sixleaves之AC++杂谈录第2章 &lt;&lt;循环和计数&gt;&gt; </title><link>http://www.cppblog.com/sixleaves/archive/2014/02/21/205872.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Fri, 21 Feb 2014 08:21:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2014/02/21/205872.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/205872.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2014/02/21/205872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/205872.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/205872.html</trackback:ping><description><![CDATA[回顾第1章，第一章我们认识到了变量的定义，定义ing时赋值，操作符重载（Overloaded），和没有深入探讨的构造函数，成员函数的概念、符号直接量（与字符直接量的区别），还有输入输出缓冲模型之其好处（三个事件才会刷新缓冲区，输出到设备上，分别是，缓冲区已经满，遇到cin，显示要求刷新（如std::endl，控制符（manipulator）））。<br />这章我写得有点急切，应为之前C++学过，有些概念一跳而过，看不懂的，可以往下找红色字体处开始（从循环不变式分析处开始的分析，再回头来看这个）。<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">ask&nbsp;for&nbsp;the&nbsp;person's&nbsp;name</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Please&nbsp;enter&nbsp;your&nbsp;first&nbsp;name:&nbsp;";<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">read&nbsp;the&nbsp;name</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;name;<br />
<span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cin&nbsp;&gt;&gt;&nbsp;name;<br />
<span style="color: #008080; ">11</span>&nbsp;<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">build&nbsp;the&nbsp;message&nbsp;that&nbsp;we&nbsp;intend&nbsp;to&nbsp;write</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std:;<span style="color: #0000FF; ">string</span>&nbsp;greeting&nbsp;=&nbsp;"Hello,&nbsp;"&nbsp;+&nbsp;name&nbsp;+&nbsp;"!";<br />
<span style="color: #008080; ">14</span>&nbsp;<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">we&nbsp;have&nbsp;to&nbsp;rewrite&nbsp;this&nbsp;part</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span>}</div>
#<br />
#分析：我们现在需要重写（重构//we have...后面的代码），应该这样思考，以前的那个程序不具备好的可扩展性，为什么呢？首先如果要求输入的框架编程10行（空白#行变成10行），后面的代码久要多加很多行，一行行的进行输出。这时我们可以用循环对代码进行重构。我们先分析，在greeting上下空白行只有一行，所以我们用pad<br />
#表示空白行，而总的行数为2 * pad + 3（头尾加greeting那行）。这样我们就可以让程序输出任意多行。于是有如下代码<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;pad&nbsp;=&nbsp;1;<br />
<br />
<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;rows&nbsp;=&nbsp;pad&nbsp;*&nbsp;2&nbsp;+&nbsp;3;</div>
#另外我们这个输出的框架是要让左右两边的空白数和上下两端的空白数相同，所以也只需要定义一个变量就够了。每一行输出的字符数就是greeting的长度加上pad * 2加上两个#两个星号。即如下代码const std::string::size_type cols = greeting.size() + pad * 2 + 2;<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;std::cin;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;std::endl;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;std::cout; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;std::<span style="color: #0000FF; ">string</span>;<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"Please&nbsp;enter&nbsp;your&nbsp;first&nbsp;name:&nbsp;";<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;name;<br />
<span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;name;<br />
<span style="color: #008080; ">11</span>&nbsp;<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;greeting&nbsp;=&nbsp;"Hello,&nbsp;"&nbsp;+&nbsp;name&nbsp;+&nbsp;"!";<br />
<span style="color: #008080; ">13</span>&nbsp;<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;pad&nbsp;=&nbsp;1;<br />
<span style="color: #008080; ">15</span>&nbsp;<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;rows&nbsp;=&nbsp;pad&nbsp;*&nbsp;2&nbsp;+&nbsp;3;<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">string</span>::size_type&nbsp;cols&nbsp;=&nbsp;greeting.size()&nbsp;+&nbsp;pad&nbsp;*&nbsp;2&nbsp;+&nbsp;2;<br />
<span style="color: #008080; ">18</span>&nbsp;<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;endl;<br />
<span style="color: #008080; ">20</span>&nbsp;<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;invariant:we&nbsp;have&nbsp;written&nbsp;r&nbsp;rows&nbsp;so&nbsp;far</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;r&nbsp;=&nbsp;0;&nbsp;r&nbsp;!=&nbsp;rows;&nbsp;++r)&nbsp;{<br />
<span style="color: #008080; ">23</span>&nbsp;<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>::size_type&nbsp;c&nbsp;=&nbsp;0;<br />
<span style="color: #008080; ">25</span>&nbsp;<br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;invariant:we&nbsp;have&nbsp;written&nbsp;c&nbsp;characters&nbsp;so&nbsp;far&nbsp;in&nbsp;the&nbsp;current&nbsp;row</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(c&nbsp;!=&nbsp;cols)&nbsp;{<br />
<span style="color: #008080; ">28</span>&nbsp;<br />
<span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(r&nbsp;==&nbsp;pad&nbsp;+&nbsp;1&nbsp;&amp;&amp;&nbsp;c&nbsp;==&nbsp;pad&nbsp;+&nbsp;1)&nbsp;{<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;greeting;<br />
<span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;+=&nbsp;greeting.size();<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
<span style="color: #008080; ">33</span>&nbsp;<br />
<span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(r&nbsp;==&nbsp;0&nbsp;||&nbsp;r&nbsp;==&nbsp;rows&nbsp;-1&nbsp;||&nbsp;c&nbsp;==&nbsp;0&nbsp;||&nbsp;c&nbsp;==&nbsp;cols&nbsp;-&nbsp;1)<br />
<span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"*";<br />
<span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"&nbsp;";<br />
<span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++c;<br />
<span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">41</span>&nbsp;<br />
<span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;endl;<br />
<span style="color: #008080; ">43</span>&nbsp;<br />
<span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
<span style="color: #008080; ">46</span>&nbsp;}</div>
#第一个：：说明string名字定义在名字空间std中，而第二个：：则表示size_type来自string类。std::string定义了size_type，用来表示一个string中含有的字#符数目。如果需要一个局部变量来表示一个string长度，可以使用std::string::size_type类型定义一个变量。<br />
#size_type是一个无符号的类型<br />
#输出边界字符，如果r = 0，由循环不变式可以知道，现在一行也没有输出。所以当r = row - 1，已经输出了row - 1行，接下来输出的是最后一个部分，类似的，如果c = 0，输出的将是第一列的部分。<br />
#输出边界符号：<br />
#那么我们如何判断输出greeting这行呢，由循环不变式，我们可以 r = pad + 1 时，c = pad + 1时，开始输出greeting。<br />
<br /><span style="color: #ff0000;">#第二章写得有点乱，上面代码看不懂的，请看下面分析</span><br />
#首先我们要介绍一个概念，叫做循环不变式，循环不变式就是我们设置一个断言，让该断言在该循环中始终都成立，结束后也成立，这样这个断言其实就是这段程序的意思。看如<br />
#下代码：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">invariant:we&nbsp;have&nbsp;written&nbsp;r&nbsp;rows&nbsp;so&nbsp;far</span><span style="color: #008000; "><br />
</span><br />
<span style="color: #0000FF; ">int</span>&nbsp;r&nbsp;=&nbsp;0;<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">setting&nbsp;r&nbsp;to&nbsp;0&nbsp;makes&nbsp;the&nbsp;invariant&nbsp;true</span><span style="color: #008000; "><br />
</span><br />
<span style="color: #0000FF; ">while</span>(r&nbsp;!=&nbsp;rows)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">we&nbsp;can&nbsp;assume&nbsp;that&nbsp;the&nbsp;invariant&nbsp;is&nbsp;true&nbsp;here<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">waiting&nbsp;a&nbsp;row&nbsp;of&nbsp;output&nbsp;makes&nbsp;the&nbsp;invariant&nbsp;false</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">incrementing&nbsp;r&nbsp;makes&nbsp;the&nbsp;invariant&nbsp;true&nbsp;again</span><span style="color: #008000; "><br />
</span>&nbsp; &nbsp; r++;<br />
}<br />
<span style="color: #008000; ">//</span><span style="color: #008000;">we&nbsp;can&nbsp;conclude&nbsp;that&nbsp;the&nbsp;invariant&nbsp;is&nbsp;true&nbsp;here</span></div>
#首先你应该想一想要确保不变式始终为true，只要确保在循环进入点为true，一次循环结束点为true，那么这个不变式久永远为true，understand？如果还不理解，先吧我说<br />&nbsp;#的这句话理解了，在继续往下看，不然你不知道我在讲什么东西!<br />&nbsp;#我们的不变式就是上述断言<span style="color: #008000; font-size: 13px; background-color: #eeeeee;">invariant:we&nbsp;have&nbsp;written&nbsp;r&nbsp;rows&nbsp;so&nbsp;far</span>&nbsp;<br />&nbsp;#我们分析过，不变式的两个断点，一个设在开头，一个在结尾，所以开头时r = 0。此时程序一行也没输出，不变式为true，在结尾处r++后，仍为true，为什么呢？举个例子，r = 0，进来之后，将输出一行，所以此时r不应该在为0，而应该为1.<br />&nbsp;#这是每一行输出的框架，转换成for循环就是上面相应的代码，而至于另外一个循环一样个道理。<br />#下面再介绍一个重要的概念，这个概念我之前还真没学好，看完后，恍然大悟，大测大悟阿！那就是循环时的计数问题。<br />&nbsp;#在C中C++中我们写循环经常是重int i = 0，从0开始是不？就算是，你是不是经常这样写for(int i = 0; i &lt;= number; i++);但是更好的写法应该是for(int i = 0; i &nbsp;#!= number; i++);为什么呢？请听我慢慢道来.<br />&nbsp;#首先我们知道在不对称区间[0, rows)计数的话，很明显就是rows个数，但是如果你使用的是对称区间，[num,rows]则有rows - num + 1个数，是不是很不明显，再则从0开 &nbsp;#始一目了然，别说你看不出来，我在举个例子（0，66],和[21,86]哪一个你能快速判断出有几个数。<br />&nbsp;#有的人又说，这算什么阿，我从1开始贝[1,66]，不就多算一个数么，习惯就好。我想说，你说的没粗，但我懒，用不对称区间跟块算出，更不会出错。在则，用不对称区间的好 &nbsp;#处是容易和invariant（循环不变式）相结合，例如，如果你从1开始计数，有的人想我们把不变式改成现在输出第r行，但是这样是不能作为一个不变式的，所谓不变式，就是<br />&nbsp;#这个断言永远正确，但是当你结束循环时r = rows + 1，就变成了输出第rows + 1行，但这个不变式就变成错的鸟，understand。<br />&nbsp;#再则我们选者！=而不是&lt;=来作为比较操作符。这个差别很小，但是很不一样，前者，循环结束时（只要没有在循环里break），就能判断此时r = rows，但是如果是后者，我 &nbsp;#们这能证明至少输出了rows行，为啥？回忆下学过的math，&lt;=,是什么意思？<br />&nbsp;#还有一条好处，我就不罗嗦了，综上所属，你可以发现从0开始计数的好处！，想当一时，在写链表时，就是因为这个计数问题，自己也整了个证明方法，哈哈，每想到早就有更 &nbsp;#简单的方式了。<br />#本人才疏学浅，看不懂的，可以留言讨论之。<img src ="http://www.cppblog.com/sixleaves/aggbug/205872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2014-02-21 16:21 <a href="http://www.cppblog.com/sixleaves/archive/2014/02/21/205872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sixleaves之AC++杂谈录第1章 &lt;&lt;使用字符串&gt;&gt;</title><link>http://www.cppblog.com/sixleaves/archive/2014/02/20/205856.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Thu, 20 Feb 2014 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2014/02/20/205856.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/205856.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2014/02/20/205856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/205856.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/205856.html</trackback:ping><description><![CDATA[回顾:在第0章中我总结了重要的知识点有：字符串直接量、表达式的结构，操作数和操作符的定义，还有表达式的副作用、和std::cout结合&lt;&lt;操作符返回std::ostream类型，等知识点。<br />
代码如下<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;ask&nbsp;for&nbsp;person's&nbsp;name,&nbsp;and&nbsp;greet&nbsp;the&nbsp;person</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;&lt;iostream&gt;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">ask&nbsp;for&nbsp;the&nbsp;person's&nbsp;name</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Please&nbsp;enter&nbsp;your&nbsp;first&nbsp;name:&nbsp;";<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;<br />
<span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">read&nbsp;the&nbsp;name</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;name;<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cin&nbsp;&gt;&gt;&nbsp;name;<br />
<span style="color: #008080; ">13</span>&nbsp;<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">write&nbsp;a&nbsp;greeting</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Hello,&nbsp;"&nbsp;&lt;&lt;&nbsp;name&nbsp;&lt;&lt;&nbsp;"!"&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
<span style="color: #008080; ">17</span>&nbsp;}</div>
#name就是一个变量（它的类型是std::string），而变量是一个有名字的对象（变量一定是对象，但对象不一定为变量，因为对象可以没有名字，而且对象对应系统中的一块内存）。<br />
#line 11：是一个definition，即是一个定义，定义了一个名叫做name的std::string类型的变量。而且出现在一个函数提中，所以是一个local variable，当程序执行放到}，就会销毁name变量，并且释放name占用的内存，以让其他变量使用。<br />
#line 12：&gt;&gt;从标准输入中读取一个字符串，并且保存它在name对象中。当通过标准库读取一个字符串时，他会忽略输入中的所有空白符，而吧其他字符读取到name中，直到它遇到其他空白符或者文件结束标志。因此std::cin &gt;&gt; name;的结果是从标准输入中读取一个单词。<br />
#输入输出库会把它的输出保存在buffer的内部数据结构上，通过缓存可以优化输出操作。（因为许多操作系统在向输出设备写入字符时需要花大量的时间）<br />
#有三个事件会促使系统刷新缓冲区。<br />
&nbsp;#第一，缓存区满了，自动刷新。<br />
&nbsp;#第二，标准库被要求读取标准输入流。（即std::cin是std::istream类型）。如line 12.<br />
&nbsp;#第三，显示的要求刷新缓冲。（std::endl结束了输出行，并且刷新缓冲区)<br />
#<span style="font-size: 13px; color: #008080;">&nbsp;1</span><span style="background-color: #eeeeee; font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #008000;">//</span><span style="font-size: 13px; color: #008000;">ask&nbsp;for&nbsp;a&nbsp;person's&nbsp;name,&nbsp;and&nbsp;generate&nbsp;a&nbsp;framed&nbsp;greeting</span>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span>#include&nbsp;&lt;iostream&gt;<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Please&nbsp;enter&nbsp;your&nbsp;first&nbsp;name:&nbsp;";<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;name;<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cin&nbsp;&gt;&gt;&nbsp;name;<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">build&nbsp;the&nbsp;message&nbsp;that&nbsp;we&nbsp;intend&nbsp;to&nbsp;write</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;greeting&nbsp;=&nbsp;"Hello,&nbsp;"&nbsp;+&nbsp;name&nbsp;+&nbsp;"!";<br />
<span style="color: #008080; ">11</span>&nbsp;<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">build&nbsp;the&nbsp;second&nbsp;and&nbsp;fourth&nbsp;lines&nbsp;of&nbsp;the&nbsp;input</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;spaces(greeting.size(),&nbsp;'&nbsp;');<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;second&nbsp;=&nbsp;"*&nbsp;"&nbsp;+&nbsp;spaces&nbsp;+&nbsp;"&nbsp;*";<br />
<span style="color: #008080; ">15</span>&nbsp;<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">build&nbsp;the&nbsp;first&nbsp;and&nbsp;fifth&nbsp;lines&nbsp;of&nbsp;the&nbsp;output</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;first(second.size(),&nbsp;'*');<br />
<span style="color: #008080; ">18</span>&nbsp;<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">write&nbsp;it&nbsp;all</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;first&nbsp;&lt;&lt;std::endl;<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;second&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"*&nbsp;"&nbsp;&lt;&lt;&nbsp;greeting&nbsp;&lt;&lt;&nbsp;"&nbsp;*"&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;second&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;first&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<span style="color: #008080; ">26</span>&nbsp;<br />
<span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
<span style="color: #008080; ">28</span>&nbsp;}</div><div>#greeting的定义包含三个新的概念</div><div>&nbsp; #第一个：在定义变量时候，可以给定它的值。</div><div>&nbsp; #第二个：用+来连接字符串，但是这两个中必须至少有一个是string对象。（+也是左结合性的）</div><div>&nbsp; &nbsp;#（+在这里是连接作用),引出overloaded（重载）概念，这个操作符被重载了，因为其对不同操作数有不同的含义。</div><div>&nbsp; #第三个：const可以作为变量定义的一部分，这么做保证在变量生存期内，不改变它的值。</div><div>&nbsp; &nbsp;#如果一个变量定义为const，必须在定义时初始化，否则后面就不能再初始化。</div><div>#const std::string spaces(greeting.size(), ' ');来介绍另三个概念</div><div>&nbsp; #第一个：构造函数</div><div>&nbsp; #第二个：成员函数(member function),其实可以吧greeting看成对象，向其发送size消息获取其长度。</div><div>&nbsp; #第三个：字符直接量。（用'（单引号），而字符串直接量则是用&#8220;号）.字符直接量的类型是内置于语言核心的char类型。</div><img src ="http://www.cppblog.com/sixleaves/aggbug/205856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2014-02-20 20:38 <a href="http://www.cppblog.com/sixleaves/archive/2014/02/20/205856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sixleaves之AC++杂谈录第0章</title><link>http://www.cppblog.com/sixleaves/archive/2014/02/19/205855.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Wed, 19 Feb 2014 14:10:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2014/02/19/205855.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/205855.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2014/02/19/205855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/205855.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/205855.html</trackback:ping><description><![CDATA[@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
前言：<br />
选择自己心中最新欢的事情去做，毕竟之前计算机基础课程基础也打得不错，深入的学习C++。我一直相信母亲说过的一句话：&#8220;不要认为你做不到，只要你想去做，就一定能做得到&#8221;。自我勉励之。同时开博是为了总结自己学习，希望能对有些人有所帮助。<br />
<br />
由very simple的小程序包含的许多C++基础知识。<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">a&nbsp;small&nbsp;C++&nbsp;program</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #008000; "></span>#include&nbsp;&lt;iostream&gt;<br />
<span style="color: #008080; ">3</span>&nbsp;<br />
<span style="color: #008080; ">4</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()<br />
<span style="color: #008080; ">5</span>&nbsp;{<br />
<span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Hello,&nbsp;world!"&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<span style="color: #008080; ">7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
<span style="color: #008080; ">8</span>&nbsp;}</div>
#程序的第一行为注释，//是行注释。
<br />
#std是一个命名空间（名字空间）namespace
<br />
#对于return语句，return 0表示程序正常退出。&nbsp;<br />
#对于return语句，如果是函数的定义要求返回某种特殊类型的值，那么这个函数中所有的return语句都必须返回相应类型的值。<br />
#剖析&#8220;Hello world！程序的总结&#8221;如下<br />
&nbsp; &nbsp;#该程序中有两个贯穿C++的概念，表达式和生存空间（scope）<br />
&nbsp; &nbsp; #表达式<br />
&nbsp; &nbsp; &nbsp;#表达式的作用是请求系统进行计算。计算后会生成一个结果，同时也可能会有一些副作用。（所谓的副作用就是它会影响程序或者系统的状态）。行6也是个表达式<br />
&nbsp; &nbsp; &nbsp;，它的副作用是在标准输出流输出&#8220;Hello， world！&#8221;并且当行结束。<br />
&nbsp; &nbsp; &nbsp;#表达式由操作符和操作数（operand）构成。如行6，两个&lt;&lt;符号都是操作符，而剩下的std::cout、&#8220;Hello world&#8221;、std::endl则是操作数。<br />
&nbsp; &nbsp; &nbsp; #操作数：每个操作数都是一种类型。（即都表示一种数据结构和它适合的操作，它决定了操作符的脾气（产生的结果），总而言之只要记住操作数决定了操作符的 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 脾气。）（int表示整数类型，std::ostream定义为流输出，std::cout的类型是std::ostream）<br />
&nbsp; &nbsp; &nbsp; #操作符：&lt;&lt;操作符有左结合性（left-assocoative）左结合性是一种贪心思想，当表达式出现两个以上的&lt;&lt;，左结合性总是贪心左边的操作数。<br />
&nbsp; &nbsp; &nbsp; #分析：第一个&lt;&lt;是以std::cout作为它的左操作数，而以"Hello， world"作为右操作数。<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 第二个&lt;&lt;的左操作数是一个（生成std::cout结果）的表达式，其类型是std::ostream.右操作数是std::endl,是一个mainpulator（控制符）。当&lt;&lt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 左操作符是std::ostream,而右操作数是mainpulator时，&lt;&lt;会根mainpulator的语义来控制流输出，并且返回流作为它的结果。如：当mainpulator是<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std::endl时，它结束当前输出行。<br />
&nbsp; &nbsp; #scope<br />
&nbsp; &nbsp; &nbsp;#namespace:命名空间机制，相当于java中的包机制。<br />
&nbsp; &nbsp; &nbsp;#scope,中文称为生存空间，：：是生存空间操作符，::左边是生存空间的表示符std，而右边就是定义在命名空间中的名字。<br />
#&#8220;Hello，world&#8221;称为字符串直接量，字符串直接量中，一些字符前面加上(\)后具有特殊的意义。<img src ="http://www.cppblog.com/sixleaves/aggbug/205855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2014-02-19 22:10 <a href="http://www.cppblog.com/sixleaves/archive/2014/02/19/205855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>