﻿<?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/cxiaojia/category/18156.html</link><description>厚德 博学 求真 至善
The bright moon and breeze</description><language>zh-cn</language><lastBuildDate>Tue, 06 Aug 2013 12:10:34 GMT</lastBuildDate><pubDate>Tue, 06 Aug 2013 12:10:34 GMT</pubDate><ttl>60</ttl><item><title>cocos2dx加快游戏速度</title><link>http://www.cppblog.com/cxiaojia/archive/2013/08/06/202374.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Tue, 06 Aug 2013 11:36:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2013/08/06/202374.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/202374.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2013/08/06/202374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/202374.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/202374.html</trackback:ping><description><![CDATA[游戏的速度可以由导演来控制。<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; line-height: 19px; background-color: #f5f5f5;"><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: #0000FF; ">float</span>&nbsp;multi&nbsp;=&nbsp;1.0f;<br />CCDirector::sharedDirector()-&gt;getScheduler()－&gt;setTimeScale(multi);</div>参数multi是倍率的意思，默认是1,倍率越高速度越快。<br /><br />如果需要提升一倍的速度，可以把multi设为2.0f。<br /><br />通过这样一个机制可以实现游戏内战斗倍数加速的功能。<img src ="http://www.cppblog.com/cxiaojia/aggbug/202374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2013-08-06 19:36 <a href="http://www.cppblog.com/cxiaojia/archive/2013/08/06/202374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#pragma once 与 #ifndef 解析(转)</title><link>http://www.cppblog.com/cxiaojia/archive/2013/03/18/198526.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Mon, 18 Mar 2013 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2013/03/18/198526.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/198526.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2013/03/18/198526.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/198526.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/198526.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">转自：</span><a href="http://blog.csdn.net/slimfox/article/details/1565950">http://blog.csdn.net/slimfox/article/details/1565950</a><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;<br /><br />为了避免同一个文件被include多次，C/C++中有两种方式，一种是#ifndef方式，一种是#pragma once方式。在能够支持这两种方式的编译器上，二者并没有太大的区别，但是两者仍然还是有一些细微的区别。</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 方式一：</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; display: block; background-color: #e0e0ff; border: 1px solid #b0b0f0;"><span style="margin: 0px; padding: 0px; font-family: 'courier new', courier;">&nbsp;&nbsp;&nbsp; #ifndef __SOMEFILE_H__<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; #define __SOMEFILE_H__<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; ... ... // 一些声明语句<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; #endif</span></span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 方式二：</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; display: block; background-color: #e0e0ff; border: 1px solid #b0b0f0;"><span style="margin: 0px; padding: 0px; font-family: 'courier new', courier;">&nbsp;&nbsp;&nbsp; #pragma once<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; ... ... // 一些声明语句</span></span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; #ifndef的方式依赖于宏名字不能冲突，这不光可以保证同一个文件不会被包含多次，也能保证内容完全相同的两个文件不会被不小心同时包含。当然，缺点就是如果不同头文件的宏名不小心&#8220;撞车&#8221;，可能就会导致头文件明明存在，编译器却硬说找不到声明的状况&#8212;&#8212;这种情况有时非常让人抓狂。</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; #pragma once则由编译器提供保证：同一个文件不会被包含多次。注意这里所说的&#8220;同一个文件&#8221;是指物理上的一个文件，而不是指内容相同的两个文件。带来的好处是，你不必再费劲想个宏名了，当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝，本方法不能保证他们不被重复包含。当然，相比宏名碰撞引发的&#8220;找不到声明&#8221;的问题，重复包含更容易被发现并修正。</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; #pragma once方式产生于#ifndef之后，因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受语言天生的支持，不受编译器的任何限制；而#pragma once方式却不受一些较老版本的编译器支持，换言之，它的兼容性不够好。也许，再过几年等旧的编译器死绝了，这就不是什么问题了。</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 我还看到一种用法是把两者放在一起的：</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; display: block; background-color: #e0e0ff; border: 1px solid #b0b0f0;"><span style="margin: 0px; padding: 0px; font-family: 'courier new', courier;">&nbsp;&nbsp;&nbsp; #pragma once<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; #ifndef __SOMEFILE_H__<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; #define __SOMEFILE_H__<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; ... ... // 一些声明语句<br style="margin: 0px; padding: 0px;" />&nbsp;&nbsp;&nbsp; #endif</span></span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 看起来似乎是想兼有两者的优点。不过只要使用了#ifndef就会有宏名冲突的危险，所以混用两种方法似乎不能带来更多的好处，倒是会让一些不熟悉的人感到困惑。</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 选择哪种方式，应该在了解两种方式的情况下，视具体情况而定。事实上，只要有一个合理的约定来避开缺点，我认为哪种方式都是可以接受的。而这个已经不是标准或者编译器的责任了，应当由程序员来搞定。</span><br style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; btw：我看到GNU的一些讨论似乎是打算在GCC 3.4（及其以后？）的版本取消对#pragma once的支持。不过我手上GCC 3.4.2和GCC 4.1.1仍然支持#pragma once，甚至没有deprecation warning。VC6及其以后版本亦提供对#pragma once方式的支持。看来这一特性已经稳定下来了。&nbsp;</span><img src ="http://www.cppblog.com/cxiaojia/aggbug/198526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2013-03-18 10:28 <a href="http://www.cppblog.com/cxiaojia/archive/2013/03/18/198526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++任意类型转换模板</title><link>http://www.cppblog.com/cxiaojia/archive/2012/04/12/171091.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Thu, 12 Apr 2012 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/04/12/171091.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/171091.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/04/12/171091.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/171091.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/171091.html</trackback:ping><description><![CDATA[<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 />-->#include&lt;iostream&gt;<br />#include&lt;sstream&gt;<br />#include&lt;<span style="color: #0000FF; ">string</span>&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><br />template&lt;<span style="color: #0000FF; ">class</span>&nbsp;out_type,<span style="color: #0000FF; ">class</span>&nbsp;in_value&gt;<br />out_type&nbsp;convert(<span style="color: #0000FF; ">const</span>&nbsp;in_value&nbsp;&amp;&nbsp;t)<br />{<br />stringstream&nbsp;stream;<br />stream&lt;&lt;t;<span style="color: #008000; ">//</span><span style="color: #008000; ">向流中传值</span><span style="color: #008000; "><br /></span>out_type&nbsp;result;<span style="color: #008000; ">//</span><span style="color: #008000; ">这里存储转换结果</span><span style="color: #008000; "><br /></span>stream&gt;&gt;result;<span style="color: #008000; ">//</span><span style="color: #008000; ">向result中写入值</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">return</span>&nbsp;result;<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;s;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(cin&gt;&gt;s)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;valdou=convert&lt;<span style="color: #0000FF; ">double</span>&gt;(s);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;valint=convert&lt;<span style="color: #0000FF; ">int</span>&gt;(s);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;valdou&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;valint&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/cxiaojia/aggbug/171091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-04-12 15:13 <a href="http://www.cppblog.com/cxiaojia/archive/2012/04/12/171091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现的memcpy()代码</title><link>http://www.cppblog.com/cxiaojia/archive/2012/03/13/167815.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Tue, 13 Mar 2012 13:04:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/03/13/167815.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/167815.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/03/13/167815.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/167815.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/167815.html</trackback:ping><description><![CDATA[<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: #008000; ">//</span><span style="color: #008000; ">函数名：mymemcpy<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">功能：内存复制<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">函数说明：将memFrom指向的空间内容复制给memTo指向的空间内容，大小为size</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>*&nbsp;mymemcpy(<span style="color: #0000FF; ">void</span>*&nbsp;memTo,<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;memFrom,size_t&nbsp;size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(memTo!=NULL);<span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否为空</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;assert(memFrom!=NULL);<span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否为空</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*tempFrom=(<span style="color: #0000FF; ">char</span>*)memFrom;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*tempTo=(<span style="color: #0000FF; ">char</span>*)memTo;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(size--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*tempTo++=*tempFrom++;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">复制</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;memTo;<br />}</div><img src ="http://www.cppblog.com/cxiaojia/aggbug/167815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-03-13 21:04 <a href="http://www.cppblog.com/cxiaojia/archive/2012/03/13/167815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记--空类，虚函数类，虚继承类的空间大小</title><link>http://www.cppblog.com/cxiaojia/archive/2012/03/12/167699.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Mon, 12 Mar 2012 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/03/12/167699.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/167699.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/03/12/167699.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/167699.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/167699.html</trackback:ping><description><![CDATA[<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: #008000; ">//</span><span style="color: #008000; ">此代码在32位win下运行成功</span><span style="color: #008000; "><br /></span>#include&lt;iostream&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">class</span>&nbsp;A<span style="color: #008000; ">//</span><span style="color: #008000; ">A是空类，编译器会用一个char类型标记这个类，大小为1</span><span style="color: #008000; "><br /></span>{<br /><br />};<br /><span style="color: #0000FF; ">class</span>&nbsp;B:<span style="color: #0000FF; ">public</span>&nbsp;A<span style="color: #008000; ">//</span><span style="color: #008000; ">B继承了A，但同样也是空类，大小为1</span><span style="color: #008000; "><br /></span>{<br /><br />};<br /><span style="color: #0000FF; ">class</span>&nbsp;C:<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;A<span style="color: #008000; ">//</span><span style="color: #008000; ">虚拟继承的时候编译器会安插一个指向父类的指针，大小为4</span><span style="color: #008000; "><br /></span>{<br /><br />};<br /><span style="color: #0000FF; ">class</span>&nbsp;D<span style="color: #008000; ">//</span><span style="color: #008000; ">大小为4</span><span style="color: #008000; "><br /></span>{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b;<span style="color: #008000; ">//</span><span style="color: #008000; ">静态变量被放在静态存储区</span><span style="color: #008000; "><br /></span>};<br /><span style="color: #0000FF; ">class</span>&nbsp;E&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">print函数不占内存空间，大小为4</span><span style="color: #008000; "><br /></span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print(){cout&lt;&lt;"E"&lt;&lt;endl;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a;<br />};<br /><span style="color: #0000FF; ">class</span>&nbsp;F<span style="color: #008000; ">//</span><span style="color: #008000; ">虚函数会占用一个指针大小的内存，系统需要用这个指针维护虚函数表。大小为8</span><span style="color: #008000; "><br /></span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print(){cout&lt;&lt;"F"&lt;&lt;endl;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a;<br />};<br /><span style="color: #0000FF; ">class</span>&nbsp;G:<span style="color: #0000FF; ">public</span>&nbsp;F<span style="color: #008000; ">//</span><span style="color: #008000; ">多了一个虚函数内存大小不变，可见一个类只有一个虚函数指针。大小为8</span><span style="color: #008000; "><br /></span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print(){cout&lt;&lt;"G"&lt;&lt;endl;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print2(){cout&lt;&lt;"G2"&lt;&lt;endl;}<br />};<br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;D&nbsp;d;<br />&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;F&nbsp;f;<br />&nbsp;&nbsp;&nbsp;&nbsp;G&nbsp;g;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(A)&lt;&lt;"&nbsp;"&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(a)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">1&nbsp;1</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(B)&lt;&lt;"&nbsp;"&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(b)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">1&nbsp;1</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(C)&lt;&lt;"&nbsp;"&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(c)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">4&nbsp;4</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(D)&lt;&lt;"&nbsp;"&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(d)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">4&nbsp;4</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(E)&lt;&lt;"&nbsp;"&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(e)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">4&nbsp;4</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(F)&lt;&lt;"&nbsp;"&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(f)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;8&nbsp;8</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(G)&lt;&lt;"&nbsp;"&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(g)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">8&nbsp;8</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/cxiaojia/aggbug/167699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-03-12 10:18 <a href="http://www.cppblog.com/cxiaojia/archive/2012/03/12/167699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记--const的作用</title><link>http://www.cppblog.com/cxiaojia/archive/2012/03/12/167695.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Mon, 12 Mar 2012 01:35:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/03/12/167695.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/167695.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/03/12/167695.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/167695.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/167695.html</trackback:ping><description><![CDATA[<div><p>C++<span style="font-family:宋体;">中的</span>const<span style="font-family:宋体;">关键字和</span>#define<span style="font-family:宋体;">有些相似，</span>#define<span style="font-family:宋体;">只是用来做文本替换的，会出现一些错误并且不容易检查到。在</span>C++<span style="font-family:宋体;">代码中尽量使用</span>const<span style="font-family:宋体;">而不是</span>#define<span style="font-family:宋体;">。</span></p>  <p>&nbsp;</p>  <p>const<span style="font-family:宋体;">的作用：</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">1、&nbsp;const<span style="font-family:宋体;">用于定义常量：</span>const<span style="font-family:宋体;">定义的常量编译器可以对其进行数据静态类型安全检查。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">2、&nbsp;const<span style="font-family:宋体;">修饰形参：当参数是用户自定义类型或者抽象数据类型时，用</span>const<span style="font-family:宋体;">引用传递而不是值传递可以提高效率。</span></p>  <p style="margin-left:18.0pt;text-indent:0cm;">Void fun1(A a);</p>  <p style="margin-left:18.0pt;text-indent:0cm;">Void fun2(A const &amp;a);</p>  <p style="margin-left:18.0pt;text-indent:0cm;"><span style="font-family:宋体;">第二个函数不需要产生临时对象，省去了对象构造析构消耗的时间</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">3、&nbsp;const<span style="font-family:宋体;">修饰函数返回值：如果函数返回一个</span>const<span style="font-family:宋体;">指针，则函数返回值只能被</span>const<span style="font-family:宋体;">同类型指针接收，否则</span>error<span style="font-family:宋体;">。</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">4、&nbsp;const<span style="font-family:宋体;">修饰成员函数：当你的成员函数不需要改变数据成员的值时，就加上</span>const<span style="font-family:宋体;">修饰。</span></p></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/167695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-03-12 09:35 <a href="http://www.cppblog.com/cxiaojia/archive/2012/03/12/167695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记--main函数结束后的调用</title><link>http://www.cppblog.com/cxiaojia/archive/2012/03/11/167667.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Sun, 11 Mar 2012 11:46:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/03/11/167667.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/167667.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/03/11/167667.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/167667.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/167667.html</trackback:ping><description><![CDATA[<div><p><span style="font-family:宋体;">本以为主函数</span>main<span style="font-family:宋体;">是首先被调用的函数，后来发现操作系统会调用一个启动函数，对</span>C++<span style="font-family:宋体;">运行库进行初始化。</span></p>  <p><span style="font-family:宋体;">本以为主函数</span>main<span style="font-family:宋体;">被返回之后操作系统将回收资源，却不知一个重要的函数</span>&#8212;atexit()<span style="font-family:宋体;">。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">程序退出的时候需要一些诸如释放资源的操作，但是程序的退出有很多种，可能是</span>main<span style="font-family:宋体;">函数结束范围一个值传递给</span>exit()<span style="font-family:宋体;">，也可能是一些其他的原因，所以需要一种与程序结束方式无关的方法来进行程序退出时必要的处理。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">函数原型：</span>int atexit(void(*)(void));</p>  <p><span style="font-family:宋体;">函数作用：注册一个函数，这个函数在程序结束的时候被调用<br /><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 />-->#include&lt;cstdlib&gt;<br />#include&lt;iostream&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;fun1()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"fun1"&lt;&lt;endl;<br />}<br /><span style="color: #0000FF; ">void</span>&nbsp;fun2()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"fun2"&lt;&lt;endl;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;atexit(fun1);<span style="color: #008000; ">//</span><span style="color: #008000; ">注册fun1，主函数终止时调用</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;atexit(fun2);<span style="color: #008000; ">//</span><span style="color: #008000; ">注册fun2，主函数终止时调用</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"mian&nbsp;exit"&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">运行结果：</span><span style="color: #008000; "><br /></span>main&nbsp;exit<br />fun2<br />fun1</div><span style="font-family: 宋体; "><br /><br /></span><div><p>从结果中可以发现fun1和fun2两个函数在主函数结束之后被调用，而且调用的顺序与注册的顺序相反。</p></div><span style="font-family: 宋体; "><br /></span></p></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/167667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-03-11 19:46 <a href="http://www.cppblog.com/cxiaojia/archive/2012/03/11/167667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3种交换变量值的方法</title><link>http://www.cppblog.com/cxiaojia/archive/2012/03/07/167347.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Wed, 07 Mar 2012 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/03/07/167347.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/167347.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/03/07/167347.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/167347.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/167347.html</trackback:ping><description><![CDATA[<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 />--><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">中间变量法</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;swap1(<span style="color: #0000FF; ">int</span>&amp;&nbsp;a,<span style="color: #0000FF; ">int</span>&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;temp=a;<br />&nbsp;&nbsp;&nbsp;&nbsp;a=b;<br />&nbsp;&nbsp;&nbsp;&nbsp;b=temp;<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">相互加减法</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;swap2(<span style="color: #0000FF; ">int</span>&amp;&nbsp;a,<span style="color: #0000FF; ">int</span>&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;a=a+b;<span style="color: #008000; ">//</span><span style="color: #008000; ">可能会溢出</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;b=a-b;<br />&nbsp;&nbsp;&nbsp;&nbsp;a=a-b;<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">异或法</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;swap3(<span style="color: #0000FF; ">int</span>&amp;&nbsp;a,<span style="color: #0000FF; ">int</span>&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;a^=b;<br />&nbsp;&nbsp;&nbsp;&nbsp;b^=a;<br />&nbsp;&nbsp;&nbsp;&nbsp;a^=b;<br />}</div><img src ="http://www.cppblog.com/cxiaojia/aggbug/167347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-03-07 22:03 <a href="http://www.cppblog.com/cxiaojia/archive/2012/03/07/167347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现的strcpy()和strlen()代码</title><link>http://www.cppblog.com/cxiaojia/archive/2012/02/25/166471.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Sat, 25 Feb 2012 02:00:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/02/25/166471.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/166471.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/02/25/166471.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/166471.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/166471.html</trackback:ping><description><![CDATA[<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: #008000; ">//</span><span style="color: #008000; ">函数名：mystrcpy<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">功能：字符串的复制<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">函数说明：从strSrc地址开始的字符串赋值给strDest，两者都不能为空</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">char</span>*&nbsp;mystrcpy(<span style="color: #0000FF; ">char</span>*&nbsp;strDest,<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;strSrc)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(strDest!=NULL);<span style="color: #008000; ">//</span><span style="color: #008000; ">断言，如果表达式为假则输出错误信息</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;assert(strSrc!=NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;p=strDest;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>((*strDest++=*strSrc++)!='\0');<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">函数名：mystrlen<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">功能：字符串的个数统计<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">函数说明：统计字符串中字符的长度，不包括'\0'，字符串不能为空</span><span style="color: #008000; "><br /></span>unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;mystrlen(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;str)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(str!=NULL);<br />&nbsp; &nbsp;unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;cnt=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(*str++!='\0')&nbsp;cnt++;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cnt;<br />}</div><img src ="http://www.cppblog.com/cxiaojia/aggbug/166471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-02-25 10:00 <a href="http://www.cppblog.com/cxiaojia/archive/2012/02/25/166471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现的atof()和atoi()代码</title><link>http://www.cppblog.com/cxiaojia/archive/2012/02/24/166436.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Fri, 24 Feb 2012 08:42:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/02/24/166436.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/166436.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/02/24/166436.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/166436.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/166436.html</trackback:ping><description><![CDATA[<div><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: #008000; ">//</span><span style="color: #008000; ">函数名：myatof<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">功能：把字符串转化成double浮点型<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">名字来源：my&nbsp;array&nbsp;to&nbsp;floating&nbsp;point&nbsp;numbers&nbsp;&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">函数说明：接收一个字符串判断第一个字符的符号，没有符号默认为正值，然后对剩余字符串进行转换，</span><span style="color: #008000; ">//</span><span style="color: #008000; ">遇到\0结束，最后返回一个double</span><span style="color: #008000; "><br /></span><br /><span style="color: #0000FF; ">double</span>&nbsp;myatof(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;sptr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;temp=10;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;ispnum=<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;ans=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(*sptr=='-')<span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否是负数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ispnum=<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>(*sptr=='+')<span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否为正数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(*sptr!='\0')<span style="color: #008000; ">//</span><span style="color: #008000; ">寻找小数点之前的数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(*sptr=='.'){&nbsp;sptr++;<span style="color: #0000FF; ">break</span>;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans=ans*10+(*sptr-'0');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(*sptr!='\0')<span style="color: #008000; ">//</span><span style="color: #008000; ">寻找小数点之后的数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans=ans+(*sptr-'0')/temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp*=10;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ispnum)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ans;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ans*(-1);<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">函数名：myatoi<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">功能：把字符串转化成int整型<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">名字来源：my&nbsp;array&nbsp;to&nbsp;integer&nbsp;&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">函数说明：接收一个字符串判断第一个字符的符号，没有符号默认为正值，然后对剩余字符串进行转换，</span><span style="color: #008000; ">//</span><span style="color: #008000; ">遇到\0结束，最后返回一个int</span><span style="color: #008000; "><br /></span><br /><span style="color: #0000FF; ">int</span>&nbsp;myatoi(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;sptr)<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;ispnum=<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(*sptr=='-')<span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否是负数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ispnum=<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>(*sptr=='+')<span style="color: #008000; ">//</span><span style="color: #008000; ">判断是否为正数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(*sptr!='\0')<span style="color: #008000; ">//</span><span style="color: #008000; ">类型转化</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans=ans*10+(*sptr-'0');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sptr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ispnum)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ans;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ans*(-1);<br />}</div></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/166436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-02-24 16:42 <a href="http://www.cppblog.com/cxiaojia/archive/2012/02/24/166436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记--extern关键字</title><link>http://www.cppblog.com/cxiaojia/archive/2012/02/23/166300.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Thu, 23 Feb 2012 00:04:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/02/23/166300.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/166300.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/02/23/166300.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/166300.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/166300.html</trackback:ping><description><![CDATA[<div><p>extern<span style="font-family:宋体;">关键字的作用</span></p>  <p style="margin-left:18.0pt;text-indent:-18.0pt;">1、&nbsp;<span style="font-family:宋体;">声明外部变量或者函数</span></p>  <p style="margin-left: 18pt; text-indent: 0cm; "><span style="font-family:宋体;">当你所需要的变量或者函数在另一个文件里边的时候，除了用</span>include<span style="font-family:宋体;">包含，还可以用</span>extern<span style="font-family:宋体;">声明外部变量或者函数。<br /><br /></span></p><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: #008000; ">//</span><span style="color: #008000; ">File1.cpp</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;a;<br /><span style="color: #0000FF; ">int</span>&nbsp;fun(<span style="color: #0000FF; ">int</span>&nbsp;w)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;++w;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">main.cpp</span><span style="color: #008000; "><br /></span>#include&lt;iostream&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a;<span style="color: #008000; ">//</span><span style="color: #008000; ">声明外部变量</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">extern</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fun(<span style="color: #0000FF; ">int</span>&nbsp;w);<span style="color: #008000; ">//</span><span style="color: #008000; ">声明外部函数</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;a&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;5</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;fun(a)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;6</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><div><p>这里要注意的一点是，extern关键字的作用仅仅是声明，没有分配内存空间，声明的格式和定义的格式一定要严格相符。</p></div><span style="font-family: 宋体; "><br /></span><div><p style="margin-left:18.0pt;text-indent:-18.0pt;">2、 extern &#8221;C&#8221; 链接指定为C函数库</p>  <p style="margin-left: 18pt; text-indent: 0cm; ">参数重载是C++的新特性，在C中是没有的。在使用C++写代码的时候，如果调用C函数出错（出错的原因见C++重载的实现机制），则需要声明extern &#8220;C&#8221;将链接指定为C函数库。</p></div>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 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 />--><br /><span style="color: #0000FF; ">extern</span>&nbsp;"C"&nbsp;<br />{<br />　　<span style="color: #008000; ">/*</span><span style="color: #008000; "><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000; ">*/</span><br />　　}</div><span style="font-family: 宋体; "><br /><br /></span><p>&nbsp;</p></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/166300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-02-23 08:04 <a href="http://www.cppblog.com/cxiaojia/archive/2012/02/23/166300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记--static变量与普通变量的区别</title><link>http://www.cppblog.com/cxiaojia/archive/2012/02/22/166228.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Wed, 22 Feb 2012 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/02/22/166228.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/166228.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/02/22/166228.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/166228.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/166228.html</trackback:ping><description><![CDATA[<div><p><strong><span style="font-family:宋体;">静态全局变量与普通全局变量</span></strong><span style="font-family:宋体;">：两者的存储方式相同，都存储在静态区，静态全局变量的作用域是定义该变量的源文件，普通全局变量的作用域则是多个源文件的源程序，静态全局变量只初始化一次。、</span></p>  <p>&nbsp;</p>  <p><strong><span style="font-family:宋体;">静态局部变量与普通局部变量</span></strong><span style="font-family:宋体;">：两者的作用域相同，存储方式不同，静态局部变量存储在静态区，普通局部变量存储在栈区。生存期也不同，静态局部变量的生存期为整个程序，普通局部变量的生存期仅为定义的那段空间。静态局部变量只初始化一次。</span></p>  <p>&nbsp;</p>  <p><strong><span style="font-family:宋体;">静态函数与普通函数</span></strong><span style="font-family:宋体;">：作用域不同，静态函数的作用域仅在被定义的源文件，普通函数在头文件的辅助下可以被外部访问。静态函数在内存中只有一份，而普通函数在内存中可以有一份或者多份拷贝。</span></p></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/166228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-02-22 13:10 <a href="http://www.cppblog.com/cxiaojia/archive/2012/02/22/166228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记--C++重载（参数多态）的实现机制</title><link>http://www.cppblog.com/cxiaojia/archive/2012/02/21/166171.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Tue, 21 Feb 2012 13:07:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2012/02/21/166171.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/166171.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2012/02/21/166171.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/166171.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/166171.html</trackback:ping><description><![CDATA[<div><p>C++<span style="font-family:宋体;">继承了</span>C<span style="font-family:宋体;">的全部特性，对</span>C<span style="font-family:宋体;">实现了全面兼容。</span>C++<span style="font-family:宋体;">又实现了一些新的特性，比如说函数的重载。</span></p>  <p><span style="font-family:宋体;">要实现函数的重载就要改变原有的在</span>C<span style="font-family:宋体;">中函数定义的机制，在</span>C<span style="font-family:宋体;">中定义函数</span>fun(int a,int b)<span style="font-family:宋体;">，编译器会把</span>_fun<span style="font-family:宋体;">写入符号库中，使用</span>fun()<span style="font-family:宋体;">时会在符号库中找到</span>_fun<span style="font-family:宋体;">，并调用。</span></p>  <p><span style="font-family:宋体;">在</span>C++<span style="font-family:宋体;">中，由于要实现重载，需要加上参数的特性，于是就变成了</span>_fun_int_int<span style="font-family:宋体;">，当函数为</span>fun(int a,double b)<span style="font-family:宋体;">时，编译器就会把</span>_fun_int_double<span style="font-family: 宋体; ">写入符号库，这样就实现了参数的多态。</span></p>  <p>&nbsp;</p></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/166171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2012-02-21 21:07 <a href="http://www.cppblog.com/cxiaojia/archive/2012/02/21/166171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组名是指针么？</title><link>http://www.cppblog.com/cxiaojia/archive/2011/12/23/shuzuming.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Fri, 23 Dec 2011 14:27:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2011/12/23/shuzuming.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/162695.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2011/12/23/shuzuming.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/162695.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/162695.html</trackback:ping><description><![CDATA[数组名是指针么？如果不是，数组名到底是怎样的一种结构？求解释。<br /><br />我叙述一下我所知道的数组名与指针的区别。<br /><br /><strong>1、地址相同，大小不同</strong><br />看下面代码：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 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; ">1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;arr[10];<br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;p=arr;<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;arr&lt;&lt;endl;<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;p&lt;&lt;endl;<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(arr)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">结果为40</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(p)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">结果为4</span></div><br />arr为数组名，p为指针。<br />第3、4行输出的值一样，也就是说arr和p都是数组的首地址。第5、6行的结果不一样，arr的大小是整个数组的大小，而p的大小是指针的大小。<br />为什么arr的大小会是40？<br /><br /><strong>2、都可以用指针作为形参</strong><br />指针的形参当然是指针。数组的形参可以是数组，也可以是指针。下面代码印证了数组的形参可以是指针。<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 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; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;fun(<span style="color: #0000FF; ">int</span>*&nbsp;p)<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;p[0]&lt;&lt;endl;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;}<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()<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; ">int</span>&nbsp;arr[10]={0};<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;p=arr;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fun(arr);<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">14</span>&nbsp;}</div><br />这点可以看出，数组名完全可以当成指针来用。<br /><br /><strong>3、指针可以自加，数组名不可以</strong><br /><br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 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; ">1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;arr[10]={0};<br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>*&nbsp;p=arr;<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr++;<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p++;</div><br />当数组名自加时程序编译就会出错，从这点应该可以看出，数组名是一个常量（const 修饰）。<br /><br /><br /><strong>4、作为参数的数组名的大小和指针的大小相同</strong><br /><br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 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; ">1</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;fun(<span style="color: #0000FF; ">int</span>&nbsp;arr[])<br /><span style="color: #008080; ">2</span>&nbsp;{<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;<span style="color: #0000FF; ">sizeof</span>(arr)&lt;&lt;endl;<span style="color: #008000; ">//</span><span style="color: #008000; ">结果为4</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;arr++;<span style="color: #008000; ">//</span><span style="color: #008000; ">编译成功</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #008000; "></span>}<br /><span style="color: #008080; ">6</span>&nbsp;</div><br />arr的大小变为4、arr++成功编译可以确定，作为参数的arr已经完全变成了一个指针。<br /><br />以上就是我所知道的指针与数组名的区别，如果还有别的区别请留言告诉我，如果谁知道数组名到底是一种什么样的结构，也请留言告知，谢谢哈。<br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/cxiaojia/aggbug/162695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2011-12-23 22:27 <a href="http://www.cppblog.com/cxiaojia/archive/2011/12/23/shuzuming.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++实现单例模式</title><link>http://www.cppblog.com/cxiaojia/archive/2011/12/21/danli.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Wed, 21 Dec 2011 06:41:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2011/12/21/danli.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/162531.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2011/12/21/danli.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/162531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/162531.html</trackback:ping><description><![CDATA[<div><div style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><strong>单例模式：Singleton</strong>&nbsp;</div><div style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的&#8220;单一实例&#8221;的需求时才可使用。<br /><br />我实现了一个简单的单例类，欢迎吐槽。<br /><div style="background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; 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: #000000; ">#include</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: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Singleton<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Singleton&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;GetInstance()</span><span style="color: #008000; ">//</span><span style="color: #008000; ">通过静态公有函数获得该类的实例对象</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_pInstance</span><span style="color: #000000; ">==</span><span style="color: #000000; ">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pInstance</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Singleton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;m_pInstance;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton(){}</span><span style="color: #008000; ">//</span><span style="color: #008000; ">构造函数私有化的目的是为了防止从别处实例化该类对象</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Singleton&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;m_pInstance;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Garbo</span><span style="color: #008000; ">//</span><span style="color: #008000; ">删除Singleton实例的对象</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">Garbo()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(Singleton::m_pInstance)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;Singleton::m_pInstance;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Garbo&nbsp;gb;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">在程序结束时，系统会调用它的析构函数</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">};<br />Singleton&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Singleton::m_pInstance</span><span style="color: #000000; ">=</span><span style="color: #000000; ">NULL;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">初始化静态数据成员<br /></span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Singleton&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">sl</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Singleton::GetInstance();<br />&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></div></div></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/162531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2011-12-21 14:41 <a href="http://www.cppblog.com/cxiaojia/archive/2011/12/21/danli.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记--C/C++内存划分</title><link>http://www.cppblog.com/cxiaojia/archive/2011/11/30/neicun.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Wed, 30 Nov 2011 03:31:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2011/11/30/neicun.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/161222.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2011/11/30/neicun.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/161222.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/161222.html</trackback:ping><description><![CDATA[<div><p>关于C++内存的划分，网上的总结已经很详细了。下边是我转载的一部分。<br /><br />一、一个经过编译的C/C++的程序占用的内存分成以下几个部分：</p>  <p>&nbsp;</p>  <p>　　1、栈区（stack）：由编译器自动分配和释放，存放函数的参数值、局部变量的值等，甚至函数的调用过程都是用栈来完成。其操作方式类似于数据结构中的栈。</p>  <p>&nbsp;</p>  <p>　　2、堆区（heap） ：一般由程序员手动申请以及释放， 若程序员不释放，程序结束时可能由OS回收。注意它与数据结构中的堆是两回事，分配方式类似于链表。</p>  <p>&nbsp;</p>  <p>　　3、全局区（静态区）（static）：全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域，未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放空间。</p>  <p>&nbsp;</p>  <p>　　4、文字常量区：常量字符串就是放在这里的。 程序结束后由系统释放空间。</p>  <p>&nbsp;</p>  <p>　　5、程序代码区：存放函数体的二进制代码。</p>  <p>&nbsp;</p>  <p>　　下面的例子可以完全展示不同的变量所占的内存区域：</p>  <p>&nbsp;</p><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">&nbsp;<br />　　<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;0;&nbsp;全局初始化区<br />&nbsp;<br />　　<span style="color: #0000FF; ">char</span>&nbsp;*p1;&nbsp;全局未初始化区<br />&nbsp;<br />　　main()<br />&nbsp;<br />　　{<br />&nbsp;<br />　　<span style="color: #0000FF; ">int</span>&nbsp;b;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">栈中</span><span style="color: #008000; "><br /></span>&nbsp;<br />　　<span style="color: #0000FF; ">char</span>&nbsp;s[]&nbsp;=&nbsp;"abc";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">栈中</span><span style="color: #008000; "><br /></span>&nbsp;<br />　　<span style="color: #0000FF; ">char</span>&nbsp;*p2;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">栈中</span><span style="color: #008000; "><br /></span>&nbsp;<br />　　<span style="color: #0000FF; ">char</span>&nbsp;*p3&nbsp;=&nbsp;"123456";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">123456\0在常量区，p3在栈上</span><span style="color: #008000; "><br /></span>&nbsp;<br />　　<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;c&nbsp;=0；&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">全局（静态）初始化区<br />&nbsp;<br />　　</span><span style="color: #008000; ">//</span><span style="color: #008000; ">以下分配得到的10和20字节的区域就在堆区</span><span style="color: #008000; "><br /></span>&nbsp;<br />　　p1&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>&nbsp;*)malloc(10);<br />&nbsp;<br />　　p2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[20];<span style="color: #008000; ">//</span><span style="color: #008000; ">(char&nbsp;*)malloc(20);</span><span style="color: #008000; "><br /></span>&nbsp;<br />　　strcpy(p1,&nbsp;"123456");&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">123456\0放在常量区，编译器可能会将它与p3所指向的"123456"优化成一个地方。</span><span style="color: #008000; "><br /></span>&nbsp;<br />　　}</div>  <p>&nbsp;</p>  <p>　　二、栈（stack）和堆（heap）具体的区别。</p>  <p>&nbsp;</p>  <p>　　1、在申请方式上</p>  <p>&nbsp;</p>  <p>　　栈（stack）: 现在很多人都称之为堆栈，这个时候实际上还是指的栈。它由编译器自动管理，无需我们手工控制。例如，声明函数中的一个局部变量 int b 系统自动在栈中为b开辟空间；在调用一个函数时，系统自动的给函数的形参变量在栈中开辟空间。</p>  <p>&nbsp;</p>  <p>　　堆（heap）: 申请和释放由程序员控制，并指明大小。容易产生memory leak。</p>  <p>&nbsp;</p>  <p>　　在C中使用malloc函数。</p>  <p>&nbsp;</p>  <p>　　如：p1 = (char *)malloc(10);</p>  <p>&nbsp;</p>  <p>　　在C++中用new运算符。</p>  <p>&nbsp;</p>  <p>　　如：p2 = new char[20];//(char *)malloc(10);</p>  <p>&nbsp;</p>  <p>　　但是注意p1本身在全局区，而p2本身是在栈中的，只是它们指向的空间是在堆中。<br /><br />&nbsp; &nbsp; &nbsp; new的本质还是使用malloc的，但是new和malloc还是有很大区别：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（1）malloc是C语言中的函数，new是C++中的操作符<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（2）malloc的返回值是VOID*，new返回值是带有类型的<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（3）malloc只负责分配内存而不会调用类的构造函数，new不仅会分配内存，还会调用类的构造函数</p>  <p>&nbsp;</p>  <p>　　2、申请后系统的响应上</p>  <p>&nbsp;</p>  <p>　　栈（stack）:只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢出。</p>  <p>&nbsp;</p>  <p>　　堆（heap）: 首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序。另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分配的大小，这样，代码中的delete或free语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重新放入空闲链表中。</p>  <p>&nbsp;</p>  <p>　3、申请大小的限制</p>  <p>&nbsp;</p>  <p>　　栈（stack）:在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在Windows下，栈的大小是2M（也有的说是1M，总之是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小。例如，在VC6下面，默认的栈空间大小是1M（好像是，记不清楚了）。当然，我们可以修改：打开工程，依次操作菜单如下：Project-&gt;Setting-&gt;Link，在Category 中选中Output，然后在Reserve中设定堆栈的最大值和commit。</p>  <p>&nbsp;</p>  <p>　　注意：reserve最小值为4Byte；commit是保留在虚拟内存的页文件里面，它设置的较大会使栈开辟较大的值，可能增加内存的开销和启动时间。</p>  <p>&nbsp;</p>  <p>　　堆（heap）: 堆是向高地址扩展的数据结构，是不连续的内存区域（空闲部分用链表串联起来）。正是由于系统是用链表来存储空闲内存，自然是不连续的，而链表的遍历方向是由低地址向高地址。一般来讲在32位系统下，堆内存可以达到4G的空间，从这个角度来看堆内存几乎是没有什么限制的。由此可见，堆获得的空间比较灵活，也比较大。</p>  <p>&nbsp;</p>  <p>　　4、分配空间的效率上</p>  <p>&nbsp;</p>  <p>　　栈（stack）:栈是机器系统提供的数据结构，计算机会在底层对栈提供支持：分配专门的寄存器存放栈的地址，压栈出栈都有专门的指令执行，这就决定了栈的效率比较高。但程序员无法对其进行控制。</p>  <p>&nbsp;</p>  <p>　　堆（heap）:是C/C++函数库提供的，由new或malloc分配的内存，一般速度比较慢，而且容易产生内存碎片。它的机制是很复杂的，例如为了分配一块内存，库函数会按照一定的算法（具体的算法可以参考数据结构/操作系统）在堆内存中搜索可用的足够大小的空间，如果没有足够大小的空间（可能是由于内存碎片太多），就有可能调用系统功能去增加程序数据段的内存空间，这样就有机会分到足够大小的内存，然后进行返回。这样可能引发用户态和核心态的切换，内存的申请，代价变得更加昂贵。显然，堆的效率比栈要低得多。</p>  <p>&nbsp;</p>  <p>　　5、堆和栈中的存储内容</p>  <p>&nbsp;</p>  <p>　　栈（stack）:在函数调用时，第一个进栈的是主函数中子函数调用后的下一条指令（子函数调用语句的下一条可执行语句）的地址，然后是子函数的各个形参。在大多数的C编译器中，参数是由右往左入栈的，然后是子函数中的局部变量。注意：静态变量是不入栈的。当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函数中子函数调用完成的下一条指令，程序由该点继续运行。</p>  <p>&nbsp;</p>  <p>　　堆（heap）:一般是在堆的头部用一个字节存放堆的大小，堆中的具体内容有程序员安排。</p>  <p>&nbsp;</p>  <p>　　6、存取效率的比较</p>  <p>&nbsp;</p>  <p>　　这个应该是显而易见的。拿栈上的数组和堆上的数组来说：</p>  <p>&nbsp;</p>  <p>　</p><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 />--><br />　<span style="color: #0000FF; ">void</span>&nbsp;main()<br />&nbsp;<br />　　{<br />&nbsp;<br />　　<span style="color: #0000FF; ">int</span>&nbsp;arr[5]={1,2,3,4,5};<br />&nbsp;<br />　　<span style="color: #0000FF; ">int</span>&nbsp;*arr1;<br />&nbsp;<br />　　arr1=<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[5];<br />&nbsp;<br />　　<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j=0;j&lt;=4;j++)<br />&nbsp;<br />　　{<br />&nbsp;<br />　　arr1[j]=j+6;<br />&nbsp;<br />　　}<br />&nbsp;<br />　　<span style="color: #0000FF; ">int</span>&nbsp;a=arr[1];<br />&nbsp;<br />　　<span style="color: #0000FF; ">int</span>&nbsp;b=arr1[1];<br />&nbsp;<br />　　}</div>  <p>&nbsp;</p>  <p>　　上面代码中，arr1（局部变量）是在栈中，但是指向的空间确在堆上，两者的存取效率，当然是arr高。因为arr[1]可以直接访问，但是访问arr1[1]，首先要访问数组的起始地址arr1，然后才能访问到arr1[1]。</p>  <p>&nbsp;</p>  <p>　　总而言之，言而总之：</p>  <p>&nbsp;</p>  <p>　　堆和栈的区别可以用如下的比喻来看出：</p>  <p>&nbsp;</p>  <p>　　使用栈就象我们去饭馆里吃饭，只管点菜（声明变量）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。</p>  <p>&nbsp;</p>  <p>　　使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由度大。</p></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/161222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2011-11-30 11:31 <a href="http://www.cppblog.com/cxiaojia/archive/2011/11/30/neicun.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于拷贝（复制）构造函数为什么不能用值传递</title><link>http://www.cppblog.com/cxiaojia/archive/2011/11/22/cpp1.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Tue, 22 Nov 2011 11:46:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2011/11/22/cpp1.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/160730.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2011/11/22/cpp1.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/160730.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/160730.html</trackback:ping><description><![CDATA[当你尝试着把拷贝构造函数写成值传递的时候，会发现编译都通不过，错误信息如下：<br /><span style="color: red; ">error: invalid constructor; you probably meant 'S (const S&amp;)' </span>（大致意思是：无效的构造函数，你应该写成。。。）<br />当编译错误的时候你就开始纠结了，为什么拷贝构造函数一定要使用引用传递呢，我上网查找了许多资料，大家的意思基本上都是说如果用值传递的话可能会产生死循环。编译器可能基于这样的原因不允许出现值传递的拷贝构造函数，也有可能是C++标准是这样规定的。<div><br />如果真是产生死循环这个原因的话，应该是这样子的：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 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: #000000; "><br />#include</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: #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: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;S<br />{<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;S(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;x):a(x){}<br />&nbsp;&nbsp;S(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;S&nbsp;st){</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">st.a;}</span><span style="color: #008000; ">//</span><span style="color: #008000; ">拷贝构造函数</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">};<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;s1(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;s2(s1);<br /><br /><br />&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 />}<br /></span></div>当给s2初始化的时候调用了s2的拷贝构造函数，由于是值传递，系统会给形参st重新申请一段空间，然后调用自身的拷贝构造函数把s1的数据成员的值传给st。当调用自身的拷贝构造函数的时候又因为是值传递，所以。。。<br />也就是说，只要调用拷贝构造函数，就会重新申请一段空间，只要重新申请一段空间，就会调用拷贝构造函数，这样一直下去就形成了一个死循环。<br />所以拷贝构造函数一定不能是值传递。<br /><br /><br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/160730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2011-11-22 19:46 <a href="http://www.cppblog.com/cxiaojia/archive/2011/11/22/cpp1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>现代C++风格的新元素</title><link>http://www.cppblog.com/cxiaojia/archive/2011/11/14/xdfg.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Mon, 14 Nov 2011 05:07:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2011/11/14/xdfg.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/160077.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2011/11/14/xdfg.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/160077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/160077.html</trackback:ping><description><![CDATA[<div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong><strong>&#8220;C++11就像一门新的语言。&#8221; &#8211; Bjarne Stroustrup</strong></strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">C++11标准推出了很多有用的新特性。本文特别关注相比C++98更像是一门新语言的那部分特性，因为：</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">这些特性改变了编写C++程序使用的代码风格和习语[TODO]，通常也包括你设计C++函数库的方式。例如，你会看到更多参数和返回值类型为智能指针<em><strong>(smart pointer)</strong></em>，同时也会看到函数通过值传递返回大型对象</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">你将会发现在大多数的代码示例中充斥着新特性的身影。例如，几乎每5行现代C++代码示例都会使用到<strong>auto</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">C++11的其他特性也很棒。但是请先熟悉下面这些，正是因为这些特性的广泛使用使得C++11代码如同其他现代主流语言一样整洁、安全和高效，与此同时保持了C++传统的性能优势。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">提示：</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; font-size: 14px; line-height: 25px; ">与Strunk &amp; White[TODO]一样，本文只做概要的总结性指导而不做详尽基本原理和优缺点分析。详细分析请参见其他文章</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; font-size: 14px; line-height: 25px; ">本文会不断更新，主要变更及内容增加请参见文末变更记录</li></ul><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>auto</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; "></p><div style="display: inline-block; "><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; "><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>nullptr</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">始终使用nullptr表示一个null指针值，绝不要使用数字0或者NULL宏，因为它们也可以代表一个整数或者指针从而产生歧义。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>Range for</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">基于范围的循环使得按顺序访问其中的每个元素变得非常方便。</p></span></div></div>基于以下两个原因，尽可能使用auto：首先，使用auto会避免重复声明编译器已经知道的类型。<span class="Apple-style-span" style="font-family: verdana, 'courier new'; font-size: 13px; line-height: 21px; "><span style="color: #000000; ">&nbsp;<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: #000000; ">&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++98</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;map</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::iterator&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m.begin&nbsp;();<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;auto&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;begin&nbsp;(m);</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25px; ">其次，当使用未知类型或者类型名称不易理解时使auto会更加便利，例如大多数的lambda函数［TODO］&#8212;&#8212;你甚至不能简单的拼写出类型的名字。</span></div><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: #000000; "><br />&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++98</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;binder2nd</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;greater</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bind2nd&nbsp;(&nbsp;greater</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">()，&nbsp;</span><span style="color: #000000; ">42</span><span style="color: #000000; ">&nbsp;);<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;auto&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[](</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i)&nbsp;{&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">42</span><span style="color: #000000; ">;&nbsp;};</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><p style="font-size: 14px; line-height: 25px; text-align: justify; ">需要注意，使用auto并不改变代码的含义。代码仍然是静态类型［译注］，每个表达式的类型都是清晰和明确的；C++11只是不需要我们重复声明类型的名字。一些人刚开始可能会害怕在这里使用auto，因为感觉好像没有（重复）声明我们需要的类型就意味着会碰巧得到一个不同的类型。如果你想要明确地进行一次<em>强制类型转换</em>，没有问题，声明目标类型就好了。然而大多数情况下，只要使用auto就可以了；几乎不会出现错误地拿到一个不同类型的情况，即便出现错误，C++的强静态类型系统也会由编译器让你知道这个错误，因为你正试图访问一个变量没有的成员函数或是错误地调用了该函数。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">译注：动态类型语言（dynamic typing language）是指类型检查发生在运行期间（run-time）的语言。静态类型语言（static typing language）是类型检查发生在编译期间（compile-time）的语言。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">智能指针：无须delete</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">请始终使用标准智能指针以及非占有原始指针(non-owning raw pointer)。绝不要使用占有原生指针(owning raw pointer)和delete操作，除非在实现你自己的底层数据结构这种少见的情况下（即使在此时也需要在 class 范围内保持完好的封装）。如果只能够知道你是另一个对象唯一的所有者，请使用unique_ptr来表示唯一所有权（TODO)。一个&#8221;new T&#8221;表达式会马上初始化另一个引用它的对象，通常是一个unique_ptr。<br /></p></span></div><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: #000000; "><br />&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11&nbsp;Pimpl&nbsp;Idiom</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;widget&nbsp;{<br /><br />&nbsp;&nbsp;widget&nbsp;();<br /><br />&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">widget&nbsp;();<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;impl;<br /><br />&nbsp;&nbsp;unique_ptr</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">impl</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pimpl;<br /><br />&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;in&nbsp;.cpp&nbsp;file</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;impl&nbsp;{<br /><br />&nbsp;&nbsp;:::<br /><br />&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;widget::widget&nbsp;()<br /><br />&nbsp;&nbsp;:&nbsp;pimpl&nbsp;(&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;impl&nbsp;()&nbsp;)<br /><br />&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;widget::</span><span style="color: #000000; ">~</span><span style="color: #000000; ">widget&nbsp;()&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">;</span></div><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25px; ">使用shared_ptr来表示共享所有权。推荐使用make_shared来有效地创建共享对象。<br /></span></div><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: #000000; "><br />&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++98</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;widget</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pw&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;widget&nbsp;();<br /><br />&nbsp;&nbsp;:::<br /><br />&nbsp;&nbsp;delete&nbsp;pw;<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;auto&nbsp;pw&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;make_shared</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">widget</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25px; ">使用 weak_ptr 来退出循环并且表示可选性（例如，实现一个对象缓存）</span></div><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: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;gadget;<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;widget&nbsp;{<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br /><br />&nbsp;&nbsp;shared_ptr</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">gadget</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;g;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;if&nbsp;shared&nbsp;ownership</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;gadget&nbsp;{<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br /><br />&nbsp;&nbsp;weak_ptr</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">widget</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;w;<br /><br />&nbsp;&nbsp;};</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25px; ">如果你知道另一个对象存在时间会更长久并且希望跟踪它，使用一个（非占有non-owning)原始指针。</span></div><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: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;node&nbsp;{<br /><br />&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;unique_ptr</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">node</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;children;<br /><br />&nbsp;&nbsp;node</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;parent;<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /><br />&nbsp;&nbsp;:::<br /><br />&nbsp;&nbsp;};</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>nullptr</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">始终使用nullptr表示一个null指针值，绝不要使用数字0或者NULL宏，因为它们也可以代表一个整数或者指针从而产生歧义。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>Range for</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">基于范围的循环使得按顺序访问其中的每个元素变得非常方便。<br /></p></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: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++98</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::iterator&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v.begin&nbsp;();&nbsp;i&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;v.end&nbsp;();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i&nbsp;)&nbsp;{<br /><br />&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">i;<br /><br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(&nbsp;auto&nbsp;d&nbsp;:&nbsp;v&nbsp;)&nbsp;{<br /><br />&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;d;<br /><br />&nbsp;&nbsp;}</span></div></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>非成员（nonmember） begin 和 end</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">始终使用非成员begin和end，因为它是可扩展的并且可以应用在所有的容器类型(container type)，不仅仅是遵循了STL风格提供了 .begin ()和 .end ()成员函数的容器，甚至数组都可以使用。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">如果你使用了一个非STL风格的collection类型，虽然提供了迭代但没有提供STL的 .begin ()和 .end ()，通常可以为这个类型编写自己的非成员begin和end来进行重载。这样你就可以使用STL容器的编程风格来遍历该类型。C++11标准提供了示例:C数组就是这样一个类型，标准同时为数组提供了begin和end。</p></span></div><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: #000000; "><br />&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;v;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a[</span><span style="color: #000000; ">100</span><span style="color: #000000; ">];<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++98</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;sort&nbsp;(&nbsp;v.begin&nbsp;()，&nbsp;v.end&nbsp;()&nbsp;);<br /><br />&nbsp;&nbsp;sort&nbsp;(&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(a)</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(a[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">])&nbsp;);<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;sort&nbsp;(&nbsp;begin&nbsp;(v)，&nbsp;end&nbsp;(v)&nbsp;);<br /><br />&nbsp;&nbsp;sort&nbsp;(&nbsp;begin&nbsp;(a)，&nbsp;end&nbsp;(a)&nbsp;);</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>Lambda 函数和算法</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">Lambda[TODO]是决定乾坤的因素，它会使你编写的代码变得更优雅、更快速。Lambda使得STL算法的可用性提高了近100倍。新近开发的C++函数库都是基于lambda可以用的前提（例如，PPL）并且有些函数库甚至要求你编写lambda来调用函数库（例如，C++ AMP）</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">下面是一个快速示例：找到v里面大于x并且小于y的第一个元素。在C++11中，最简单和干净的代码就是调用一个标准函数。<br /></p></span></div><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: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++98:&nbsp;write&nbsp;a&nbsp;naked&nbsp;loop&nbsp;(using&nbsp;std::find_if&nbsp;is&nbsp;impractically&nbsp;difficult)</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::iterator&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v.begin&nbsp;();&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;because&nbsp;we&nbsp;need&nbsp;to&nbsp;use&nbsp;i&nbsp;later</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;v.end&nbsp;();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i&nbsp;)&nbsp;{<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">i&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;y&nbsp;)&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11:&nbsp;use&nbsp;std::find_if</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;auto&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;find_if&nbsp;(&nbsp;begin&nbsp;(v)，&nbsp;end&nbsp;(v)，&nbsp;[</span><span style="color: #000000; ">=</span><span style="color: #000000; ">](</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i)&nbsp;{&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;y;&nbsp;}&nbsp;);</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25px; ">想要使用C++编写一个循环或者类似的新特性？不用着急；只要编写一个模板函数（template function)(函数库算法），并且<em>几乎可以</em>将lambda当做语言特性来使用，与此同时会更加灵活，因为它不是固定的语言特性而是一个真正的函数库。</span></div><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: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C#</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">lock</span><span style="color: #000000; ">(&nbsp;mut_x&nbsp;)&nbsp;{<br /><br />&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;use&nbsp;x&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /><br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;不使用&nbsp;lambda&nbsp;的C++11：已经非常简洁并且更灵活（例如，可以使用超时以及其他选项）</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;lock_guard</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">mutex</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;hold&nbsp;(&nbsp;mut_x&nbsp;);<br /><br />&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;use&nbsp;x&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /><br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11&nbsp;with&nbsp;lambdas,&nbsp;and&nbsp;a&nbsp;helper&nbsp;algorithm:&nbsp;C#&nbsp;syntax&nbsp;in&nbsp;C++<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;使用了&nbsp;lambda&nbsp;的C++11可以带一个辅助算法：在&nbsp;C++&nbsp;中使用&nbsp;C#&nbsp;的文法<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Algorithm:&nbsp;template&lt;typename&nbsp;T,&nbsp;typename&nbsp;F&gt;&nbsp;void&nbsp;lock&nbsp;(&nbsp;T&amp;&nbsp;t,&nbsp;F&nbsp;f&nbsp;)&nbsp;{&nbsp;lock_guard&lt;T&gt;&nbsp;hold&nbsp;(t);&nbsp;f&nbsp;();&nbsp;}</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">lock</span><span style="color: #000000; ">(&nbsp;mut_x，&nbsp;[</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">]{<br /><br />&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;use&nbsp;x&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /><br />&nbsp;&nbsp;});</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25px; ">去熟悉lambda吧。你会大量使用它，不仅仅在C++中&#8212;&#8212;它已经广泛应用于很多主流的编程语言。一个开始的好去处请参考我在PDC2010的演讲《无处不在的 lambda》<br /></span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>Move / &amp;&amp;</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">Move被认为是copy的最佳优化，尽管它也使得其他事情成为可能比如信息被转发。</p></span></div><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: #000000; "><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++98：避免&nbsp;copy&nbsp;的替代方法</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;*</span><span style="color: #000000; ">&nbsp;make_big_vector&nbsp;();&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;选择1:&nbsp;返回指针:&nbsp;没有拷贝，但不要忘记&nbsp;delete</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;:::<br /><br />&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;*</span><span style="color: #000000; ">&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;make_big_vector&nbsp;();<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;make_big_vector&nbsp;(&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;选择2:&nbsp;通过引用传递:&nbsp;没有拷贝，但是调用者需要传入一个有名对象</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;:::<br /><br />&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;result;<br /><br />&nbsp;&nbsp;make_big_vector&nbsp;(&nbsp;result&nbsp;);<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++11:&nbsp;move</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;make_big_vector&nbsp;();&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通常对于&#8221;被调用者(callee)分配的空间&#8220;也适用</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;:::<br /><br />&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;make_big_vector&nbsp;();</span></div><br /><div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><p style="font-size: 14px; line-height: 25px; text-align: justify; ">Move语法改变了我们设计API的方式。我们可以更多地设计通过值传递。为你的类型启用move语法，使用时会比copy更有效。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>更多变化</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">还有更多现代C++的特性。并且我计划在未来编写更多深入C++11新特性以及其他特性的短文，我们会知道更多并且喜欢上它。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">但目前，这是必须知道的新特性。这些特性组成了现代C++风格的核心，使得C++代码看起来和执行时像他们设计的那样，你将会看到这些特性会出现在几乎每一段你看到或者编写的现代C++代码中。并且它们使得现代C++更加干净、安全且快速，使得C++在未来的若干年仍然是我们产业的依靠。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; "><strong>主要变更</strong></p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">2011-10-30:为Lambda增加C#lock示例。重新组织智能指针首先介绍unique_prt。</p><p style="font-size: 14px; line-height: 25px; text-align: justify; ">文章出自：<a target="_blank" href="http://blog.jobbole.com/5748/?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=%25e7%258e%25b0%25e4%25bb%25a3c%25e9%25a3%258e%25e6%25a0%25bc%25e7%259a%2584%25e6%2596%25b0%25e5%2585%2583%25e7%25b4%25a0" style="color: #015fb6; text-decoration: none; ">伯乐在线</a></p></span></div><br /><br /><br /><br /><br /><br /></span></span><p>&nbsp;</p></span></div><img src ="http://www.cppblog.com/cxiaojia/aggbug/160077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2011-11-14 13:07 <a href="http://www.cppblog.com/cxiaojia/archive/2011/11/14/xdfg.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>