﻿<?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++博客-&lt;font color="#ff8000"&gt;&amp;nbsp&amp;nbsp&amp;nbspC++&amp;nbsp技术中心&lt;/font&gt;-随笔分类-C++ 基础</title><link>http://www.cppblog.com/API/category/16116.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2020 14:46:01 GMT</lastBuildDate><pubDate>Thu, 07 May 2020 14:46:01 GMT</pubDate><ttl>60</ttl><item><title>golang游戏服务器引擎</title><link>http://www.cppblog.com/API/archive/2020/05/07/217286.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Thu, 07 May 2020 08:04:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2020/05/07/217286.html</guid><wfw:comment>http://www.cppblog.com/API/comments/217286.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2020/05/07/217286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/217286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/217286.html</trackback:ping><description><![CDATA[<span data-offset-key="51d80-0-0" style="color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif; font-size: 15px; white-space: pre-wrap; background-color: #ffffff;"><span data-text="true">现在go语言比较流行的有leaf,gowold,origin。前两个比较基础，实现集群还需要进行二次的编码设计。origin不一样，只需要通过配置方便快速的集群。</span></span>origin总体设计如go语言设计一样，总是尽可能的提供简洁和易用的模式，快速开发。 能够根据业务需求快速并灵活的制定服务器架构。 利用多核优势，将不同的service配置到不同的node，并能高效的协同工作。 将整个引擎抽象三大对象，node,service,module。通过统一的组合模型管理游戏中各功能模块的关系。&nbsp;<br /><br /><br /><div>origin引擎三大对象关系</div><div>---------------</div><div>* Node:&nbsp; &nbsp;可以认为每一个Node代表着一个origin进程</div><div>* Service:一个独立的服务可以认为是一个大的功能模块，他是Node的子集，创建完成并安装Node对象中。服务可以支持对外部RPC等功能。</div><div>* Module: 这是origin最小对象单元，强烈建议所有的业务模块都划分成各个小的Module组合，origin引擎将监控所有服务与Module运行状态，例如可以监控它们的慢处理和死循环函数。Module可以建立树状关系。Service本身也是Module的类型。<br /><br />更加详细的参照项目地址：<a href="https://github.com/duanhf2012/origin">https://github.com/duanhf2012/origin</a></div><img src ="http://www.cppblog.com/API/aggbug/217286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2020-05-07 16:04 <a href="http://www.cppblog.com/API/archive/2020/05/07/217286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存泄露监控报告</title><link>http://www.cppblog.com/API/archive/2017/11/21/215360.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Tue, 21 Nov 2017 09:28:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2017/11/21/215360.html</guid><wfw:comment>http://www.cppblog.com/API/comments/215360.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2017/11/21/215360.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/215360.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/215360.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;时间总是能让一切改变，至上次发blog我已经不在福州。现在就职于成都一家公司，刚来一直在阅读代码，发现服务器的逻辑代码，有挺多让直接new申请内存，对这个我总觉得有些裸奔的感觉。啊哈，有可能被同事看到，我没有其他意思哈，只是觉得没有管理，一不小心就内存泄露了，写的时候要小心又小心。如果要从堆中获取一块内存，一般还是交给智能指针去管理更妥些。<br />&nbsp; &nbsp; 以上这大段和下面写的都没有任何关系。嗯，是的，确实是没有关系，我只是在思考已经这样写了，能不能对内存申请和释放做个监控。其实网上代码一堆，我也自己按照自己的思路实现了一下，原理都是重载new和delete方式了。闲言少叙，话不多说。<br />&nbsp; &nbsp;同样，我也要重载new与delete关键字，但是我重载的是带3参数的，具体的申请交给我的CMemLeakMonitorMgr管理器吧。以后再具体说明，先看如下代码：<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 />--><br /><span style="color: #0000FF; ">void</span>*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>(size_t&nbsp;size,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;funName,&nbsp;size_t&nbsp;line)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;g_pMemLeakMonitorMgr.Alloc(funName,line,size);<br />}<br /><span style="color: #0000FF; ">void</span>*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>[](size_t&nbsp;size,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;file,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;line)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>(size,&nbsp;file,&nbsp;line);<br />}<br /><br /><span style="color: #0000FF; ">void</span>*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>(size_t&nbsp;size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;malloc(size);<br />}<br /><span style="color: #0000FF; ">void</span>*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>[](size_t&nbsp;size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;malloc(size);<br />}<br /><br /><span style="color: #0000FF; ">void</span>*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>(size_t&nbsp;size,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::nothrow_t&amp;)&nbsp;<span style="color: #0000FF; ">throw</span>()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;::<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>(size);<br />}<br /><span style="color: #0000FF; ">void</span>*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>[](size_t&nbsp;size,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::nothrow_t&amp;)&nbsp;<span style="color: #0000FF; ">throw</span>()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;::<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>[](size);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;delete(<span style="color: #0000FF; ">void</span>*&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;g_pMemLeakMonitorMgr.Free(p);<br />}</div>&nbsp; &nbsp;然后我定义以下宏，来替换new操作,请看下面：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span>&nbsp;DEBUG<br />#ifdef&nbsp;DEBUG<br /><span style="color: #0000FF; ">#define</span>&nbsp;DEBUG_NEW&nbsp;new(__FUNCTION__,&nbsp;__LINE__)<br /><span style="color: #0000FF; ">#define</span>&nbsp;DEBUG_DELETE(p)&nbsp;delete&nbsp;p<span style="color: #008000; "><br /></span><span style="color: #0000FF; ">#else</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;DEBUG_NEW&nbsp;new<br /><span style="color: #0000FF; ">#define</span>&nbsp;DEBUG_DELETE(p)&nbsp;delete&nbsp;p<br /><span style="color: #0000FF; ">#endif</span></div><br />上面的宏应该不用多说吧，设计的是只有在debug情况下，才会生效。这里用DEBUG_NEW与DEBUG_DELETE宏来申请和释放内存，其实完全可以直接替换new与delete，但是我不想这么做，因为我想在使用者用该宏时明白它做了一些&#8220;见不得人&#8221;的事情。哈，<span style="font-size: 13px; background-color: #eeeeee;">还</span>是那句话闲言少叙，废话不能多。看下怎么使用吧：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #0000FF; ">void</span>&nbsp;fun1()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG_NEW&nbsp;<span style="color: #0000FF; ">int</span>;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;fun2()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*p&nbsp;=&nbsp;DEBUG_NEW&nbsp;<span style="color: #0000FF; ">char</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG_DELETE(p);<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;fun3()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG_NEW&nbsp;<span style="color: #0000FF; ">int</span>;<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Test2&nbsp;*p&nbsp;=&nbsp;DEBUG_NEW&nbsp;Test2();<br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG_DELETE(p);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fun1();<br />&nbsp;&nbsp;&nbsp;&nbsp;fun2();<br />&nbsp;&nbsp;&nbsp;&nbsp;fun3();<br />&nbsp;&nbsp;&nbsp;&nbsp;fun1();<br />&nbsp;&nbsp;&nbsp;&nbsp;fun1();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;g_pMemLeakMonitorMgr.ReportMemLeak();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div>嗯，是的，这个很好懂，通过宏来替换之前的new和delete，然后几个函数中有些函数是有内存泄露的。然后通过ReportMemLeak来报告结果。可以显示的如下：<br /><br /><div>Test2 constructor.</div><div>Test2 destructor.</div><div>Test2 constructor.</div><div>Test2 destructor.</div><div>Memory leak FunName:fun1,line:182,totalsize:12 bytes.</div><div>Memory leak FunName:fun3,line:194,totalsize:4 bytes.</div><br /><div id="qb-sougou-search" style="display: none; opacity: 0;"><p>搜索</p><p class="last-btn">复制</p><iframe src=""></iframe></div><img src ="http://www.cppblog.com/API/aggbug/215360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2017-11-21 17:28 <a href="http://www.cppblog.com/API/archive/2017/11/21/215360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc内存地址填充</title><link>http://www.cppblog.com/API/archive/2017/07/06/215056.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Thu, 06 Jul 2017 03:33:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2017/07/06/215056.html</guid><wfw:comment>http://www.cppblog.com/API/comments/215056.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2017/07/06/215056.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/215056.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/215056.html</trackback:ping><description><![CDATA[<p style="padding: 0px; font-family: Arial; background-color: #ffffff; font-stretch: normal; line-height: 26px; color: #333333;"><span style="font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">0xcdcdcdcd - Created but not initialised</span></p><p style="padding: 0px; font-family: Arial; background-color: #ffffff; font-stretch: normal; line-height: 26px; color: #333333;"><span style="font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">0xdddddddd - Deleted<br /></span><span style="font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">0xfeeefeee - Freed memory set by NT's heap manager<br /></span><span style="font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">0xcccccccc - Uninitialized locals in VC6 when you compile w/ /GZ<br /></span><span style="font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif;">0xabababab - Memory following a block allocated by LocalAlloc()</span></p><p style="padding: 0px; font-family: Arial; background-color: #ffffff; font-stretch: normal; line-height: 26px; color: #333333;"><span style="color: #000000; font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif; line-height: 23px;"><br /></span></p><p style="padding: 0px; font-family: Arial; background-color: #ffffff; font-stretch: normal; line-height: 26px; color: #333333;"><span style="color: #000000; font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif; line-height: 23px;">VC++在Debug编译方式编译的程序中，会跟踪用new分配的内存。新分配的内存会用0xcd(助记词为Cleared Data)填充，防止未初始化；当它被delete后，又会被0xdd(Dead &nbsp; Data)填充，防止再次被使用。这样有利于调试内存错误。之所以选这样的填充模式，是因为：</span></p><p style="padding: 0px; font-family: Arial; background-color: #ffffff; font-stretch: normal; line-height: 26px; color: #333333;"><span style="font-stretch: normal; line-height: 23px; color: #000000; font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif !important;">1.大数，若被当成指针就会越界&nbsp;</span></p><p style="padding: 0px; font-family: Arial; background-color: #ffffff; font-stretch: normal; line-height: 26px; color: #333333;"><span style="font-stretch: normal; line-height: 23px; color: #000000; font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif !important;">2.奇数，指针通常指向偶数地址 &nbsp;</span></p><p style="padding: 0px; font-family: Arial; background-color: #ffffff; font-stretch: normal; line-height: 26px; color: #333333;"><span style="font-stretch: normal; line-height: 23px; color: #000000; font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif !important;">3.非0,这样不会和 &nbsp; NULL &nbsp; 混淆。&nbsp;</span></p><p style="padding: 0px; font-family: Arial; background-color: #ffffff; font-stretch: normal; line-height: 26px; color: #333333;"><br style="font-stretch: normal; line-height: 23px; color: #000000; font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif !important;" /><span style="font-stretch: normal; line-height: 23px; color: #000000; font-family: &quot;WenQuanYi Micro Hei Mono&quot;, &quot;WenQuanYi Micro Hei&quot;, &quot;Microsoft Yahei Mono&quot;, &quot;Microsoft Yahei&quot;, sans-serif !important;">在Release版中不会有这些字节填充。</span></p><img src ="http://www.cppblog.com/API/aggbug/215056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2017-07-06 11:33 <a href="http://www.cppblog.com/API/archive/2017/07/06/215056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++函数throw()</title><link>http://www.cppblog.com/API/archive/2017/06/30/215041.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 30 Jun 2017 08:28:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2017/06/30/215041.html</guid><wfw:comment>http://www.cppblog.com/API/comments/215041.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2017/06/30/215041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/215041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/215041.html</trackback:ping><description><![CDATA[<div>#define _NOEXCEPT<span style="white-space:pre">	</span>throw ()<br />shared_ptr&lt;_Ty&gt; lock() const _NOEXCEPT<br /><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">它是函数提供者和使用者的一种君子协定，标明该函数不抛出任何异常。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">之所以说是君子协定，是因为实际上内部实现是需要人肉确保。&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">如果一个标明throw()的函数内部发生了throw：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">1，如果内部直接throw something，编译器会发现并指出；</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">2. 如果是内部调用了一个可能throw something的函数，编译器无法发现，运行时一旦这个内部的函数throw，程序会abort。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">****&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">func() throw(type) ,会抛出某种异常</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">func() throw(),不会抛出</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; line-height: 1.5; font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #fefef2;">func() throw(...)，可能是任何类型的异常</p></div><img src ="http://www.cppblog.com/API/aggbug/215041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2017-06-30 16:28 <a href="http://www.cppblog.com/API/archive/2017/06/30/215041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++中volatile与 mutable,explicit 关键字详解</title><link>http://www.cppblog.com/API/archive/2017/04/13/214839.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Thu, 13 Apr 2017 05:39:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2017/04/13/214839.html</guid><wfw:comment>http://www.cppblog.com/API/comments/214839.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2017/04/13/214839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/214839.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/214839.html</trackback:ping><description><![CDATA[<div><font face="verdana">&nbsp; C/C++ 中的 volatile 关键字和 const 对应，用来修饰变量，通常用于建立语言级别的 memory barrier。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明：</font></div><p style="margin-top: 10px; margin-bottom: 10px;"><font face="verdana"><br /></font></p><div></div><div>A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided.</div><div></div><div>&nbsp; &nbsp; &nbsp; volatile 关键字是一种类型修饰符，用它声明的类型变量表示可以被某些编译器未知的因素更改，比如：操作系统、硬件或者其它线程等。遇到这个关键字声明的变量，编译器对访问该变量的代码就不再进行优化，从而可以提供对特殊地址的稳定访问。声明时语法：int volatile vInt; 当要求使用 volatile 声明的变量的值的时候，系统总是重新从它所在的内存读取数据，即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。例如：</div><div></div><div>1<span style="white-space:pre">	</span>volatile int i=10;</div><div>2<span style="white-space:pre">	</span>int a = i;</div><div>3<span style="white-space:pre">	</span>...</div><div>4<span style="white-space:pre">	</span>// 其他代码，并未明确告诉编译器，对 i 进行过操作</div><div>5<span style="white-space:pre">	</span>int b = i;</div><div>&nbsp; &nbsp; volatile 指出 i 是随时可能发生变化的，每次使用它的时候必须从 i的地址中读取，因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。而优化做法是，由于编译器发现两次从 i读数据的代码之间的代码没有对 i 进行过操作，它会自动把上次读的数据放在 b 中。而不是重新从 i 里面读。这样以来，如果 i是一个寄存器变量或者表示一个端口数据就容易出错，所以说 volatile 可以保证对特殊地址的稳定访问。注意，在 VC 6 中，一般调试模式没有进行代码优化，所以这个关键字的作用看不出来。下面通过插入汇编代码，测试有无 volatile 关键字，对程序最终代码的影响：</div><div></div><div>输入下面的代码：</div><div></div><div>01<span style="white-space:pre">	</span>#include &lt;stdio.h&gt;</div><div>02<span style="white-space:pre">	</span>&nbsp;</div><div>03<span style="white-space:pre">	</span>void main()</div><div>04<span style="white-space:pre">	</span>{</div><div>05<span style="white-space:pre">	</span> &nbsp; &nbsp;int i = 10;</div><div>06<span style="white-space:pre">	</span> &nbsp; &nbsp;int a = i;</div><div>07<span style="white-space:pre">	</span>&nbsp;</div><div>08<span style="white-space:pre">	</span> &nbsp; &nbsp;printf("i = %d", a);</div><div>09<span style="white-space:pre">	</span>&nbsp;</div><div>10<span style="white-space:pre">	</span> &nbsp; &nbsp;// 下面汇编语句的作用就是改变内存中 i 的值</div><div>11<span style="white-space:pre">	</span> &nbsp; &nbsp;// 但是又不让编译器知道</div><div>12<span style="white-space:pre">	</span> &nbsp; &nbsp;__asm {</div><div>13<span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp;mov dword ptr [ebp-4], 20h</div><div>14<span style="white-space:pre">	</span> &nbsp; &nbsp;}</div><div>15<span style="white-space:pre">	</span>&nbsp;</div><div>16<span style="white-space:pre">	</span> &nbsp; &nbsp;int b = i;</div><div>17<span style="white-space:pre">	</span> &nbsp; &nbsp;printf("i = %d", b);</div><div>18<span style="white-space:pre">	</span>}</div><div>&nbsp; &nbsp; 然后，在 Debug 版本模式运行程序，输出结果如下：</div><div></div><div>i = 10</div><div>i = 32</div><div>&nbsp; &nbsp; 然后，在 Release 版本模式运行程序，输出结果如下：</div><div></div><div>i = 10</div><div>i = 10</div><div>&nbsp; &nbsp; 输出的结果明显表明，Release 模式下，编译器对代码进行了优化，第二次没有输出正确的 i 值。下面，我们把 i 的声明加上 volatile 关键字，看看有什么变化：</div><div></div><div>01<span style="white-space:pre">	</span>#include &lt;stdio.h&gt;</div><div>02<span style="white-space:pre">	</span>&nbsp;</div><div>03<span style="white-space:pre">	</span>void main()</div><div>04<span style="white-space:pre">	</span>{</div><div>05<span style="white-space:pre">	</span> &nbsp; &nbsp;volatile int i = 10;</div><div>06<span style="white-space:pre">	</span> &nbsp; &nbsp;int a = i;</div><div>07<span style="white-space:pre">	</span>&nbsp;</div><div>08<span style="white-space:pre">	</span> &nbsp; &nbsp;printf("i = %d", a);</div><div>09<span style="white-space:pre">	</span> &nbsp; &nbsp;__asm {</div><div>10<span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp;mov dword ptr [ebp-4], 20h</div><div>11<span style="white-space:pre">	</span> &nbsp; &nbsp;}</div><div>12<span style="white-space:pre">	</span>&nbsp;</div><div>13<span style="white-space:pre">	</span> &nbsp; &nbsp;int b = i;</div><div>14<span style="white-space:pre">	</span> &nbsp; &nbsp;printf("i = %d", b);</div><div>15<span style="white-space:pre">	</span>}</div><div>&nbsp; &nbsp; 分别在 Debug 和 Release 版本运行程序，输出都是：</div><div></div><div>i = 10</div><div>i = 32</div><div>&nbsp; &nbsp; 这说明这个 volatile 关键字发挥了它的作用。其实不只是&#8220;内嵌汇编操纵栈&#8221;这种方式属于编译无法识别的变量改变，另外更多的可能是多线程并发访问共享变量时，一个线程改变了变量的值，怎样让改变后的值对其它线程 visible。一般说来，volatile用在如下的几个地方：&nbsp;</div><div>1) 中断服务程序中修改的供其它程序检测的变量需要加volatile；&nbsp;</div><div>2) 多任务环境下各任务间共享的标志应该加volatile；&nbsp;</div><div>3) 存储器映射的硬件寄存器通常也要加volatile说明，因为每次对它的读写都可能由不同意义；</div><div></div><div>2.volatile 指针</div><div></div><div>&nbsp; &nbsp; 和 const 修饰词类似，const 有常量指针和指针常量的说法，volatile 也有相应的概念：</div><div></div><div>修饰由指针指向的对象、数据是 const 或 volatile 的：</div><div></div><div>1<span style="white-space:pre">	</span>const char* cpch;</div><div>2<span style="white-space:pre">	</span>volatile char* vpch;</div><div>注意：对于 VC，这个特性实现在 VC 8 之后才是安全的。</div><div></div><div>指针自身的值&#8212;&#8212;一个代表地址的整数变量，是 const 或 volatile 的：</div><div></div><div>1<span style="white-space:pre">	</span>char* const pchc;</div><div>2<span style="white-space:pre">	</span>char* volatile pchv;</div><div>&nbsp; &nbsp; 注意：(1) 可以把一个非volatile int赋给volatile int，但是不能把非volatile对象赋给一个volatile对象。</div><div></div><div>　　 &nbsp; &nbsp; &nbsp; &nbsp;(2) 除了基本类型外，对用户定义类型也可以用volatile类型进行修饰。</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (3) C++中一个有volatile标识符的类只能访问它接口的子集，一个由类的实现者控制的子集。用户只能用const_cast来获得对类型接口的完全访问。此外，volatile向const一样会从类传递到它的成员。</div><div></div><div>3. 多线程下的volatile &nbsp;&nbsp;</div><div></div><div>&nbsp; &nbsp; 有些变量是用volatile关键字声明的。当两个线程都要用到某一个变量且该变量的值会被改变时，应该用volatile声明，该关键字的作用是防止优化编译器把变量从内存装入CPU寄存器中。如果变量被装入寄存器，那么两个线程有可能一个使用内存中的变量，一个使用寄存器中的变量，这会造成程序的错误执行。volatile的意思是让编译器每次操作该变量时一定要从内存中真正取出，而不是使用已经存在寄存器中的值，如下：&nbsp;</div><div></div><div>&nbsp; volatile &nbsp;BOOL &nbsp;bStop &nbsp;= &nbsp;FALSE; &nbsp;</div><div>&nbsp; &nbsp;(1) 在一个线程中： &nbsp;</div><div>&nbsp; while( &nbsp;!bStop &nbsp;) &nbsp;{ &nbsp;... &nbsp;} &nbsp;</div><div>&nbsp; bStop &nbsp;= &nbsp;FALSE; &nbsp;</div><div>&nbsp; return; &nbsp; &nbsp;</div><div>&nbsp; &nbsp;(2) 在另外一个线程中，要终止上面的线程循环： &nbsp;</div><div>&nbsp; bStop &nbsp;= &nbsp;TRUE; &nbsp;</div><div>&nbsp; while( &nbsp;bStop &nbsp;); &nbsp;//等待上面的线程终止，如果bStop不使用volatile申明，那么这个循环将是一个死循环，因为bStop已经读取到了寄存器中，寄存器中bStop的值永远不会变成FALSE，加上volatile，程序在执行时，每次均从内存中读出bStop的值，就不会死循环了。</div><div>&nbsp; &nbsp; 这个关键字是用来设定某个对象的存储位置在内存中，而不是寄存器中。因为一般的对象编译器可能会将其的拷贝放在寄存器中用以加快指令的执行速度，例如下段代码中： &nbsp;</div><div>&nbsp; ... &nbsp;</div><div>&nbsp; int &nbsp;nMyCounter &nbsp;= &nbsp;0; &nbsp;</div><div>&nbsp; for(; &nbsp;nMyCounter&lt;100;nMyCounter++) &nbsp;</div><div>&nbsp; { &nbsp;</div><div>&nbsp; ... &nbsp;</div><div>&nbsp; } &nbsp;</div><div>&nbsp; ... &nbsp;</div><div>&nbsp; &nbsp;在此段代码中，nMyCounter的拷贝可能存放到某个寄存器中（循环中，对nMyCounter的测试及操作总是对此寄存器中的值进行），但是另外又有段代码执行了这样的操作：nMyCounter &nbsp;-= &nbsp;1;这个操作中，对nMyCounter的改变是对内存中的nMyCounter进行操作，于是出现了这样一个现象：nMyCounter的改变不同步。</div><img src ="http://www.cppblog.com/API/aggbug/214839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2017-04-13 13:39 <a href="http://www.cppblog.com/API/archive/2017/04/13/214839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用enable_shared_from_this(转)</title><link>http://www.cppblog.com/API/archive/2017/03/07/214732.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Tue, 07 Mar 2017 06:17:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2017/03/07/214732.html</guid><wfw:comment>http://www.cppblog.com/API/comments/214732.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2017/03/07/214732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/214732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/214732.html</trackback:ping><description><![CDATA[<span style="font-family: Arial; background-color: #ffffff; font-weight: bold;">使用enable_shared_from_this</span><br style="font-family: Arial; background-color: #ffffff;" /><br style="font-family: Arial; background-color: #ffffff;" /><span style="font-family: Arial; background-color: #ffffff;">说明</span><br style="font-family: Arial; background-color: #ffffff;" /><span style="font-family: Arial; background-color: #ffffff;">The header &lt;boost/enable_shared_from_this.hpp&gt; defines the class template enable_shared_from_this. It is used as a base class that allows a shared_ptr to the current object to be obtained from within a member function.</span><br style="font-family: Arial; background-color: #ffffff;" /><span style="font-family: Arial; background-color: #ffffff;">继承该类就可以进行基于当前子类进行安全的weap_ptr到shared_ptr的转换...</span><br style="font-family: Arial; background-color: #ffffff;" /><br style="font-family: Arial; background-color: #ffffff;" /><span style="font-family: Arial; background-color: #ffffff;">代码实例</span><br style="font-family: Arial; background-color: #ffffff;" /><span style="font-family: Arial; background-color: #ffffff;">以下代码中Y类继承enable_shared_from_this,, 从而我们可以直接在函数中调用shared_from_this获得该对象的shared_ptr</span><br style="font-family: Arial; background-color: #ffffff;" /><br style="font-family: Arial; background-color: #ffffff;" /><table border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" style="color: #000000; font-family: Arial; font-size: 14px; border-collapse: collapse;"><tbody><tr><td><p style="margin-right: 5px; margin-left: 5px; padding: 0px; line-height: 21px;"><code>class&nbsp;Y:&nbsp;public&nbsp;enable_shared_from_this&lt;Y&gt;<br />{<br />public:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;Y&gt;&nbsp;f()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;shared_from_this();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />int&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;Y&gt;&nbsp;p(new&nbsp;Y);<br />// 调用f获得shared_ptr<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;Y&gt;&nbsp;q&nbsp;=&nbsp;p-&gt;f();<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(p&nbsp;==&nbsp;q);<br />&nbsp;&nbsp;&nbsp;&nbsp;assert(!(p&nbsp;&lt;&nbsp;q&nbsp;||&nbsp;q&nbsp;&lt;&nbsp;p));&nbsp;// p and q must share ownership<br /><br />}</code></p></td></tr></tbody></table><span style="font-family: Arial; background-color: #ffffff; font-weight: bold;"><br />该类的实现</span><br style="font-family: Arial; background-color: #ffffff;" /><br style="font-family: Arial; background-color: #ffffff;" /><table border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" style="color: #000000; font-family: Arial; font-size: 14px; border-collapse: collapse;"><tbody><tr><td><p style="margin-right: 5px; margin-left: 5px; padding: 0px; line-height: 21px;"><code>template&lt;class&nbsp;T&gt;&nbsp;class&nbsp;enable_shared_from_this<br />{<br />protected:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;enable_shared_from_this()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;enable_shared_from_this(enable_shared_from_this&nbsp;const&nbsp;&amp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;enable_shared_from_this&nbsp;&amp;&nbsp;operator=(enable_shared_from_this&nbsp;const&nbsp;&amp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;*this;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;~enable_shared_from_this()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />public:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;T&gt;&nbsp;shared_from_this()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;T&gt;&nbsp;p(_internal_weak_this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOST_ASSERT(p.get()&nbsp;==&nbsp;this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;T&nbsp;const&gt;&nbsp;shared_from_this()&nbsp;const<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;T&nbsp;const&gt;&nbsp;p(_internal_weak_this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOST_ASSERT(p.get()&nbsp;==&nbsp;this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />// Note: No, you don't need to initialize _internal_weak_this<br /><br />//<br /><br />// Please read the documentation, not the code<br /><br />//<br /><br />// http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;T _internal_element_type;&nbsp;// for bcc 5.5.1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mutable&nbsp;weak_ptr&lt;_internal_element_type&gt;&nbsp;_internal_weak_this;<br />};<br /><br /></code></p></td></tr></tbody></table><span style="font-family: Arial; background-color: #ffffff; font-weight: bold;"><br />结论</span><br style="font-family: Arial; background-color: #ffffff;" /><span style="font-family: Arial; background-color: #ffffff;">这个实用类提供了简单的shared_ptr转换和安全的weak式验证... 这样通过继承就可以使用</span><code style="background-color: #ffffff;">shared_from_this进行安全当前类weak_ptr到shared_ptr的转换...<br /><br /><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><span style="word-wrap: break-word; font-size: 12px;"><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;"><strong style="word-wrap: break-word;">enable_from_this方法的使用与陷阱</strong></span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">enable_from_this 的使用与实现原理说明：</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">shared_from_this()是enable_shared_from_this<t style="word-wrap: break-word;">的成员函数，返回shared_ptr<t style="word-wrap: break-word;">;</t></t></span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">注意的是，这个函数仅在shared_ptr<t style="word-wrap: break-word;">的构造函数被调用之后才能使用。</t></span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">原因是enable_shared_from_this::weak_ptr并不在构造函数中设置，而是在shared_ptr<t style="word-wrap: break-word;">的构造函数中设置。</t></span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">错误的使用代码一：</span></div><div style="word-wrap: break-word;"></div></span></div><table border="1" cellspacing="0" cellpadding="0" bordercolor="#999999" width="95%" bgcolor="#F1F1F1" style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px; border-collapse: collapse;"><tbody style="word-wrap: break-word;"><tr style="word-wrap: break-word;"><td style="word-wrap: break-word; margin: 0px; padding: 0px;"><p style="word-wrap: break-word; margin-right: 5px; margin-left: 5px; padding: 0px; line-height: 24px;"><code style="word-wrap: break-word;"><span style="word-wrap: break-word; color: #000000;">#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>boost/shared_ptr<span style="word-wrap: break-word; color: #0000cc;">.</span>hpp<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>boost/enable_shared_from_this<span style="word-wrap: break-word; color: #0000cc;">.</span>hpp<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>iostream<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />using namespace&nbsp;<span style="word-wrap: break-word; color: #0000ff;">std</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />class D<span style="word-wrap: break-word; color: #0000cc;">:</span>&nbsp;<span style="word-wrap: break-word; color: #0000ff;">public</span>&nbsp;boost<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>enable_shared_from_this<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>D<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />{<br style="word-wrap: break-word;" /><span style="word-wrap: break-word; color: #0000ff;">public</span><span style="word-wrap: break-word; color: #0000cc;">:</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;D<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #ff00ff;">"D::D()"</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>shared_ptr<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>D<span style="word-wrap: break-word; color: #0000cc;">&gt;</span>&nbsp;p&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;shared_from_this<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" />}<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" /><span style="word-wrap: break-word; color: #0000ff;">int</span>&nbsp;main<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><br style="word-wrap: break-word;" />{<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;boost<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>shared_ptr<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>D<span style="word-wrap: break-word; color: #0000cc;">&gt;</span>&nbsp;a<span style="word-wrap: break-word; color: #0000cc;">(</span>new D<span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;return 0<span style="word-wrap: break-word; color: #0000cc;">;</span>&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" />}<br style="word-wrap: break-word;" /></span></code></p></td></tr></tbody></table><br style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px;" /><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">程序编译通过，执行结果如下：</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">D::D()</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">terminate called after throwing an instance of 'boost::exception_detail::clone_impl&nbsp;&gt;'</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">&nbsp;&nbsp;what(): &nbsp;tr1::bad_weak_ptr</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">Aborted</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">说明在D的构造函数中调用shared_from_this(), 此时D的实例本身尚未构造成功，weak_ptr也就尚未设置,所以程序抛出tr1::bad_weak_ptr异常。</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">错误的使用代码二：</span></div><div style="word-wrap: break-word;"></div></div><table border="1" cellspacing="0" cellpadding="0" bordercolor="#999999" width="95%" bgcolor="#F1F1F1" style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px; border-collapse: collapse;"><tbody style="word-wrap: break-word;"><tr style="word-wrap: break-word;"><td style="word-wrap: break-word; margin: 0px; padding: 0px;"><p style="word-wrap: break-word; margin-right: 5px; margin-left: 5px; padding: 0px; line-height: 24px;"><code style="word-wrap: break-word;"><span style="word-wrap: break-word; color: #000000;">#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>boost/shared_ptr<span style="word-wrap: break-word; color: #0000cc;">.</span>hpp<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>boost/enable_shared_from_this<span style="word-wrap: break-word; color: #0000cc;">.</span>hpp<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>iostream<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />using namespace&nbsp;<span style="word-wrap: break-word; color: #0000ff;">std</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />class D<span style="word-wrap: break-word; color: #0000cc;">:</span>&nbsp;<span style="word-wrap: break-word; color: #0000ff;">public</span>&nbsp;boost<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>enable_shared_from_this<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>D<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />{<br style="word-wrap: break-word;" /><span style="word-wrap: break-word; color: #0000ff;">public</span><span style="word-wrap: break-word; color: #0000cc;">:</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;D<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #ff00ff;">"D::D()"</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;}<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;void func<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #ff00ff;">"D::func()"</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>shared_ptr<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>D<span style="word-wrap: break-word; color: #0000cc;">&gt;</span>&nbsp;p&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;shared_from_this<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" />}<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" /><span style="word-wrap: break-word; color: #0000ff;">int</span>&nbsp;main<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><br style="word-wrap: break-word;" />{<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;D d<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;d<span style="word-wrap: break-word; color: #0000cc;">.</span>func<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;return 0<span style="word-wrap: break-word; color: #0000cc;">;</span>&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" />}</span></code></p></td></tr></tbody></table><br style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px;" /><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">程序编译通过，执行结果如下：</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">D::D()</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">D::func()</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">terminate called after throwing an instance of 'boost::exception_detail::clone_impl&nbsp;&gt;'</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">&nbsp;&nbsp;what(): &nbsp;tr1::bad_weak_ptr</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">Aborted</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">失败原因分析：</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">在主函数main中，D的实例是在栈上构造，没有使用boost::shared_ptr<d style="word-wrap: break-word;">&nbsp;的构造方式，</d></span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">所以boost::enable_shared_from_this<d style="word-wrap: break-word;">中的weak_ptr所指的函数对象也就没有被赋值，</d></span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">在调用d.func()中使用shared_from_this()函数时</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">----注：shared_from_this的函数实现 ------</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">&nbsp;&nbsp; &nbsp;shared_ptr<t style="word-wrap: break-word;">&nbsp;shared_from_this()</t></span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">&nbsp;&nbsp; &nbsp;{</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;shared_ptr<t style="word-wrap: break-word;">&nbsp;p( weak_this_ );</t></span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;BOOST_ASSERT( p.get() == this );</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return p;</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">&nbsp;&nbsp; &nbsp;}</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">----注：shared_from_this的函数实现 ------</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">调用BOOST_ASSERT( p.get() == this ); &nbsp;失败，抛出以上异常。</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">最后，我们给出share_from_this()的正确使用例子:</span></div><div style="word-wrap: break-word;"></div><div style="word-wrap: break-word;"></div></div><table border="1" cellspacing="0" cellpadding="0" bordercolor="#999999" width="95%" bgcolor="#F1F1F1" style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px; border-collapse: collapse;"><tbody style="word-wrap: break-word;"><tr style="word-wrap: break-word;"><td style="word-wrap: break-word; margin: 0px; padding: 0px;"><p style="word-wrap: break-word; margin-right: 5px; margin-left: 5px; padding: 0px; line-height: 24px;"><code style="word-wrap: break-word;"><span style="word-wrap: break-word; color: #000000;">#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>boost/shared_ptr<span style="word-wrap: break-word; color: #0000cc;">.</span>hpp<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>boost/enable_shared_from_this<span style="word-wrap: break-word; color: #0000cc;">.</span>hpp<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />#<span style="word-wrap: break-word; color: #ff0000;">include</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>iostream<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />using namespace&nbsp;<span style="word-wrap: break-word; color: #0000ff;">std</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />class D<span style="word-wrap: break-word; color: #0000cc;">:</span>&nbsp;<span style="word-wrap: break-word; color: #0000ff;">public</span>&nbsp;boost<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>enable_shared_from_this<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>D<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" />{<br style="word-wrap: break-word;" /><span style="word-wrap: break-word; color: #0000ff;">public</span><span style="word-wrap: break-word; color: #0000cc;">:</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;D<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #ff00ff;">"D::D()"</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;}<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;void func<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #ff00ff;">"D::func()"</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>shared_ptr<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>D<span style="word-wrap: break-word; color: #0000cc;">&gt;</span>&nbsp;p&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;shared_from_this<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" />}<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" /><span style="word-wrap: break-word; color: #0000ff;">int</span>&nbsp;main<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><br style="word-wrap: break-word;" />{<br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;boost<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>shared_ptr<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>D<span style="word-wrap: break-word; color: #0000cc;">&gt;</span>&nbsp;p<span style="word-wrap: break-word; color: #0000cc;">(</span>new D<span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;p<span style="word-wrap: break-word; color: #0000cc;">-</span><span style="word-wrap: break-word; color: #0000cc;">&gt;</span>func<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;&nbsp;return 0<span style="word-wrap: break-word; color: #0000cc;">;</span>&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" />}&nbsp;&nbsp;&nbsp;&nbsp;</span></code></p></td></tr></tbody></table><br style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px;" /><div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">执行结果:</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">D::D()</span></div><div style="word-wrap: break-word;"><span style="word-wrap: break-word; font-size: 13px;">D::func()</span><span style="word-wrap: break-word; white-space: pre;"><span style="word-wrap: break-word; font-size: 13px;">	</span></span></div><div><span style="word-wrap: break-word; white-space: pre;"><span style="word-wrap: break-word; font-size: 13px;"><br /></span></span></div></div></code><img src ="http://www.cppblog.com/API/aggbug/214732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2017-03-07 14:17 <a href="http://www.cppblog.com/API/archive/2017/03/07/214732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ 11std::bind std::function 高级用法</title><link>http://www.cppblog.com/API/archive/2016/06/13/213695.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Mon, 13 Jun 2016 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2016/06/13/213695.html</guid><wfw:comment>http://www.cppblog.com/API/comments/213695.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2016/06/13/213695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/213695.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/213695.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">/*</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;*&nbsp;File:&nbsp;&nbsp;&nbsp;main.cpp<br />
&nbsp;*&nbsp;Author:&nbsp;Vicky.H<br />
&nbsp;*&nbsp;Email:&nbsp;&nbsp;eclipser@163.com<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
#include&nbsp;&lt;iostream&gt;<br />
#include&nbsp;&lt;functional&gt;<br />
#include&nbsp;&lt;typeinfo&gt;<br />
#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;add1(<span style="color: #0000FF; ">int</span>&nbsp;i,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;k)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;i&nbsp;+&nbsp;j&nbsp;+&nbsp;k;<br />
}<br />
<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;Utils&nbsp;{<br />
<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;Utils(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(_name,&nbsp;name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHello(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;name)&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;_name&nbsp;&lt;&lt;&nbsp;"&nbsp;say:&nbsp;hello&nbsp;"&nbsp;&lt;&lt;&nbsp;name&nbsp;&lt;&lt;&nbsp;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;10001;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;<span style="color: #0000FF; ">operator</span>()(<span style="color: #0000FF; ">int</span>&nbsp;i,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;k)&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;i&nbsp;+&nbsp;j&nbsp;+&nbsp;k;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;_name[32];<br />
};<br />
<br />
<br />
<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">void</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;绑定全局函数</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;add2&nbsp;=&nbsp;std::bind(add1,&nbsp;std::placeholders::_1,&nbsp;std::placeholders::_2,&nbsp;10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;函数add2&nbsp;=&nbsp;绑定add1函数，参数1不变，参数2不变，参数3固定为10.</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;typeid(add2).name()&nbsp;&lt;&lt;&nbsp;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"add2(1,2)&nbsp;=&nbsp;"&nbsp;&lt;&lt;&nbsp;add2(1,&nbsp;2)&nbsp;&lt;&lt;&nbsp;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"\n---------------------------"&nbsp;&lt;&lt;&nbsp;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;绑定成员函数</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;Utils&nbsp;utils("Vicky");<br />
&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;sayHello&nbsp;=&nbsp;std::bind(&amp;Utils::sayHello,&nbsp;utils<span style="color: #008000; ">/*</span><span style="color: #008000; ">调用者</span><span style="color: #008000; ">*/</span>,&nbsp;std::placeholders::_1<span style="color: #008000; ">/*</span><span style="color: #008000; ">参数1</span><span style="color: #008000; ">*/</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sayHello("Jack");<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;sayHelloToLucy&nbsp;=&nbsp;std::bind(&amp;Utils::sayHello,&nbsp;utils<span style="color: #008000; ">/*</span><span style="color: #008000; ">调用者</span><span style="color: #008000; ">*/</span>,&nbsp;"Lucy"<span style="color: #008000; ">/*</span><span style="color: #008000; ">固定参数1</span><span style="color: #008000; ">*/</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sayHelloToLucy();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;绑定静态成员函数</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;getId&nbsp;=&nbsp;std::bind(&amp;Utils::getId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;getId()&nbsp;&lt;&lt;&nbsp;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"\n---------------------------"&nbsp;&lt;&lt;&nbsp;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;绑定operator函数</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;add100&nbsp;=&nbsp;std::bind(&amp;Utils::<span style="color: #0000FF; ">operator</span>&nbsp;(),&nbsp;utils,&nbsp;std::placeholders::_1,&nbsp;std::placeholders::_2,&nbsp;100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"add100(1,&nbsp;2)&nbsp;=&nbsp;"&nbsp;&lt;&lt;&nbsp;add100(1,&nbsp;2)&nbsp;&lt;&lt;&nbsp;std::endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;注意：无法使用std::bind()绑定一个重载函数</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div>
<br />
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;*&nbsp;File:&nbsp;&nbsp;&nbsp;main2.cpp<br />
&nbsp;*&nbsp;Author:&nbsp;Vicky.H<br />
&nbsp;*&nbsp;Email:&nbsp;&nbsp;eclipser@163.com<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
#include&nbsp;&lt;iostream&gt;<br />
#include&nbsp;&lt;typeinfo&gt;<br />
<br />
<br />
<span style="color: #0000FF; ">void</span>&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Hello&nbsp;world&nbsp;!"&nbsp;&lt;&lt;&nbsp;std::endl;<br />
}<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;sum(<span style="color: #0000FF; ">int</span>&nbsp;i,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;k)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;i&nbsp;+&nbsp;j&nbsp;+&nbsp;k;<br />
}<br />
<br />
template&nbsp;&lt;typename&nbsp;T&gt;<br />
<span style="color: #0000FF; ">class</span>&nbsp;Func&nbsp;{<br />
<span style="color: #0000FF; ">public</span>:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Func(T&nbsp;fun)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!fun)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;"fun&nbsp;nullptr";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_fun&nbsp;=&nbsp;fun;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;R,&nbsp;typename&nbsp;A1,&nbsp;typename&nbsp;A2,&nbsp;typename&nbsp;A3,&nbsp;typename&nbsp;A4,&nbsp;typename&nbsp;A5&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;Call(A1&nbsp;a1,&nbsp;A2&nbsp;a2,&nbsp;A3&nbsp;a3,&nbsp;A4&nbsp;a4,&nbsp;A5&nbsp;a5)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_fun(a1,&nbsp;a2,&nbsp;a3,&nbsp;a4,&nbsp;a5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;R,&nbsp;typename&nbsp;A1,&nbsp;typename&nbsp;A2,&nbsp;typename&nbsp;A3,&nbsp;typename&nbsp;A4&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;Call(A1&nbsp;a1,&nbsp;A2&nbsp;a2,&nbsp;A3&nbsp;a3,&nbsp;A4&nbsp;a4)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_fun(a1,&nbsp;a2,&nbsp;a3,&nbsp;a4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;R,&nbsp;typename&nbsp;A1,&nbsp;typename&nbsp;A2,&nbsp;typename&nbsp;A3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;Call(A1&nbsp;a1,&nbsp;A2&nbsp;a2,&nbsp;A3&nbsp;a3)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_fun(a1,&nbsp;a2,&nbsp;a3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;R,&nbsp;typename&nbsp;A1,&nbsp;typename&nbsp;A2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;Call(A1&nbsp;a1,&nbsp;A2&nbsp;a2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_fun(a1,&nbsp;a2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;R,&nbsp;typename&nbsp;A1&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;Call(A1&nbsp;a1)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_fun(a1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;R&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;Call()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_fun();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Call()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_fun();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;_fun;<br />
};<br />
<br />
#include&nbsp;&lt;functional&gt;<br />
<br />
template&lt;typename&nbsp;R&nbsp;=&nbsp;<span style="color: #0000FF; ">void</span>,&nbsp;typename<img src="http://www.cppblog.com/Images/dot.gif" alt="" />&nbsp;Args&gt;<br />
<span style="color: #0000FF; ">class</span>&nbsp;Fn&nbsp;{<br />
<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;Fn(std::function&lt;R(Args<img src="http://www.cppblog.com/Images/dot.gif" alt="" />)&gt;&nbsp;fun)&nbsp;:&nbsp;_fun(fun)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;<span style="color: #0000FF; ">operator</span>()(Args<img src="http://www.cppblog.com/Images/dot.gif" alt="" />&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;_fun(args<img src="http://www.cppblog.com/Images/dot.gif" alt="" />);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::function&lt;R(Args<img src="http://www.cppblog.com/Images/dot.gif" alt="" />)&nbsp;&gt;&nbsp;_fun;<br />
};<br />
<br />
<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;将函数注册到对象中，通过对象直接调用<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">void</span>)&nbsp;{<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Func&lt;<span style="color: #0000FF; ">void</span>(*)()&nbsp;&gt;&nbsp;sayHelloFunc(sayHello);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sayHelloFunc.Call();<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Func&lt;<span style="color: #0000FF; ">int</span>&nbsp;(*)(<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;&gt;&nbsp;sumFunc(sum);<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"sumFunc.Call&lt;int&gt;(1,&nbsp;2,&nbsp;3)&nbsp;:&nbsp;"&nbsp;&lt;&lt;&nbsp;sumFunc.Call&lt;<span style="color: #0000FF; ">int</span>&gt;(1,&nbsp;2,&nbsp;3)&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"\n---------------------------"&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Fn&lt;&gt;&nbsp;sayHelloFn(sayHello);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sayHelloFn();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Fn&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;sumFn(sum);<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"sumFn(1,&nbsp;2,&nbsp;3)&nbsp;:&nbsp;"&nbsp;&lt;&lt;&nbsp;sumFn(1,&nbsp;2,&nbsp;3)&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"\n---------------------------"&nbsp;&lt;&lt;&nbsp;std::endl;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div><br /><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">Hello world !<br />sumFunc.Call&lt;int&gt;(1, 2, 3) : 6<br /><br /><br />---------------------------<br />Hello world !<br />sumFn(1, 2, 3) : 6<br /><br /><br />---------------------------<br /></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">上面的例子非常有趣，使用了2种方案，将一个函数，注册到一个对象/仿函数中，并且通过一个对象/仿函数来直接调用调用。<br />例子显而易见的，第2种方案更佳简洁，并且对传递参数有明确的判断，当参数类型或数量不正确的时候，编译器将导致失败。<br />这种方案，可以将类的成员变量直接作为函数的参数使用，或者，如我：<br />http://blog.csdn.net/eclipser1987/article/details/23926395<br />这篇文章中，无法直接调用脚本函数类，有了好的解决办法。这个我将随后补充。<br /></p><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 />-->#include&nbsp;&lt;list&gt;<br />#include&nbsp;&lt;functional&gt;<br /><br />template&lt;typename<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;Args&gt;<br /><span style="color: #0000FF; ">class</span>&nbsp;Fns<br />{<br /><span style="color: #0000FF; ">private</span>:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::list&lt;std::function&lt;<span style="color: #0000FF; ">void</span>(Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&gt;&nbsp;&gt;&nbsp;_calls;<br /><br /><span style="color: #0000FF; ">public</span>:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~Fns()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_calls.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;connect(std::function&lt;<span style="color: #0000FF; ">void</span>(Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&gt;&nbsp;fct)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_calls.push_back(fct);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;Object&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;connect(Object*&nbsp;<span style="color: #0000FF; ">object</span>,&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(Object::*method)(Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_calls.push_back([<span style="color: #0000FF; ">object</span>,method](Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;args){(*<span style="color: #0000FF; ">object</span>.*method)(args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />);});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;Object&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;connect(Object*&nbsp;<span style="color: #0000FF; ">object</span>,&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(Object::*method)(Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;<span style="color: #0000FF; ">const</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_calls.push_back([<span style="color: #0000FF; ">object</span>,method](Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;args){(*<span style="color: #0000FF; ">object</span>.*method)(args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />);});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;Object&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;connect(<span style="color: #0000FF; ">const</span>&nbsp;Object*&nbsp;<span style="color: #0000FF; ">object</span>,&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(Object::*method)(Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)&nbsp;<span style="color: #0000FF; ">const</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_calls.push_back([<span style="color: #0000FF; ">object</span>,method](Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;args){(*<span style="color: #0000FF; ">object</span>.*method)(args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />);});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;emit(Args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(auto&nbsp;call&nbsp;:&nbsp;_calls)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call(args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};</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 />-->#include&nbsp;&lt;cstdio&gt;<br />#include&nbsp;"Signal.hpp"<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Foo<br />{<br /><span style="color: #0000FF; ">public</span>:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;bar(<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Foo::bar(%d,&nbsp;%d)\n",&nbsp;x,&nbsp;y);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;foobar(<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("foobar(%d,&nbsp;%d)\n",&nbsp;x,&nbsp;y);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">void</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;foo;<br />&nbsp;&nbsp;&nbsp;&nbsp;Fns&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;s;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Connect&nbsp;a&nbsp;function</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;s.connect(foobar);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Connect&nbsp;a&nbsp;class&nbsp;method</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;s.connect(&amp;foo,&nbsp;&amp;Foo::bar);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;and&nbsp;connect&nbsp;some&nbsp;lambda&nbsp;expression</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;s.connect([&amp;foo](<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("lambda::");&nbsp;foo.bar(x,&nbsp;y);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Emit&nbsp;the&nbsp;signal&nbsp;!</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;s.emit(4,&nbsp;2);<br />&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">foobar(4, 2)</span><br style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">Foo::bar(4, 2)</span><br style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">lambda::Foo::bar(4, 2)</span></div><img src ="http://www.cppblog.com/API/aggbug/213695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2016-06-13 15:39 <a href="http://www.cppblog.com/API/archive/2016/06/13/213695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>10个C++11特性</title><link>http://www.cppblog.com/API/archive/2015/12/02/212389.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Wed, 02 Dec 2015 02:16:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2015/12/02/212389.html</guid><wfw:comment>http://www.cppblog.com/API/comments/212389.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2015/12/02/212389.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/212389.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/212389.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 在C++11之前，auto关键字用来指定存储期。在新标准中，它的功能变为类型推断。auto现在成了一个类型的占位符，通知编译器去根据初始化代码推断所声明变量的真实类型。各种作用域内声明变量都可以用到它。例如，名空间中，程序块中，或是for循环的初始化语句中。?123auto&nbsp;i&nbsp;=&nbsp;42;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/API/archive/2015/12/02/212389.html'>阅读全文</a><img src ="http://www.cppblog.com/API/aggbug/212389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2015-12-02 10:16 <a href="http://www.cppblog.com/API/archive/2015/12/02/212389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的explicit关键字</title><link>http://www.cppblog.com/API/archive/2014/11/24/208947.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Mon, 24 Nov 2014 06:34:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2014/11/24/208947.html</guid><wfw:comment>http://www.cppblog.com/API/comments/208947.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2014/11/24/208947.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/208947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/208947.html</trackback:ping><description><![CDATA[<div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">在C++程序中很少有人去使用explicit关键字，不可否认，在平时的实践中确实很少能用的上。再说C++的功能强大，往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的，而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性，我想在有些时候这种特性将会非常有用。</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">按默认规定，只用传一个参数的构造函数也定义了一个隐式转换。举个例子：</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">（下面这个CExample没有什么实际的意义，主要是用来说明问题）</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">//Example.h</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">#pragma once</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">class CExample</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">{</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">public:</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample(void);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">public:</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">~CExample(void);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;"></div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">public:</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">int m_iFirst;</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">int m_iSecond;</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">public:</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample(int iFirst, int iSecond = 4);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">};</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">//Example.cpp</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">#include "StdAfx.h"</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">#include "Example.h"</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample::CExample(void)</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">: m_iFirst(0)</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">{</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">}</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample::~CExample(void)</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">{</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">}</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample::CExample(int iFirst, int iSecond):m_iFirst(iFirst), m_iSecond(iSecond)</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">{</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">}</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">//TestExplicitKey.cpp</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">...//其它头文件</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">#include "Example.h"</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">int _tmain(int argc, _TCHAR* argv[])</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">{</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample objOne; //调用没有参数的构造函数</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample objTwo(12, 12); //调用有两个参数的构造函数</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample objThree(12); //同上，可以传一个参数是因为该构造函数的第二个参数有默认值</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">CExample objFour = 12;&nbsp;//执行了隐式转换,等价于CExample temp(12);objFour(temp);注意这个地方调用了</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">//编译器为我们提供的默认复制构造函数</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">return 0;</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">}</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">如果在构造函数声明中加入关键字explicit，如下</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">explicit CExample(int iFirst, int iSecond = 4);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">那么CExample objFour = 12; 这条语句将不能通过编译。在vs05下的编译错误提示如下</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">error C2440: 'initializing' : cannot convert from 'int' to 'CExample'</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor for class 'CExample' is declared 'explicit'</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">对于某些类型，这一情况非常理想。但在大部分情况中，隐式转换却容易导致错误（不是语法错误，编译器不会报错）。隐式转换总是在我们没有察觉的情况下悄悄发生，除非有心所为，隐式转换常常是我们所不希望发生的。通过将构造函数声明为explicit（显式）的方式可以抑制隐式转换。也就是说，explicit构造函数必须显式调用。</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">引用一下Bjarne Stroustrup的例子:</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">class String{</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;explicit String(int n);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String(const char *p);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">};</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">String s1 = 'a'; //错误：不能做隐式char-&gt;String转换</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">String s2(10);&nbsp;&nbsp; //可以：调用explicit String(int n);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">String s3 = String(10);//可以：调用explicit String(int n);再调用默认的复制构造函数</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">String s4 = "Brian"; //可以：隐式转换调用String(const char *p);再调用默认的复制构造函数</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">String s5("Fawlty"); //可以：正常调用String(const char *p);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">void f(String);</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;"></div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">String g()</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">{</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;f(10); //错误：不能做隐式int-&gt;String转换</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;f("Arthur"); //可以：隐式转换，等价于f(String("Arthur"));</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;return 10; //同上</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">}</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">在实际代码中的东西可不像这种故意造出的例子。</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">发生隐式转换，除非有心利用，隐式转换常常带来程序逻辑的错误，而且这种错误一旦发生是很难察觉的。</div><div style="color: #333333; font-family: Arial; font-size: 13.63636302947998px; line-height: 25.99431800842285px; background-color: #ffffff;">原则上应该在所有的构造函数前加explicit关键字，当你有心利用隐式转换的时候再去解除explicit，这样可以大大减少错误的发生。</div><img src ="http://www.cppblog.com/API/aggbug/208947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2014-11-24 14:34 <a href="http://www.cppblog.com/API/archive/2014/11/24/208947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++基础要点(9-15点)</title><link>http://www.cppblog.com/API/archive/2014/11/14/208876.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 14 Nov 2014 06:00:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2014/11/14/208876.html</guid><wfw:comment>http://www.cppblog.com/API/comments/208876.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2014/11/14/208876.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/208876.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/208876.html</trackback:ping><description><![CDATA[<span style="color: red;">9. 若不想使用编译器自动生成的函数，就该明确的拒绝</span><br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#include&nbsp;"stdafx.h"<br />
#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />
<br />
<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;&nbsp;std;<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;UnCopyAble<br />
{<br />
<span style="color: #0000FF; ">protected</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;UnCopyAble(){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;~UnCopyAble(){}<br />
<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">放入private，则不允许使用拷贝构造和对象间赋值<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">即使不慎在&nbsp;membre或friend中使用，则链接通不过。<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">原因是只有声明</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;UnCopyAble(<span style="color: #0000FF; ">const</span>&nbsp;UnCopyAble&amp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;UnCopyAble&amp;&nbsp;<span style="color: #0000FF; ">operator</span>=(<span style="color: #0000FF; ">const</span>&nbsp;UnCopyAble&nbsp;&amp;);<br />
};<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;HomeForSale&nbsp;:&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;UnCopyAble&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">class&nbsp;不再声明copy构造函数和赋值重载</span><span style="color: #008000; "><br />
</span>{<br />
<span style="color: #0000FF; ">public</span>:<br />
<br />
};<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;HomeForSale&nbsp;sale1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">以下将不允许</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;HomeForSale&nbsp;sale2(sale1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">以下将不允许</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;HomeForSale&nbsp;sale3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;sale3&nbsp;=&nbsp;sale1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div>
<span style="color: red;">10.为多态基类声明virtual析构函数<br />
&nbsp; &nbsp;<br />
</span>&nbsp; &nbsp;总结：带有多态性质的基类应该声明一个virtual析构函数。如果class带有任何virutal，它也应该拥有一个virtual析构函数。<br />
class设计目的不是作为基类来使用的，或不是为了具备多态性，就不应该声明virutal析构函数(一个类如果加入了virutal函数，则类大小<br />
会发生变化。因为有包含virutal table pointer)。<br />
<br />
<span style="color: #ff0000;">11. 别让异常逃离析构函数<br />
&nbsp; </span>&nbsp;析构函数绝对不要吐出异常，这样会带来&#8220;过早结束程序&#8221;或&#8220;发生不明确行为&#8221;。如果一个析构函数可能要抛出异常，析构函数应该捕捉任何异常，然后吞下<br />
它，或者结束程序。如果要在某个函数运行时抛出的异常做出反应，那么class应该提供一个普通函数执行这个操作。例如下：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">class</span>&nbsp;DBConn<br />
{<br />
<span style="color: #0000FF; ">public</span>:<br />
<br />
&nbsp;&nbsp;&nbsp;&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; ">void</span>&nbsp;Close()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closed&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;~DBConn()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!closed)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><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;db.close();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">关闭连接，如果客户不调用Close的话</span><span style="color: #008000; "><br />
</span>&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;<span style="color: #0000FF; ">catch</span>&nbsp;(<img src="http://www.cppblog.com/Images/dot.gif" alt="" />)<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;<span style="color: #008000; ">//</span><span style="color: #008000; ">写入日志，记下close调用失败</span><span style="color: #008000; "><br />
</span>&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 />
<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;DBConnection&nbsp;db;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;closed;</div>
<span style="color: #ff0000;">12. 绝不在构造和析构过程中调用virtual函数<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: #008000; ">//</span><span style="color: #008000; ">&nbsp;testss.cpp&nbsp;:&nbsp;定义控制台应用程序的入口点。<br />
</span><span style="color: #008000; ">//<br />
</span><br />
#include&nbsp;"stdafx.h"<br />
#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />
#include&nbsp;&lt;list&gt;<br />
<br />
<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;&nbsp;std;<br />
<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;Transaction<br />
{<br />
<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;Transaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;logTranscation()&nbsp;=&nbsp;0;<br />
<br />
};<br />
<br />
Transaction::Transaction()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;init();<br />
}<br />
<br />
<span style="color: #0000FF; ">void</span>&nbsp;Transaction::init()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;logTranscation();<br />
}<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;BuyTransaction&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Transaction<br />
{<br />
<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;logTranscation()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("BuyTransaction&nbsp;log<img src="http://www.cppblog.com/Images/dot.gif" alt="" />\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
};<br />
<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;BuyTransaction&nbsp;b;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div>以上代码，会有一个BuyTransaction构造函数被调用，但首先是Transaction更早被调用。在derived class对象的base class构造期间，对象的类型是base class.若使用运行期类型信息，也会把对象视为base class类型。本例，构造函数中调用init,而init中调用Transaction::logTransaction。而logTransaction又是抽象方法，导致程序异常中止。当然如果非抽象方法，则会调用Transaction中的logTransaction。<br /><br />&nbsp; &nbsp; 同样，析构函数，一旦derived class析构函数先开始执行。对象内的derived class成员变量便呈现现未定义值。所以c++视它们不存在。进入base class析构函数后对象就成为一个base class对象。<br /><span style="color: #ff0000;"><br />13. 令operator=返回一个reference to *this<br /></span><span style="color: #ff0000;">14. 在operator=中处理&#8220;自我赋值&#8221;<br /></span><span style="color: #ff0000;">&nbsp; &nbsp;<br /></span><img src ="http://www.cppblog.com/API/aggbug/208876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2014-11-14 14:00 <a href="http://www.cppblog.com/API/archive/2014/11/14/208876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++基础要点(1-8点)</title><link>http://www.cppblog.com/API/archive/2014/11/14/208875.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 14 Nov 2014 05:29:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2014/11/14/208875.html</guid><wfw:comment>http://www.cppblog.com/API/comments/208875.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2014/11/14/208875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/208875.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/208875.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; ">&nbsp;testss.cpp&nbsp;:&nbsp;定义控制台应用程序的入口点。<br /></span><span style="color: #008000; ">//<br /></span><br />#include&nbsp;"stdafx.h"<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;&nbsp;std;<br /><span style="color: #0000FF; ">char</span>&amp;&nbsp;testfun(<span style="color: #0000FF; ">char</span>&nbsp;&amp;m)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m;<br />}<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;CTextBlock<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;length()&nbsp;<span style="color: #0000FF; ">const</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;&amp;<span style="color: #0000FF; ">operator</span>[](<span style="color: #0000FF; ">int</span>&nbsp;pos)&nbsp;<span style="color: #0000FF; ">const</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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; ">return</span>&nbsp;pText[pos];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&amp;&nbsp;<span style="color: #0000FF; ">operator</span>[](<span style="color: #0000FF; ">int</span>&nbsp;pos)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;const_cast&lt;<span style="color: #0000FF; ">char</span>&amp;&gt;(&nbsp;static_cast&lt;<span style="color: #0000FF; ">const</span>&nbsp;CTextBlock&gt;(*<span style="color: #0000FF; ">this</span>)[pos]&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*pText;<br />&nbsp;&nbsp;&nbsp;&nbsp;mutable&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;textLength;&nbsp;<span style="color: #008000; ">//<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;mutable&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;lengthIsValid;<br />};<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;CTextBlock::length()&nbsp;<span style="color: #0000FF; ">const</span><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!lengthIsValid)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textLength&nbsp;=&nbsp;strlen(pText);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lengthIsValid&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;textLength;<br />}<br /><br /><br />template&lt;<span style="color: #0000FF; ">class</span>&nbsp;T&gt;<br /><span style="color: #0000FF; ">class</span>&nbsp;NameObject{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;NameObject(<span style="color: #0000FF; ">string</span>&nbsp;&amp;name,<span style="color: #0000FF; ">const</span>&nbsp;T&amp;value):nameValue(name),objectValue(value)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;&amp;nameValue;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;T&nbsp;objectValue;<br />};<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />{<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">1.const位置使用<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">以下a1,a2等同</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a1&nbsp;=&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;a2=10;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">以下b1,b2等同</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;*b1&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*b2&nbsp;=&nbsp;NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">指针c不允许改变</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;c&nbsp;=&nbsp;NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">2.返回引用问题<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">必需返回char&nbsp;&amp;，否则返回char则不能被赋值</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;m&nbsp;=&nbsp;'a';<br />&nbsp;&nbsp;&nbsp;&nbsp;testfun(m)&nbsp;=&nbsp;'p';<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">3.mutable(可变的)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;CTextBlock&nbsp;textBlock;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">在length中用mutable修饰textLength和lengthIsValid，<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">所以const函数length才可以访问非const成员变量</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;textBlock.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">4.调用非const[]时，调用const类型的[]重载<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">详细请参见[]重载</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&amp;&nbsp;pChar=textBlock[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;CTextBlock&nbsp;textBlock2;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&amp;&nbsp;tChar&nbsp;=&nbsp;textBlock2[0];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">5.类的成员，尽可能的使用初始化列表一一初始化,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">比赋值效率更高，也可以预防不明确行为的潘多拉盒子<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">父类比子类先初始化，类成员初始化顺序是按变量声明的顺序，<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">即使初始化成员列表用其他顺序。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">6.为避免&#8220;跨编译单元之初始化次序&#8221;问题，请以local&nbsp;static对象替换<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">non-local的static对象(local&nbsp;static即函数内的,其他的称为non-local&nbsp;static)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">例如，单件返回static&nbsp;对象引用的方法<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">7.编译器自动生成构造函数，拷贝构造，=运算符重载，非virtual的析构函数。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果有编写构造函数时，编译器不会自动生成默认构造和拷贝构造函数。同样定义<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">拷贝构造也不会生成默认构造函数，但会生成=,析构函数（&nbsp;但在有被使用的时候才会生成）<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">8.编译器自动生成&#8220;=&#8221;运算符重载时的特殊问题</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;newDog("persephone");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;oldDog("stach");<br />&nbsp;&nbsp;&nbsp;&nbsp;NameObject&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;p(newDog,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;NameObject&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;s(oldDog,36);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">以下这种情况编译器是不会自动生成赋值&#8220;=&#8221;构造的,原因是<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">在一个内含引用成员的或const成员时，编译器不知道如何自动生成<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">赋值函数内的实现。还有一种情况是，如果</span><span style="color: #008000;">将</span><span style="color: #008000; ">父类"="函数定义为private<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">编译器同样在子类中不会自动生成赋值函数。</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;s;//该行语法错误<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/API/aggbug/208875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2014-11-14 13:29 <a href="http://www.cppblog.com/API/archive/2014/11/14/208875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> _set_invalid_parameter_handler异常处理函数</title><link>http://www.cppblog.com/API/archive/2014/09/13/208304.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sat, 13 Sep 2014 02:33:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2014/09/13/208304.html</guid><wfw:comment>http://www.cppblog.com/API/comments/208304.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2014/09/13/208304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/208304.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/208304.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">VS2005之后的版本，微软增加了一些新的异常机制，新机制在出现错误时默认不通知应用程序，这时程序就崩溃了。</span><br style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">所以这种情况下，必须调用_set_invalid_parameter_handler、_set_purecall_handler设置自己的异常处理函数。</span><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">以下示例代码：</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">// test.cpp<br />// compile with: /Zi /MTd<br />// C++ Exceptions : /EHa</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">void myInvalidParameterHandler(const wchar_t* expression,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const wchar_t* function,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const wchar_t* file,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int line,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uintptr_t pReserved)<br />{<br />&nbsp;// function、file、line在Release下无效<br />&nbsp;wprintf(L"Invalid parameter detected in function %s."<br />&nbsp;&nbsp;L" File: %s Line: %d\n", function, file, line);<br />&nbsp;wprintf(L"Expression: %s\n", expression);<br />&nbsp;// 必须抛出异常，否则无法定位错误位置<br />&nbsp;throw 1;<br />}<br />void myPurecallHandler(void)<br />{<br />&nbsp;printf("In _purecall_handler.");<br />&nbsp;// 必须抛出异常，否则无法定位错误位置<br />&nbsp;throw 1;<br />}</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">int main()<br />{<br />&nbsp;char* formatString;<br />&nbsp;_invalid_parameter_handler oldHandler;<br />&nbsp;_purecall_handler old_pure_handle;</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">&nbsp;oldHandler = _set_invalid_parameter_handler(myInvalidParameterHandler);<br />&nbsp;old_pure_handle = _set_purecall_handler(myPurecallHandler);</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">&nbsp;try<br />&nbsp;{<br />&nbsp;&nbsp;formatString = NULL;<br />&nbsp;&nbsp;printf(formatString);&nbsp;&nbsp;// 发生异常<br />&nbsp;}<br />&nbsp;catch(...)<br />&nbsp;{<br />&nbsp;&nbsp;// 定位错误位置，输出log<br />&nbsp;&nbsp;printf("catch");<br />&nbsp;}</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">&nbsp;getchar();<br />}</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">说明：<br />1、由于formatString是空指针，printf(formatString)发生异常，这时CRT会调用myInvalidParameterHandler进行处理；<br />2、myInvalidParameterHandler抛出异常。注意，function、file、line在Release下无效，所以必须抛出异常，否则无法定位错误代码；<br />3、设置工程选项C++ Exceptions : /EHa，让catch抓住myInvalidParameterHandler抛出的异常，再做相应的处理；</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;">注意：如果myInvalidParameterHandler不抛出异常，那程序会往下执行，那么可能会发生更糟糕的情况。因此，建议抛出异常，中止执行后续的代码。</p><img src ="http://www.cppblog.com/API/aggbug/208304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2014-09-13 10:33 <a href="http://www.cppblog.com/API/archive/2014/09/13/208304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可变参数</title><link>http://www.cppblog.com/API/archive/2013/08/19/202633.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Mon, 19 Aug 2013 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/08/19/202633.html</guid><wfw:comment>http://www.cppblog.com/API/comments/202633.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/08/19/202633.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/202633.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/202633.html</trackback:ping><description><![CDATA[<p>几天前，在CSDN论坛看到这么一则讨论：<font color="#0000ff">在宏定义中怎么使用可变参数？</font>(<a href="http://expert.csdn.net/Expert/topic/2925/2925165.xml">http://expert.csdn.net/Expert/topic/2925/2925165.xml</a>)。楼主希望能定义这样的macro：</p>
<p><font face="Courier New">#define fun1(a, b, ...) fun2(__FILE__, __LINE__, a, b, ...)</font></p>
<p>我猜楼主是想写trace，如果不能使用可变参数的macro，那么就得像MFC那样写一堆TRACE macros：</p>
<p><br /><font size="2" face="Courier New">// 取自 MFC 7.1 的 afx.h<br />// The following trace macros are provided for <font color="#0000ff">backward compatiblity</font><br />// (they also take a fixed number of parameters which provides<br />// some amount of extra error checking)<br />#define TRACE0(sz) TRACE(_T("%s"), _T(sz))<br />#define TRACE1(sz, p1) TRACE(_T(sz), p1)<br />#define TRACE2(sz, p1, p2) TRACE(_T(sz), p1, p2)<br />#define TRACE3(sz, p1, p2, p3) TRACE(_T(sz), p1, p2, p3)</font></p>
<p>太丑陋了！还好，C99标准支持Variadic Macros，在GCC中，可以这么写：</p>
<p><font face="Courier New">// </font><a href="http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html"><font face="Courier New">http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html</font></a><br /><font face="Courier New">#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)</font></p>
<p>还可以顺便打印文件名和行号：</p>
<p><font face="Courier New">#define debug(format, ...) do {/<br />fprintf(stderr, "%s (%d): ", __FILE__, __LINE__);/<br />fprintf(stderr, format, __VA_ARGS__);/<br />} while (0)</font></p>
<p>但可惜Visual C++ 7.1还不支持这项功能:( 不过我们在C++中至少可以绕弯解决，做到<font color="#0000ff">既能自动记录文件名和行号，又能使用变长参数调用</font>。这个办法不是我独创的，实际上ATL的<font face="Courier New">atltrace.h</font>中就有它的实现(<font face="Courier New">CtraceFileAndLineInfo</font> class)，我在Code Project也找到了相同的实现(<a href="http://www.codeproject.com/debug/location_trace.asp">http://www.codeproject.com/debug/location_trace.asp</a>)，甚至在CUJ的C++ Experts Forum 也能看到相近的做法(<a href="http://www.cuj.com/documents/s=8250/cujcexp2106alexandr/">http://www.cuj.com/documents/s=8250/cujcexp2106alexandr/</a>)，当然Alexandrescu的办法技巧性更强。</p>
<p>思路：写一个重载了 operator() 的class，令 TRACE 宏返回该class的一个object：</p>
<p><font size="2" face="Courier New">#include <stdarg.h><br />#include <stdio.h></stdio.h></stdarg.h></font></p>
<p><font size="2" face="Courier New">#ifndef NDEBUG // debug mode</font></p>
<p><font size="2" face="Courier New">class tracer<br />{<br />public:<br />tracer(const char* file, int line)<br />: file_(file), line_(line)<br />{}<br /><br />void <font color="#0000ff">operator()</font><font color="#000000">(</font>const char* fmt, <font color="#0000ff">...</font>)<br />{<br />va_list ap;<br /><br />// print the file name and line number<br />fprintf(stderr, "%s (%d): ", file_, line_);<br /><br />va_start(ap, fmt);<br />vfprintf(stderr, fmt, ap);<br />va_end(ap);<br /><br />fprintf(stderr, "/r/n"); // print the new-line character<br />}</font></p>
<p><font size="2" face="Courier New">private:<br />// copy-ctor and operator=<br />tracer(const tracer&amp;);<br />tracer&amp; operator=(const tracer&amp;);</font></p>
<p><font size="2" face="Courier New">private:<br />const char* file_;<br />int line_;<br />};<br />#define TRACE (tracer(__FILE__, __LINE__))<br />#else // NDEBUG<br />#define TRACE (void)<br />#endif // NDEBUG</font></p>
<p><font size="2" face="Courier New">int main()<br />{<br />#ifndef NDEBUG<br />tracer(__FILE__, __LINE__)("%x", 123);<br />#endif</font></p>
<p><font size="2" face="Courier New">TRACE("%s", "Happy debugging.");<br />}</font></p>
<p>这样做是multithreading-safe的。G++ 3.3.1 / Visual C++ 7.1 / Borland C++ 5.5.1 通过。</p><img src ="http://www.cppblog.com/API/aggbug/202633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-08-19 11:03 <a href="http://www.cppblog.com/API/archive/2013/08/19/202633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>printf函数分别在window和linux打印long long（_int64）</title><link>http://www.cppblog.com/API/archive/2013/07/18/201923.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Thu, 18 Jul 2013 03:49:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/07/18/201923.html</guid><wfw:comment>http://www.cppblog.com/API/comments/201923.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/07/18/201923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/201923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/201923.html</trackback:ping><description><![CDATA[<p>首先 Microsoft Visual C++ 6.0 不支持 long long ，支持_int64</p>
<p>printf 输出 long long</p>
<p>在windows 环境下 %I64d</p>
<p>在linux 环境下 %lld</p>
<p>另外打印long long型的函数如下：</p>
<p>void print_bigint(long long n) <br />{ <br />if (n&gt;=10) <br />print_bigint(n/10); <br />printf("%d",int(n%10)); <br />}</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/API/aggbug/201923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-07-18 11:49 <a href="http://www.cppblog.com/API/archive/2013/07/18/201923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>luaplus介绍</title><link>http://www.cppblog.com/API/archive/2013/04/23/199662.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Tue, 23 Apr 2013 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/04/23/199662.html</guid><wfw:comment>http://www.cppblog.com/API/comments/199662.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/04/23/199662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/199662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/199662.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [转载]介绍LuaPlus: 好用的Lua For C++扩展(修订)打算把lua作为项目的脚本语言,下面是不不错的教程,收藏虽然很早前研究过Lua,但还没有在放到项目中进行检验,要亲自用过才知道好坏~LuaPlus是Lua的C++增强，也就是说，LuaPlus本身就是在Lua的源码上进行增强得来的。用它与C++进行合作，是比较好的一个选择。LuaPlus目前版本为：LuaPlus for Lua...&nbsp;&nbsp;<a href='http://www.cppblog.com/API/archive/2013/04/23/199662.html'>阅读全文</a><img src ="http://www.cppblog.com/API/aggbug/199662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-04-23 16:53 <a href="http://www.cppblog.com/API/archive/2013/04/23/199662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>luaplus</title><link>http://www.cppblog.com/API/archive/2013/04/23/199660.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Tue, 23 Apr 2013 07:00:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/04/23/199660.html</guid><wfw:comment>http://www.cppblog.com/API/comments/199660.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/04/23/199660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/199660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/199660.html</trackback:ping><description><![CDATA[<p style="widows: 2; text-transform: none; text-indent: 21.75pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">国内关于</span>Lua<span style="font-family: 宋体">的资料实在是太少</span>,<span style="font-family: 宋体">为了寻找一个合适的</span>Lua<span style="font-family: 宋体">的</span>C++<span style="font-family: 宋体">封装</span>,<span style="font-family: 宋体">真是如同大海捞针</span>.<span style="font-family: 宋体">在看了众多资料后锁定以下几种</span>:LuaBind ToLua++ LuaPlus.<span style="font-family: 宋体">在选择上颇有讽刺的味道</span>,LuaBind<span style="font-family: 宋体">的版本号还没到</span>1.0,<span style="font-family: 宋体">加上网友颇有微词</span>,<span style="font-family: 宋体">放弃</span>.ToLua++<span style="font-family: 宋体">本来有朋友推荐</span>,<span style="font-family: 宋体">但是怎么都找不到下载</span>,<span style="font-family: 宋体">官网就是打不开</span>,<span style="font-family: 宋体">无赖放弃</span>.<span style="font-family: 宋体">就只有</span>LuaPlus<span style="font-family: 宋体">了</span>,<span style="font-family: 宋体">看到一些人的评价还行</span>,<span style="font-family: 宋体">于是决定就用它吧</span>.</p>
<p style="widows: 2; text-transform: none; text-indent: 21.75pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">LuaPlus<span style="font-family: 宋体">的资料就更少了</span>,<span style="font-family: 宋体">连怎么配置怎么调试等什么都没有</span>,<span style="font-family: 宋体">只有沐枫大哥讲解了语法方面的一篇文章</span>.<span style="font-family: 宋体">啊哟</span>,<span style="font-family: 宋体">怎么搞呢</span>,<span style="font-family: 宋体">难道又只有硬着头皮上了</span>?(<span style="font-family: 宋体">某伟人曾说过</span>,<span style="font-family: 宋体">但凡杰出的事都是硬着头皮干出来滴</span>)</p>
<p style="widows: 2; text-transform: none; text-indent: 21.75pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">好了</span>,<span style="font-family: 宋体">言归正传</span>,<span style="font-family: 宋体">下面讲讲我的经验吧</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="font-family: 宋体; color: red; font-size: 14pt">如何编译</span></strong><strong></strong></p>
<p style="widows: 2; text-transform: none; text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></strong><strong><span style="font-family: 宋体; color: maroon">下载</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">首先到官方网站下载</span>:&nbsp;<a style="color: rgb(26,139,200); text-decoration: none" href="http://www.luaplus.org/"><u>http://www.luaplus.org/</u></a></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">下载这个</span>: All source code:&nbsp;<a style="color: rgb(26,139,200); text-decoration: none" href="http://luaplus.org/LuaPlus51_Build1100.zip"><u>http://luaplus.org/LuaPlus51_Build1100.zip</u></a>&nbsp;(<span style="font-family: 宋体">我当前的版本</span>,<span style="font-family: 宋体">当然越新越好</span>)</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></strong><strong><span style="font-family: 宋体; color: maroon">剥离</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">解开下载包</span>,<span style="font-family: 宋体">打开</span>&nbsp;\LuaPlus51_Build1100\Src\LuaPlus&nbsp;<span style="font-family: 宋体">里面是全部源文件</span>,src<span style="font-family: 宋体">下是</span>lua<span style="font-family: 宋体">的源文件</span>.<span style="font-family: 宋体">这里有个令人疑惑的地方</span>,<span style="font-family: 宋体">源文件中带了一些不需要的文件</span>,<span style="font-family: 宋体">要剔除去</span>,<span style="font-family: 宋体">基本上需要以下这些文件</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span>1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>Lua<span style="font-family: 宋体">库文件</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">
<table style="border-bottom: medium none; border-left: medium none; border-collapse: collapse; border-top: medium none; border-right: medium none" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; line-height: 14px; background-color: transparent; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; word-wrap: break-word; color: rgb(69,69,69); font-size: 12px; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="189">
<p style="margin: 0cm 0cm 0pt 21pt">lapi.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lapi.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lauxlib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lauxlib.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lbaselib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lcode.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lcode.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">ldblib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">ldebug.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">ldebug.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">ldo.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">ldo.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">ldump.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lfunc.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lfunc.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lgc.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lgc.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">linit.c</p></td>
<td style="border-bottom: windowtext 1pt solid; padding-bottom: 0cm; line-height: 14px; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; word-wrap: break-word; color: rgb(69,69,69); font-size: 12px; border-left-color: rgb(236,233,216); border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="189">
<p style="margin: 0cm 0cm 0pt 21pt">liolib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">llex.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">llex.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">llimits.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lmathlib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lmem.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lmem.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">loadlib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lobject.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lobject.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lopcodes.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lopcodes.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">loslib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lparser.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lparser.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lstate.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lstate.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lstring.c</p></td>
<td style="border-bottom: windowtext 1pt solid; padding-bottom: 0cm; line-height: 14px; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; word-wrap: break-word; color: rgb(69,69,69); font-size: 12px; border-left-color: rgb(236,233,216); border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="189">
<p style="margin: 0cm 0cm 0pt 21pt">lstring.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lstrlib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">ltable.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">ltable.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">ltablib.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">ltm.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">ltm.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lua.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">luaconf.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lualib.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lundump.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lundump.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lvm.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lvm.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">lzio.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">lzio.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">print.c</p></td></tr></tbody></table></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; margin: 0cm 0cm 0pt 21pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span>2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>LuaPlus<span style="font-family: 宋体">头文件</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">
<table style="border-bottom: medium none; border-left: medium none; border-collapse: collapse; border-top: medium none; border-right: medium none" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; line-height: 14px; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; word-wrap: break-word; color: rgb(69,69,69); font-size: 12px; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="284">
<p style="margin: 0cm 0cm 0pt 21pt">auxiliar.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaAutoBlock.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaCall.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaFunction.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaHelper.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaHelper_Object.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaHelper_StackObject.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaLink.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaObject.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaObject.inl</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaPlus.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaPlusCD.h</p></td>
<td style="border-bottom: windowtext 1pt solid; padding-bottom: 0cm; line-height: 14px; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; word-wrap: break-word; color: rgb(69,69,69); font-size: 12px; border-left-color: rgb(236,233,216); border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="284">
<p style="margin: 0cm 0cm 0pt 21pt">LuaPlusFunctions.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaPlusInternal.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaStackObject.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaStackObject.inl</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaStackTableIterator.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaState.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaState.inl</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaStateOutFile.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaTableIterator.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">luathread.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">pt.h</p>
<p style="margin: 0cm 0cm 0pt 21pt">srm.h</p></td></tr></tbody></table></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; margin: 0cm 0cm 0pt 21pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span>3)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>LuaPlus<span style="font-family: 宋体">源文件</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">
<table style="border-bottom: medium none; border-left: medium none; border-collapse: collapse; border-top: medium none; border-right: medium none" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; line-height: 14px; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; word-wrap: break-word; color: rgb(69,69,69); font-size: 12px; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="284">
<p style="margin: 0cm 0cm 0pt 21pt">LuaCall.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaObject.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaPlus.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaPlusAddons.c</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaPlusFunctions.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaPlus_Libs.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaStackObject.cpp</p></td>
<td style="border-bottom: windowtext 1pt solid; padding-bottom: 0cm; line-height: 14px; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; word-wrap: break-word; color: rgb(69,69,69); font-size: 12px; border-left-color: rgb(236,233,216); border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="284">
<p style="margin: 0cm 0cm 0pt 21pt">LuaStackTableIterator.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaState.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaStateOutFile.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaState_DumpObject.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">LuaTableIterator.cpp</p>
<p style="margin: 0cm 0cm 0pt 21pt">lwstrlib.c</p></td></tr></tbody></table></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; margin: 0cm 0cm 0pt 21pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: -18pt; margin: 0cm 0cm 0pt 18pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></strong><strong><span style="font-family: 宋体; color: maroon">建立项目</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">然后你就可以在</span>VS<span style="font-family: 宋体">中建立一个新项目</span>,<span style="font-family: 宋体">静态链接库的</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" src="http://www.cppblog.com/images/cppblog_com/singohgod/4054/o_1.jpg"  alt="" /></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">分别把需要的文件加进去</span>,<span style="font-family: 宋体">之后编译</span>,<span style="font-family: 宋体">应该能通过了</span>.</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="font-family: 宋体; color: red; font-size: 14pt">如何使用</span></strong><strong></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">接着讲讲如何在你的其他项目中使用</span>LuaPlus.</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">1.</span></strong><strong><span style="font-family: 宋体; color: maroon">必要的配置</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">你的项目可能是这样的</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" src="http://www.cppblog.com/images/cppblog_com/singohgod/4054/o_2.jpg"  alt="" /></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">设置</span>GameClient<span style="font-family: 宋体">的依赖项是</span>LuaPlusLib</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">#include "LuaPlus.h"</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">using namespace LuaPlus;</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">记得干这事</span>&#8230;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">2.</span></strong><strong><span style="font-family: 宋体; color: maroon">创建一个状态</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">LuaStateOwner state;</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">今后的操作都围绕这个</span>state</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; margin: 0cm 0cm 0pt 21pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">3.</span></strong><strong><span style="font-family: 宋体; color: maroon">执行脚本</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">int iret = state-&gt;DoFile("test.lua");</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">返回值为</span>0<span style="font-family: 宋体">表示成功</span>,<span style="font-family: 宋体">否则不成功</span>.</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; margin: 0cm 0cm 0pt 21pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">4.C++</span></strong><strong><span style="font-family: 宋体; color: maroon">中获取</span><span style="color: maroon">Lua</span></strong><strong><span style="font-family: 宋体; color: maroon">脚本的变量</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">假设你的</span>test.lua<span style="font-family: 宋体">中有</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">health = 200;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">通过下列方法就可以在</span>C++<span style="font-family: 宋体">中得到这个数值</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">int mytest = state-&gt;GetGlobal("health").GetInteger();</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; margin: 0cm 0cm 0pt 21pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">5.C++</span></strong><strong><span style="font-family: 宋体; color: maroon">中调用</span><span style="color: maroon">Lua</span></strong><strong><span style="font-family: 宋体; color: maroon">脚本里的函数</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">假设你的</span>test.lua<span style="font-family: 宋体">中有</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">function Add(x, y)</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return x+y;</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">end</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">在</span>C++<span style="font-family: 宋体">中需要先声明这个函数</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">LuaFunction&lt;float&gt; Add =&nbsp;&nbsp;state-&gt;GetGlobal("Add");</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">这样你就有了</span>Add()<span style="font-family: 宋体">这个函数</span>,<span style="font-family: 宋体">然后就可以像平常一样使用它了</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">float myret = Add(3.14f,5.25f);</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; margin: 0cm 0cm 0pt 21pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="color: maroon">6.Lua</span></strong><strong><span style="font-family: 宋体; color: maroon">脚本中调用</span><span style="color: maroon">C++</span></strong><strong><span style="font-family: 宋体; color: maroon">函数</span></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">在读取</span>test.lua<span style="font-family: 宋体">之前要先把</span>C++<span style="font-family: 宋体">函数注册到</span>Lua<span style="font-family: 宋体">的运行时栈里</span>,<span style="font-family: 宋体">这样在执行</span>lua<span style="font-family: 宋体">脚本的时候</span>,<span style="font-family: 宋体">才知道执行哪一个函数</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">首先有函数</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">int LS_PrintNumber(LuaState* state)</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">{</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; margin: 0cm 0cm 0pt 21pt; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">LuaStack args(state);</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (args[1].IsNumber()) {</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%f\n", args[1].GetNumber());</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">}</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">然后注册这个函数到</span>Lua:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">state-&gt;GetGlobals().Register("PrintNumber", LS_PrintNumber);</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">这样就把</span>LS_PrintNumber<span style="font-family: 宋体">映射为</span>Lua<span style="font-family: 宋体">中可以使用的函数</span>PrintNumber.</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">Test.lua<span style="font-family: 宋体">脚本中添加调用语句</span>:</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="color: blue">PrintNumber(30);</span></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">当</span><span style="color: blue">state-&gt;DoFile("test.lua");</span><span style="font-family: 宋体">执行的时候</span>,<span style="font-family: 宋体">就执行了</span>C++<span style="font-family: 宋体">中的这个函数</span>.</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong><span style="font-family: 宋体; color: red; font-size: 14pt">总结</span></strong><strong></strong></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-family: 宋体">本文介绍了</span>LuaPlus<span style="font-family: 宋体">的基本配置方法和使用</span>,<span style="font-family: 宋体">希望对你有帮助</span>.<span style="font-family: 宋体">下一篇将介绍一些高级特性</span>,<span style="font-family: 宋体">如怎样在</span>VS<span style="font-family: 宋体">中调试</span>LuaPlus<span style="font-family: 宋体">的脚本</span>,<span style="font-family: 宋体">以及对类的操作等</span>.<br /></p>
<p style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; color: rgb(75,75,75); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">如果还有任何疑问可以看看下面这个简单的例子:<br />&nbsp;<a style="color: rgb(26,139,200); text-decoration: none" href="http://www.cppblog.com/Files/singohgod/LuaPlus_Test.rar">/Files/singohgod/LuaPlus_Test.rar</a></p><img src ="http://www.cppblog.com/API/aggbug/199660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-04-23 15:00 <a href="http://www.cppblog.com/API/archive/2013/04/23/199660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua 调 c++类</title><link>http://www.cppblog.com/API/archive/2013/04/22/199642.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Mon, 22 Apr 2013 09:51:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/04/22/199642.html</guid><wfw:comment>http://www.cppblog.com/API/comments/199642.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/04/22/199642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/199642.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/199642.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.其中lua脚本文件内容，t.lua如下：function f(ab)&nbsp;&nbsp;&nbsp;&nbsp; print(ab)endret ,err= pcall(f, "hello world")&nbsp;print( ret)&nbsp;print(err)&nbsp;print("okkkkkkkkkkk")2.代码如下：Code highlighting pro...&nbsp;&nbsp;<a href='http://www.cppblog.com/API/archive/2013/04/22/199642.html'>阅读全文</a><img src ="http://www.cppblog.com/API/aggbug/199642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-04-22 17:51 <a href="http://www.cppblog.com/API/archive/2013/04/22/199642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c/c++与lua脚本互调</title><link>http://www.cppblog.com/API/archive/2013/04/22/199638.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Mon, 22 Apr 2013 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/04/22/199638.html</guid><wfw:comment>http://www.cppblog.com/API/comments/199638.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/04/22/199638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/199638.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/199638.html</trackback:ping><description><![CDATA[<div>1.lua脚本func.lua如下： <br /><br />-- -------------------------------------<br />
<p>--变量定义<br />width=1;<br />height=2;</p>
<p><br />--lua函数定义，实现加法<br />function sum(a,b)<br />&nbsp;&nbsp;&nbsp; return a+b ;<br />end</p>
<p>--lua函数定义，实现字符串相加<br />function mystrcat(a,b)<br />&nbsp;&nbsp;&nbsp; return a..b ;<br />end</p>
<p>--lua函数定义，通过调用c代码中的csum函数实现加法<br />function mysum(a,b)<br />&nbsp;&nbsp;&nbsp; return csum(a,b);<br />end<br />-- -------------------------------------</p><br /><br />2.c/c++代码如下：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdafx.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">errno.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_93_153_Open_Image" onclick="this.style.display='none'; Codehighlighter1_93_153_Open_Text.style.display='none'; Codehighlighter1_93_153_Closed_Image.style.display='inline'; Codehighlighter1_93_153_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_93_153_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_93_153_Closed_Text.style.display='none'; Codehighlighter1_93_153_Open_Image.style.display='inline'; Codehighlighter1_93_153_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_93_153_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_93_153_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">lua.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">lualib.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">lauxlib.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;err_exit(num,fmt,args)&nbsp;&nbsp;\</span><span style="color: #000000"><br /><img id="Codehighlighter1_198_260_Open_Image" onclick="this.style.display='none'; Codehighlighter1_198_260_Open_Text.style.display='none'; Codehighlighter1_198_260_Closed_Image.style.display='inline'; Codehighlighter1_198_260_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_198_260_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_198_260_Closed_Text.style.display='none'; Codehighlighter1_198_260_Open_Image.style.display='inline'; Codehighlighter1_198_260_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_198_260_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_198_260_Open_Text"><span style="color: #000000">{printf(</span><span style="color: #000000">"</span><span style="color: #000000">[%s:%d]</span><span style="color: #000000">"</span><span style="color: #000000">fmt</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">,__FILE__,__LINE__,##args);exit(num);}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;err_return(num,fmt,args)&nbsp;&nbsp;\</span><span style="color: #000000"><br /><img id="Codehighlighter1_313_377_Open_Image" onclick="this.style.display='none'; Codehighlighter1_313_377_Open_Text.style.display='none'; Codehighlighter1_313_377_Closed_Image.style.display='inline'; Codehighlighter1_313_377_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_313_377_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_313_377_Closed_Text.style.display='none'; Codehighlighter1_313_377_Open_Image.style.display='inline'; Codehighlighter1_313_377_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_313_377_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_313_377_Open_Text"><span style="color: #000000">{printf(</span><span style="color: #000000">"</span><span style="color: #000000">[%s:%d]</span><span style="color: #000000">"</span><span style="color: #000000">fmt</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">,__FILE__,__LINE__,##args);</span><span style="color: #0000ff">return</span><span style="color: #000000">(num);}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">lua中调用的c函数定义,实现加法</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;csum(lua_State</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;l)<br /><img id="Codehighlighter1_433_533_Open_Image" onclick="this.style.display='none'; Codehighlighter1_433_533_Open_Text.style.display='none'; Codehighlighter1_433_533_Closed_Image.style.display='inline'; Codehighlighter1_433_533_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_433_533_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_433_533_Closed_Text.style.display='none'; Codehighlighter1_433_533_Open_Image.style.display='inline'; Codehighlighter1_433_533_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_433_533_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_433_533_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lua_tointeger(l,</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lua_tointeger(l,</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pushinteger(l,a</span><span style="color: #000000">+</span><span style="color: #000000">b)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,</span><span style="color: #0000ff">char</span><span style="color: #000000">**</span><span style="color: #000000">&nbsp;argv)<br /><img id="Codehighlighter1_567_2271_Open_Image" onclick="this.style.display='none'; Codehighlighter1_567_2271_Open_Text.style.display='none'; Codehighlighter1_567_2271_Closed_Image.style.display='inline'; Codehighlighter1_567_2271_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_567_2271_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_567_2271_Closed_Text.style.display='none'; Codehighlighter1_567_2271_Open_Image.style.display='inline'; Codehighlighter1_567_2271_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_567_2271_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_567_2271_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_State&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;luaL_newstate()&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建lua运行环境</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;l&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL&nbsp;)&nbsp;err_return(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">luaL_newstat()&nbsp;failed</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;luaL_loadfile(l,</span><span style="color: #000000">"</span><span style="color: #000000">func.lua</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">加载lua脚本文件</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;ret&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;err_return(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">luaL_loadfile&nbsp;failed</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lua_pcall(l,</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;ret&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;err_return(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">lua_pcall&nbsp;failed:%s</span><span style="color: #000000">"</span><span style="color: #000000">,lua_tostring(l,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(l,</span><span style="color: #000000">"</span><span style="color: #000000">width</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取lua中定义的变量</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(l,</span><span style="color: #000000">"</span><span style="color: #000000">height</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">height:%ld&nbsp;width:%ld\n</span><span style="color: #000000">"</span><span style="color: #000000">,lua_tointeger(l,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">),lua_tointeger(l,</span><span style="color: #000000">-</span><span style="color: #000000">2</span><span style="color: #000000">))&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(l,</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">恢复lua的栈</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(l,</span><span style="color: #000000">"</span><span style="color: #000000">sum</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用lua中的函数sum</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;lua_pushinteger(l,a)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pushinteger(l,b)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lua_pcall(l,</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;ret&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;err_return(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">lua_pcall&nbsp;failed:%s</span><span style="color: #000000">"</span><span style="color: #000000">,lua_tostring(l,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">sum:%d&nbsp;+&nbsp;%d&nbsp;=&nbsp;%ld\n</span><span style="color: #000000">"</span><span style="color: #000000">,a,b,lua_tointeger(l,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(l,</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;str1[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;str2[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">world</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(l,</span><span style="color: #000000">"</span><span style="color: #000000">mystrcat</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用lua中的函数mystrcat</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;lua_pushstring(l,str1)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pushstring(l,str2)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lua_pcall(l,</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;ret&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;err_return(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">lua_pcall&nbsp;failed:%s</span><span style="color: #000000">"</span><span style="color: #000000">,lua_tostring(l,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">mystrcat:%s%s&nbsp;=&nbsp;%s\n</span><span style="color: #000000">"</span><span style="color: #000000">,str1,str2,lua_tostring(l,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(l,</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pushcfunction(l,csum)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">注册在lua中使用的c函数</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;lua_setglobal(l,</span><span style="color: #000000">"</span><span style="color: #000000">csum</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">绑定到lua中的名字csum</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(l,</span><span style="color: #000000">"</span><span style="color: #000000">mysum</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用lua中的mysum函数，该函数调用本程序中定义的csum函数实现加法</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;lua_pushinteger(l,a)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pushinteger(l,b)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lua_pcall(l,</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;ret&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;err_return(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">lua_pcall&nbsp;failed:%s</span><span style="color: #000000">"</span><span style="color: #000000">,lua_tostring(l,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">mysum:%d&nbsp;+&nbsp;%d&nbsp;=&nbsp;%ld\n</span><span style="color: #000000">"</span><span style="color: #000000">,a,b,lua_tointeger(l,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(l,</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_close(l)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">释放lua运行环境</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&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">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/API/aggbug/199638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-04-22 16:31 <a href="http://www.cppblog.com/API/archive/2013/04/22/199638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua脚本</title><link>http://www.cppblog.com/API/archive/2013/04/22/199633.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Mon, 22 Apr 2013 06:33:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/04/22/199633.html</guid><wfw:comment>http://www.cppblog.com/API/comments/199633.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/04/22/199633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/199633.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/199633.html</trackback:ping><description><![CDATA[<div>1. 下载地址<a href="http://www.lua.org">www.lua.org</a><br />2. 安装<br />3.新建工程，加入Lua\5.1\lib中的lib库，及路径，并且加入include路径。<br />4.新建add.lua文件<br />&nbsp; 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />function&nbsp;add&nbsp;(&nbsp;x,&nbsp;y&nbsp;)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;y<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />end</span></div></div><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdafx.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_33_93_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_93_Open_Text.style.display='none'; Codehighlighter1_33_93_Closed_Image.style.display='inline'; Codehighlighter1_33_93_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_33_93_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_33_93_Closed_Text.style.display='none'; Codehighlighter1_33_93_Open_Image.style.display='inline'; Codehighlighter1_33_93_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_33_93_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_33_93_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">lua.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">lualib.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">lauxlib.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />lua_State</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;L;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;luaadd&nbsp;(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;)&nbsp;<br /><img id="Codehighlighter1_145_427_Open_Image" onclick="this.style.display='none'; Codehighlighter1_145_427_Open_Text.style.display='none'; Codehighlighter1_145_427_Closed_Image.style.display='inline'; Codehighlighter1_145_427_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_145_427_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_145_427_Closed_Text.style.display='none'; Codehighlighter1_145_427_Open_Image.style.display='inline'; Codehighlighter1_145_427_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_145_427_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_145_427_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum;<br /><img id="Codehighlighter1_159_171_Open_Image" onclick="this.style.display='none'; Codehighlighter1_159_171_Open_Text.style.display='none'; Codehighlighter1_159_171_Closed_Image.style.display='inline'; Codehighlighter1_159_171_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_159_171_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_159_171_Closed_Text.style.display='none'; Codehighlighter1_159_171_Open_Image.style.display='inline'; Codehighlighter1_159_171_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_159_171_Closed_Text">/**/</span><span id="Codehighlighter1_159_171_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;lua中的函数&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(L,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">add</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_203_218_Open_Image" onclick="this.style.display='none'; Codehighlighter1_203_218_Open_Text.style.display='none'; Codehighlighter1_203_218_Closed_Image.style.display='inline'; Codehighlighter1_203_218_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_203_218_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_203_218_Closed_Text.style.display='none'; Codehighlighter1_203_218_Open_Image.style.display='inline'; Codehighlighter1_203_218_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_203_218_Closed_Text">/**/</span><span id="Codehighlighter1_203_218_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;压入虚拟栈的第一个值&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pushnumber(L,&nbsp;x);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_246_255_Open_Image" onclick="this.style.display='none'; Codehighlighter1_246_255_Open_Text.style.display='none'; Codehighlighter1_246_255_Closed_Image.style.display='inline'; Codehighlighter1_246_255_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_246_255_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_246_255_Closed_Text.style.display='none'; Codehighlighter1_246_255_Open_Image.style.display='inline'; Codehighlighter1_246_255_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_246_255_Closed_Text">/**/</span><span id="Codehighlighter1_246_255_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;第二个值&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pushnumber(L,&nbsp;y);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_283_304_Open_Image" onclick="this.style.display='none'; Codehighlighter1_283_304_Open_Text.style.display='none'; Codehighlighter1_283_304_Closed_Image.style.display='inline'; Codehighlighter1_283_304_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_283_304_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_283_304_Closed_Text.style.display='none'; Codehighlighter1_283_304_Open_Image.style.display='inline'; Codehighlighter1_283_304_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_283_304_Closed_Text">/**/</span><span id="Codehighlighter1_283_304_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;调用传入的两个值，并返回一个结果&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_call(L,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_329_357_Open_Image" onclick="this.style.display='none'; Codehighlighter1_329_357_Open_Text.style.display='none'; Codehighlighter1_329_357_Closed_Image.style.display='inline'; Codehighlighter1_329_357_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_329_357_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_329_357_Closed_Text.style.display='none'; Codehighlighter1_329_357_Open_Image.style.display='inline'; Codehighlighter1_329_357_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_329_357_Closed_Text">/**/</span><span id="Codehighlighter1_329_357_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">得到结果&nbsp;，由于返回类型不同&nbsp;这里要显示的强制转换</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)lua_tointeger(L,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(L,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sum;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_tmain(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;argv[])<br /><img id="Codehighlighter1_468_773_Open_Image" onclick="this.style.display='none'; Codehighlighter1_468_773_Open_Text.style.display='none'; Codehighlighter1_468_773_Closed_Image.style.display='inline'; Codehighlighter1_468_773_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_468_773_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_468_773_Closed_Text.style.display='none'; Codehighlighter1_468_773_Open_Image.style.display='inline'; Codehighlighter1_468_773_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_468_773_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_468_773_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_484_494_Open_Image" onclick="this.style.display='none'; Codehighlighter1_484_494_Open_Text.style.display='none'; Codehighlighter1_484_494_Closed_Image.style.display='inline'; Codehighlighter1_484_494_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_484_494_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_484_494_Closed_Text.style.display='none'; Codehighlighter1_484_494_Open_Image.style.display='inline'; Codehighlighter1_484_494_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_484_494_Closed_Text">/**/</span><span id="Codehighlighter1_484_494_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;Lua初始化</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lua_open();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_517_529_Open_Image" onclick="this.style.display='none'; Codehighlighter1_517_529_Open_Text.style.display='none'; Codehighlighter1_517_529_Closed_Image.style.display='inline'; Codehighlighter1_517_529_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_517_529_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_517_529_Closed_Text.style.display='none'; Codehighlighter1_517_529_Open_Image.style.display='inline'; Codehighlighter1_517_529_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_517_529_Closed_Text">/**/</span><span id="Codehighlighter1_517_529_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">加载lua基本库&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;luaL_openlibs(L);&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_555_570_Open_Image" onclick="this.style.display='none'; Codehighlighter1_555_570_Open_Text.style.display='none'; Codehighlighter1_555_570_Closed_Image.style.display='inline'; Codehighlighter1_555_570_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_555_570_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_555_570_Closed_Text.style.display='none'; Codehighlighter1_555_570_Open_Image.style.display='inline'; Codehighlighter1_555_570_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_555_570_Closed_Text">/**/</span><span id="Codehighlighter1_555_570_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">加载文件add.lua&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;luaL_dofile(L,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">add.lua</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_604_616_Open_Image" onclick="this.style.display='none'; Codehighlighter1_604_616_Open_Text.style.display='none'; Codehighlighter1_604_616_Closed_Image.style.display='inline'; Codehighlighter1_604_616_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_604_616_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_604_616_Closed_Text.style.display='none'; Codehighlighter1_604_616_Open_Image.style.display='inline'; Codehighlighter1_604_616_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_604_616_Closed_Text">/**/</span><span id="Codehighlighter1_604_616_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;调用加法的方法&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;luaadd(&nbsp;</span><span style="color: #000000">200</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">50</span><span style="color: #000000">&nbsp;);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_647_655_Open_Image" onclick="this.style.display='none'; Codehighlighter1_647_655_Open_Text.style.display='none'; Codehighlighter1_647_655_Closed_Image.style.display='inline'; Codehighlighter1_647_655_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_647_655_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_647_655_Closed_Text.style.display='none'; Codehighlighter1_647_655_Open_Image.style.display='inline'; Codehighlighter1_647_655_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_647_655_Closed_Text">/**/</span><span id="Codehighlighter1_647_655_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">打印结果&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;sum&nbsp;is&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;sum&nbsp;);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;lua_close(L);&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Press&nbsp;enter&nbsp;to&nbsp;exit<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&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">;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>5.cpp文件如下：<br /><img src ="http://www.cppblog.com/API/aggbug/199633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-04-22 14:33 <a href="http://www.cppblog.com/API/archive/2013/04/22/199633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存池的实现(一)</title><link>http://www.cppblog.com/API/archive/2013/03/16/198483.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sat, 16 Mar 2013 05:06:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/03/16/198483.html</guid><wfw:comment>http://www.cppblog.com/API/comments/198483.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/03/16/198483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/198483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/198483.html</trackback:ping><description><![CDATA[<br /><br />
<p><span style="font-size: 16px"><strong><span style="font-family: SimSun">引言</span></strong></span></p>
<p><span style="font-family: SimSun; font-size: 15px">C/C++下内存管理是让几乎每一个程序员头疼的问题，分配足够的内存、追踪内存的分配、在不需要的时候释放内存&#8212;&#8212;这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放，有以下弊端：</span></p>
<ol><li><span style="font-family: SimSun; font-size: 15px">调用malloc/new,系统需要根据&#8220;最先匹配&#8221;、&#8220;最优匹配&#8221;或其他算法在内存空闲块表中查找一块空闲内存，调用free/delete,系统可能需要合并空闲内存块，这些会产生额外开销<br /></span></li><li><span style="font-family: SimSun; font-size: 15px">频繁使用时会产生大量内存碎片，从而降低程序运行效率</span></li><li><span style="font-family: SimSun; font-size: 15px">容易造成内存泄漏</span></li></ol>
<p><span style="font-family: SimSun; font-size: 15px"><br /></span></p>
<p><span style="font-family: SimSun; font-size: 15px">内存池（memory pool)是代替直接调用malloc/free<span style="font-family: SimSun">、</span>new/delete进行内存管理的常用方法，当我们申请内存空间时，首先到我们的内存池中查找合适的内存块，而不是直接向操作系统申请，优势在于：</span></p>
<ol><li><span style="font-family: SimSun; font-size: 15px">比malloc/free进行内存申请/释放的方式快</span></li><li><span style="font-family: SimSun; font-size: 15px">不会产生或很少产生堆碎片</span></li><li><span style="font-family: SimSun; font-size: 15px">可避免内存泄漏</span></li></ol>
<p><strong><span style="font-family: SimSun; font-size: 16px"><br /></span></strong></p>
<p><strong><span style="font-family: SimSun; font-size: 16px">内存池设计</span></strong></p>
<p><span style="font-family: SimSun; font-size: 15px">看到内存池好处这么多，是不是恨不能马上抛弃malloc/free，投奔内存池的怀抱呢？且慢，在我们自己动手实现内存池之前还需要明确以下几个问题：</span></p>
<ol><li><span style="font-family: SimSun; font-size: 15px">内存池的空间如何获得？是程序启动时分配一大块空间还是程序运行中按需求分配？</span></li><li><span style="font-family: SimSun; font-size: 15px">内存池对到来的内存申请，有没有大小的限制？如果有，最小可申请的内存块为多大，最大的呢？<br /></span></li><li><span style="font-family: SimSun; font-size: 15px"><span style="font-family: SimSun">如何合理设计内存块结构，方便我们进行内存的申请、追踪和释放呢？</span><br /></span></li><li><span style="font-family: SimSun; font-size: 15px">内存池占用越多空间，相对应其他程序能使用的内存就越少，是否要设定内存池空间的上限？设定为多少合适呢？</span></li></ol>
<p>&nbsp;</p>
<p><span style="font-family: SimSun; font-size: 15px">带着以上问题，我们来看以下一种内存池设计方案。</span></p>
<p><strong><span style="font-family: SimSun; font-size: 16px"><br /></span></strong></p>
<p><strong><span style="font-family: SimSun; font-size: 16px">内存池实现方案一</span></strong></p>
<p><span style="font-size: 15px">从<a href="http://download.csdn.net/source/3536291">这里</a>下载该内存池实现的源码。</span></p>
<p><span style="font-size: 15px">首先给出该方案的整体架构，如下：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/api/r_1.jpg" width="640" height="341" /><br /></span></p>
<p><span style="font-size: 15px"></span></p>
<p style="text-align: center"><span style="font-size: 15px">图1.内存池架构图</span></p>
<p><span style="font-size: 15px">结构中主要包含block<span style="font-family: SimSun"><span style="font-family: SimSun">、</span></span>list和pool这三个结构体，block结构包含指向实际内存空间的指针，前向和后向指针让block能够组成双向链表；list结构中free指针指向空闲 内存块组成的链表，used指针指向程序使用中的内存块组成的链表，size值为内存块的大小，list之间组成单向链表；pool结构记录list链表的头和尾。</span></p>
<p><span style="font-size: 15px"><br /></span></p>
<p><strong><span style="font-size: 16px">内存跟踪策略</span></strong></p>
<p><span style="font-size: 15px">该方案中，在进行内存分配时，将多申请12个字节，即实际申请的内存大小为所需内存大小+12。在多申请的12个字节中，分别存放对应的list指针<span style="font-family: SimSun"><span style="font-family: SimSun">（4字节）、</span></span>used指针（4字节）和校验码（4字节）。通过这样设定，我们很容易得到该块内存所在的list和block，校验码起到粗略检查是否出错的作用。该结构图示如下：</span></p>
<p><span style="font-size: 15px"></span></p>
<p style="text-align: center"><span style="font-size: 15px"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/api/r_2.jpg" width="640" height="55" /><br /><br />图2.内存块申请示意图</span></p>
<p><span style="font-size: 15px">图中箭头指示的位置为内存块真正开始的位置。</span></p>
<p><strong><span style="font-size: 16px"><br /></span></strong></p>
<p><strong><span style="font-size: 16px">内存申请和释放策略</span></strong></p>
<p><span style="font-size: 15px">申请：根据所申请内存的大小，遍历list链表，查看是否存在相匹配的size；</span></p>
<p><span style="font-size: 15px">　　　　存在匹配size：查看free时候为NULL</span></p>
<p><span style="font-size: 15px">　　　　　　free为NULL：使用malloc/new申请内存，并将其置于used所指链表的尾部</span></p>
<p><span style="font-size: 15px">　　　　　　free不为NULL：将free所指链表的头结点移除，放置于used所指链表的尾部</span></p>
<p><span style="font-size: 15px">　　　　不存在匹配size：新建list，使用malloc/new申请内存，并将其置于该list的used所指链表尾部</span></p>
<p><span style="font-size: 15px">　　　返回内存空间指针</span></p>
<p><span style="font-size: 15px">释放：根据内存跟踪策略，获取list指针和used指针，将其从used指针所指的链表中删除，放置于free指针所指向的链表<em></em></span><strong><span style="font-size: 16px"></span></strong></p>
<p><strong><span style="font-size: 16px"><br /></span></strong></p>
<p><strong><span style="font-size: 16px">对方案一的分析</span></strong></p>
<p><span style="font-size: 15px">对照&#8220;内存池设计&#8221;一节中提出的问题，我们的方案一有以下特点：</span></p>
<ol><li><span style="font-size: 15px">程序启动后内存池并没有内存块，到程序真正进行内存申请和释放的时候才接管内存块管理；</span></li><li><span style="font-size: 15px">该内存池对到来的申请，对申请大小并不做限制，其为每个size值创建链表进行内存管理；</span></li><li><span style="font-size: 15px">该方案没有提供限定内存池大小的功能</span></li></ol>
<p><span style="font-size: 15px"><br /></span></p>
<p><span style="font-size: 15px">结合分析，可以得出该方案应用场景如下：程序所申请的内存块大小比较固定（比如只申请/释放1024bytes或2048bytes的内存），申请和释放的频率基本保持一致（因申请多而释放少会占用过多内存，最终导致系统崩溃）。</span></p>
<p><span style="font-size: 15px"><br /></span></p>
<p><span style="font-size: 15px">这篇文章讲解了内存管理的基本知识，以一个简单的内存池实现例子作为敲门砖，引领大家认识内存池，下一篇为内存池进阶文章，讲解apache服务器中内存池的实现方法。</span></p><img src ="http://www.cppblog.com/API/aggbug/198483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-03-16 13:06 <a href="http://www.cppblog.com/API/archive/2013/03/16/198483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存池实现 (思路)</title><link>http://www.cppblog.com/API/archive/2013/03/16/198479.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sat, 16 Mar 2013 04:43:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2013/03/16/198479.html</guid><wfw:comment>http://www.cppblog.com/API/comments/198479.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2013/03/16/198479.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/198479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/198479.html</trackback:ping><description><![CDATA[话说一直想找一个别人写好的使用，可惜没什么人会拿这小东西发布，只好自写一个。<br /><br />1.多级链表分配池<br />我不知道这种设计的具体学名是什么，这部分的内容也许你去看《STL源码分析》的有关章节更合适一些，这里我只能用我粗陋的语言描述一下。<br />内存池，完全可以从字面上理解为从池子里申请内存，释放的时候还给池子。<br />最简单的内存池应该是fix_pool吧，即每次分配出来的内存块大小是固定的。这种池子的管理结构是一个链表，链表的每一个节点为固定大小的内存块。分配的时候，直接返回链表的第一个节点，节点不足时，从系统申请大块内存分成多个节点加入链表；释放的时候更简单，将释放的内存加入链表头。<br />假设fix_pool的fix size = 128，那么内存池可以为128byte以下的任意大小的请求进行分配，但是这样做相当浪费呢，于是unfix_pool就在此基础上出现了。<br />由多个分配大小不同的fix_pool所组成的内存池就叫做多级链表分配池，我是这么定义的。<br />常规上会定义8,16,24,32,...,112,120,128这些分配大小，共16级。分配或者释放的时候，判断请求的大小在哪一级别上，用该级别的fix_pool链表进行分配或者释放。<br /><br /><br />2.泄漏检测<br />当所有的分配都经过你的手的时候，泄漏检测什么的再简单不过了。<br />找个地方把分配的东西记录下来，释放的时候把记录去掉。程序退出的时候还存在的分配记录就是泄漏了。<br />我个人选用的方法是给每一个分配请求多分配一些内存，用来记录分配的信息，并将这部分信息用双向链表串起来。释放的时候对释放的指针做一下指针偏移就可以找到信息记录并移出双向链表。<br />这个方法的开销是常数级的，不过无法处理重复删除的问题。<br /><br /><br />3.operater new<br />要把你的内存池应用到每一个角落，需要定义operator new和operator delete。<br />
<div style="padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-left-color: #cccccc; padding-top: 4px"><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000"> </span><span style="color: #0000ff">operator</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000">(size_t) </span><span style="color: #0000ff">throw</span><span style="color: #000000">(std::bad_alloc);<br /></span><span style="color: #000000"></span><span style="color: #0000ff">void</span><span style="color: #000000"> </span><span style="color: #0000ff">operator</span><span style="color: #000000"> delete(</span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000"> p)</span><span style="color: #000000">;</span></div>但是这还不够，谁也不想看到一堆泄漏信息而找不到泄漏的位置，因此还需要定义带附加参数的operator。<br />对于placement new而言，operator new[]和operator delete[]是必须的，无法省略。<br /><br />
<div style="padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-left-color: #cccccc; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000"> </span><span style="color: #0000ff">operator</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000">(size_t, </span><span style="color: #0000ff">const</span><span style="color: #000000"> </span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000"> file, </span><span style="color: #0000ff">int</span><span style="color: #000000"> line, </span><span style="color: #0000ff">const</span><span style="color: #000000"> </span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000"> function);<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000"> </span><span style="color: #0000ff">operator</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000">[](size_t, </span><span style="color: #0000ff">const</span><span style="color: #000000"> </span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">, </span><span style="color: #0000ff">int</span><span style="color: #000000">, </span><span style="color: #0000ff">const</span><span style="color: #000000"> </span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">);<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> </span><span style="color: #0000ff">operator</span><span style="color: #000000"> delete(</span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000"> p);<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> </span><span style="color: #0000ff">operator</span><span style="color: #000000"> delete[](</span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000"> p);</span></div>为了能用上新的operator，需要在头文件中重新定义new，并包含进每一个cpp文件。<br /><br />
<div style="padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-left-color: #cccccc; padding-top: 4px"><!--<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">op_new.h</span><span style="color: #008000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000"> DEBUG_NEW new(__FILE__, __LINE__, __FUNCTION__)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000"> new DEBUG_new</span></div>不过重定义new会和自行使用placement new的地方冲突，如stl容器库，这时候要undef new后才能编译冲突组件。<br /><br />
<div style="padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-left-color: #cccccc; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">#undef</span><span style="color: #000000"> new</span><span style="color: #000000"><br />#include </span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include </span><span style="color: #000000">"</span><span style="color: #000000">op_new.h</span><span style="color: #000000">"</span></div><br /><br />4.线程安全<br />我没听说过new/delete,malloc/free是线程不安全的，所以在内存池的allocate/deallocate接口处直接加了锁。<br />想降低开销的同学可以使用spin lock，而不是mutex。<br /><br /><img src ="http://www.cppblog.com/API/aggbug/198479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2013-03-16 12:43 <a href="http://www.cppblog.com/API/archive/2013/03/16/198479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memcache存储大数据的问题</title><link>http://www.cppblog.com/API/archive/2012/10/19/193536.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 19 Oct 2012 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2012/10/19/193536.html</guid><wfw:comment>http://www.cppblog.com/API/comments/193536.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2012/10/19/193536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/193536.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/193536.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体; color: #444444; font-size: 10.5pt"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span class="link_title"></span></span></span></span><span style="font-family: 宋体; color: #444444; font-size: 10.5pt"><span style="font-family: arial black, avant garde"><span style="color: #0000ff">Memcached存储单个item最大数据是在1MB内，如果数据超过1M,存取set和get是都是返回false，而且引起性能的问题。</span></span></span></p>
<p><span style="font-family: 宋体; color: #444444; font-size: 10.5pt"><span style="font-family: arial black, avant garde"><span style="color: #0000ff">我们之前对排行榜的数据进行缓存，由于排行榜在我们所有sql select查询里面占了30%，而且我们排行榜每小时更新一次，所以必须对数据做缓存。为了清除缓存方便，把所有的用户的数据放在同一key中，由于memcached:set的时候没有压缩数据。在测试服测试的时候，没发现问题，当上线的时候，结果发现，在线人数刚刚490人的时候，服务器load average飘到7.9。然后我们去掉缓存，一下子就下降到0.59。</span></span></span></p>
<p><span style="font-family: 宋体; color: #444444; font-size: 10.5pt"></span></p>
<p><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 宋体; font-size: 10.5pt">所以Memcahce不适合缓存大数据，超过</span><span style="font-family: 宋体; font-size: 10.5pt">1MB的数据</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">，可以考虑在客户端压缩或拆分到多个</span><span style="font-family: 宋体; font-size: 10.5pt">key</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">中。大的数据在进行load和uppack到内存的时候需要花很长时间，从而降低服务器的性能。</span></span></span></p>
<p><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 宋体; font-size: 10.5pt">Memcached</span><span style="font-family: 宋体; font-size: 10.5pt">支持最大的存储对象为</span><span style="font-family: 宋体; font-size: 10.5pt">1M</span><span style="font-family: 宋体; font-size: 10.5pt">。这个值由其内存分配机制决定的。</span></span></span></span></span></p>
<p><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 宋体; font-size: 10.5pt">memcached</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">默认情况下采用了名为</span><span style="font-family: 宋体; font-size: 10.5pt">Slab Allocator</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">的机制分配、管理内存。在该机制出现以前，内存的分配是通过对所有记录简单地进行</span><span style="font-family: 宋体; font-size: 10.5pt">malloc</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">和</span><span style="font-family: 宋体; font-size: 10.5pt">free</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">来进行的。但是，这种方式会导致内存碎片，加重操作系统内存管理器的负担，最坏的情况下，会导致操作系统比</span><span style="font-family: 宋体; font-size: 10.5pt">memcached</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">进程本身还慢。</span><span style="font-family: 宋体; font-size: 10.5pt">Slab Allocator</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">就是为解决该问题而诞生的。<span style="font-family: 宋体; font-size: 10.5pt">Slab Allocator</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">的基本原理是按照预先规定的大小，将分配的内存分割成特定长度的块，以完全解决内存碎片问题.</span></span></span></span></span></span></span></p>
<p><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">今天（2012-03-16）我们重新测试了memcached ::set的数据大小。可能是我们用php的memcached扩展是最新版，set数据的时候是默认压缩的。set 数据：</span></span></span></span></span></span></span></p>
<p><span style="font-family: 'Times New Roman'; color: #0000ff"></span></p>
<div class="dp-highlighter bg_plain">
<div class="bar">
<div class="tools"><strong>[plain]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/hguisu/article/details/6163621#"><u><font color="#000080">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/hguisu/article/details/6163621#"><u><font color="#000080">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/hguisu/article/details/6163621#"><u><font color="#000080">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/hguisu/article/details/6163621#"><u><font color="#000080">?</font></u></a></div></div>
<ol><li class="alt"><span>$ac = new memcahed(); </span></li><li><span>$data = str_repeat('a', 1024* 1024); //1M的数据 </span></li><li class="alt"><span>$r = $ac-&gt;set('key', $data, 9999); </span></li><li><span>//或者 </span></li><li class="alt"><span>$data = str_repeat('a', 1024* 1024*100);//100M的数据 </span></li><li><span>$r = $ac-&gt;set('key', $data, 9999); </span></li></ol></div><pre style="display: none" class="plain" name="code">$ac = new memcahed();
$data = str_repeat('a', 1024* 1024); //1M的数据
$r  =  $ac-&gt;set('key', $data, 9999);
//或者
$data = str_repeat('a', 1024* 1024*100);//100M的数据
$r  =  $ac-&gt;set('key', $data, 9999);</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="background-color: #ffffff"><span style="color: #3333ff">不论是1M的数据还是100M的数据，都能set成功。后来我发现，memcached</span></span><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">set数据的时候是默认压缩的。由于这个这个是重复的字符串，压缩率高达1000倍。因此100M的数据压缩后实际也就100k而已。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">当我设置：</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="font-family: 'Times New Roman'; color: #0000ff"></span></p>
<div class="dp-highlighter bg_plain">
<div class="bar">
<div class="tools"><strong>[plain]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/hguisu/article/details/6163621#"><u><font color="#000080">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/hguisu/article/details/6163621#"><u><font color="#000080">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/hguisu/article/details/6163621#"><u><font color="#000080">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/hguisu/article/details/6163621#"><u><font color="#000080">?</font></u></a></div></div>
<ol><li class="alt"><span>$ac-&gt;setOption(memcahed::OPT_COMPRESSION,0); //不压缩存储数据。 </span></li><li><span>$data = str_repeat('a', 1024* 1024); //1M数据 </span></li><li class="alt"><span>$r = $ac-&gt;set('key', $data, 9999);//1M的数据set不成功。 </span></li></ol></div><pre style="display: none" class="plain" name="code">$ac-&gt;setOption(memcahed::OPT_COMPRESSION,0); //不压缩存储数据。
$data = str_repeat('a', 1024* 1024); //1M数据
$r  =  $ac-&gt;set('key', $data, 9999);//1M的数据set不成功。</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">也就是说memcached server不能存储超过1M的数据，但是<span style="font-family: Verdana; color: white; font-size: 10.5pt" lang="EN-US"><span style="color: #000000"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: arial black, avant garde"><span style="color: #0000ff"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">经过</span></span></span></span></span></span></span>客户端压缩数据后，只要小于1M的数据都能存储成功。</span></span></span></span></span></span></span></p>
<p><span style="font-family: Verdana; font-size: 10.5pt" lang="EN-US"><span style="font-size: 10.5pt" lang="AR-SA"><span style="font-family: 'arial black', 'avant garde'"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-weight: bold">memcached相关知识：</span><br /></span></span></span></span></span></p>
<p>&nbsp;</p>
<p><strong>1、memcached的基本设置 <br />1）启动Memcache的服务器端 </strong><br /># /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid</p>
<p>-d选项是启动一个守护进程， <br />-m是分配给Memcache使用的内存数量，单位是MB，我这里是10MB， <br />-u是运行Memcache的用户，我这里是root， <br />-l是监听的服务器IP地址，如果有多个地址的话，我这里指定了服务器的IP地址192.168.0.200， <br />-p是设置Memcache监听的端口，我这里设置了12000，最好是1024以上的端口， <br />-c选项是最大运行的并发连接数，默认是1024，我这里设置了256，按照你服务器的负载量来设定， <br />-P是设置保存Memcache的pid文件，我这里是保存在 /tmp/memcached.pid，</p>
<p>2）如果要结束Memcache进程，执行：</p>
<p># kill `cat /tmp/memcached.pid`</p>
<p><a href="http://baike.baidu.com/view/273836.htm"><span style="color: #000000">哈希算法</span></a><span style="color: #000000">将</span>任意长度的二进制值映射为固定长度的较小二进制值，这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该</p>
<p>段落的一个字母，随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入，在计算上是不可能的。</p>
<p>&nbsp;</p>
<p><strong>2、适用memcached的业务场景？</strong></p>
<p>1）如果网站包含了访问量很大的动态网页，因而数据库的负载将会很高。由于大部分数据库请求都是读操作，那么memcached可以显著地减小数据库负载。</p>
<p>2）如果数据库服务器的负载比较低但CPU使用率很高，这时可以缓存计算好的结果（ computed objects ）和渲染后的网页模板（enderred templates）。</p>
<p>3）利用memcached可以缓存<strong>session数据</strong>、临时数据以减少对他们的数据库写操作。</p>
<p>4）缓存一些很小但是被频繁访问的文件。</p>
<p>5）缓存Web 'services'（非IBM宣扬的Web Services，译者注）或RSS feeds的结果.。</p>
<p><strong>3、不适用memcached的业务场景？</strong></p>
<p>&nbsp;</p>
<p>1）缓存对象的大小大于1MB </p>
<p>Memcached本身就不是为了处理庞大的多媒体（large media）和巨大的二进制块（streaming huge blobs）而设计的。 </p>
<p>2）key的长度大于250字符 </p>
<p>3）虚拟主机不让运行memcached服务 </p>
<p>如果应用本身托管在低端的虚拟私有服务器上，像vmware, xen这类虚拟化技术并不适合运行memcached。Memcached需要接管和控制大块的内存，如果memcached管理 的内存被OS或 hypervisor交换出去，memcached的性能将大打折扣。</p>
<p>4）应用运行在不安全的环境中 </p>
<p>Memcached为提供任何安全策略，仅仅通过telnet就可以访问到memcached。如果应用运行在共享的系统上，需要着重考虑安全问题。</p>
<p>5）业务本身需要的是持久化数据或者说需要的应该是database</p>
<p>&nbsp;</p>
<p><strong>4、 不能能够遍历memcached中所有的item</strong></p>
<p>这个操作的速度相对缓慢且阻塞其他的操作（这里的缓慢时相比memcached其他的命令）。memcached所有非调试（non-debug）命令，例如add, set, get, fulsh等无论</p>
<p>memcached中存储了多少数据，它们的执行都只消耗常量时间。任何遍历所有item的命令执行所消耗的时间，将随着memcached中数据量的增加而增加。当其他命令因为等待（遍历所有item的命令执行完毕）而不能得到执行，因而阻塞将发生。</p><strong>5、 memcached能接受的key的最大长度是250个字符</strong> 
<p>memcached能接受的key的最大长度是250个字符。需要注意的是，250是memcached服务器端内部的限制。如果使用的Memcached客户端支持"key的前缀"或类似特性，那么key（前缀+原始key）的最大长度是可以超过250个字符的。推荐使用较短的key，这样可以节省内存和带宽。</p><strong>6、 单个item的大小被限制在1M byte之内</strong> 
<p>因为内存分配器的算法就是这样的。</p>
<p>详细的回答：</p>
<p>1）Memcached的内存存储引擎，使用slabs来管理内存。内存被分成大小不等的slabs chunks（先分成大小相等的slabs，然后每个slab被分成大小相等chunks，不同slab的chunk大小是不相等的）。chunk的大小依次从一个最小数开始，按某个因子增长，直到达到最大的可能值。如果最小值为400B，最大值是1MB，因子是1.20，各个slab的chunk的大小依次是：</p>
<p>slab1 - 400B；slab2 - 480B；slab3 - 576B ...slab中chunk越大，它和前面的slab之间的间隙就越大。因此，最大值越大，内存利用率越低。Memcached必须为每个slab预先分配内存，因此如果设置了较小的因子和较大的最大值，会需要为Memcached提供更多的内存。</p>
<p>2）不要尝试向memcached中存取很大的数据，例如把巨大的网页放到mencached中。因为将大数据load和unpack到内存中需要花费很长的时间，从而导致系统的性能反而不好。如果确实需要存储大于1MB的数据，可以修改slabs.c：POWER_BLOCK的值，然后重新编译memcached；或者使用低效的malloc/free。另外，可以使用数据库、MogileFS等方案代替Memcached系统。</p><strong>7、 memcached的内存分配器是如何工作的？为什么不适用malloc/free！？为何要使用slabs？</strong> 
<p>实际上，这是一个编译时选项。默认会使用内部的slab分配器，而且确实应该使用内建的slab分配器。最早的时候，memcached只使用malloc/free来管理内存。然而，这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片，OS最终花费大量的时间去查找连续的内存块来满足malloc的请求，而不是运行memcached进程。slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks，一直被重复使用。因为内存被划分成大小不等的slabs，如果item的大小与被选择存放它的slab不是很合适的话，就会浪费一些内存。</p>
<p><strong>8、memcached对item的过期时间有什么限制？</strong></p>
<p>item对象的过期时间最长可以达到30天。memcached把传入的过期时间（时间段）解释成时间点后，一旦到了这个时间点，memcached就把item置为失效状态，这是一个简单但obscure的机制。</p>
<p><strong>9、什么是二进制协议，是否需要关注？</strong></p>
<p>二进制协议尝试为端提供一个更有效的、可靠的协议，减少客户端/服务器端因处理协议而产生的CPU时间。根据Facebook的测试，解析ASCII协议是memcached中消耗CPU时间最多的</p>
<p>环节。</p>
<p><strong>10、 memcached的内存分配器是如何工作的？为什么不适用malloc/free！？为何要使用slabs？</strong></p>
<p>实际上，这是一个编译时选项。默认会使用内部的slab分配器，而且确实应该使用内建的slab分配器。最早的时候，memcached只使用malloc/free来管理内存。然而，这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片，OS最终花费大量的时间去查找连续的内存块来满足malloc的请求，而不是运行memcached进程。slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks，一直被重复使用。因为内存被划分成大小不等的slabs，如果item的大小与被选择存放它的slab不是很合适的话，就会浪费一些内存。</p>
<p><strong>11、memcached是原子的吗？</strong></p>
<p>所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令，它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式，所有的命令都是原子的。然是，命令序列不是原子的。如果首先通过get命令获取了一个item，修改了它，然后再把它set回memcached，系统不保证这个item没有被其他进程（process，未必是操作系统中的进程）操作过。memcached 1.2.5以及更高版本，提供了gets和cas命令，它们可以解决上面的问题。如果使用gets命令查询某个key的item，memcached会返回该item当前值的唯一标识。如果客户端程序覆写了这个item并想把它写回到memcached中，可以通过cas命令把那个唯一标识一起发送给memcached。如果该item存放在memcached中的唯一标识与您提供的一致，写操作将会成功。如果另一个进程在这期间也修改了这个item，那么该item存放在memcached中的唯一标识将会改变，写操作就会</p>
<p>失败。<br /><br />
<div><strong style="text-align: left; padding-bottom: 0px; line-height: 19px; background-color: #f5f5f5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; padding-top: 0px">Windows下的Memcache安装</strong><span style="text-align: left; line-height: 19px; background-color: #f5f5f5; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px">：</span><br style="text-align: left; padding-bottom: 0px; line-height: 19px; background-color: #f5f5f5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; padding-top: 0px" /><span style="text-align: left; line-height: 19px; background-color: #f5f5f5; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px">1. 下载</span><a style="text-align: left; padding-bottom: 0px; line-height: 19px; background-color: #f5f5f5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #0069d6; font-size: 13px; padding-top: 0px" href="http://jehiah.cz/projects/memcached-win32" target="_blank"><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: #1359ae; padding-top: 0px">memcache</span></a><span style="text-align: left; line-height: 19px; background-color: #f5f5f5; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px">的windows稳定版，解压放某个盘下面，比如在c:/memcached</span><br style="text-align: left; padding-bottom: 0px; line-height: 19px; background-color: #f5f5f5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; padding-top: 0px" /><span style="text-align: left; line-height: 19px; background-color: #f5f5f5; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px">2. 在终端（也即cmd命令界面）下输入 &#8216;c:/memcached/memcached.exe -d install&#8217; 安装</span><br style="text-align: left; padding-bottom: 0px; line-height: 19px; background-color: #f5f5f5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; padding-top: 0px" /><span style="text-align: left; line-height: 19px; background-color: #f5f5f5; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px">3. 再输入： &#8216;c:/memcached/memcached.exe -d start&#8217; 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。</span>&nbsp;</div>
<p><br /><br />/usr/local/memcached/bin/memcached -u root -d -m 3072 -l 192.168.121.130 -p 50008 -U 0 -P /var/run/memcache.pid<br /><br /></p><img src ="http://www.cppblog.com/API/aggbug/193536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2012-10-19 17:20 <a href="http://www.cppblog.com/API/archive/2012/10/19/193536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>typeid用法</title><link>http://www.cppblog.com/API/archive/2012/09/15/190729.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sat, 15 Sep 2012 02:13:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2012/09/15/190729.html</guid><wfw:comment>http://www.cppblog.com/API/comments/190729.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2012/09/15/190729.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/190729.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/190729.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typeinfo</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test<br /><img id="Codehighlighter1_72_217_Open_Image" onclick="this.style.display='none'; Codehighlighter1_72_217_Open_Text.style.display='none'; Codehighlighter1_72_217_Closed_Image.style.display='inline'; Codehighlighter1_72_217_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_72_217_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_72_217_Closed_Text.style.display='none'; Codehighlighter1_72_217_Open_Image.style.display='inline'; Codehighlighter1_72_217_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_72_217_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_72_217_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">Test()<br /><img id="Codehighlighter1_100_103_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_103_Open_Text.style.display='none'; Codehighlighter1_100_103_Closed_Image.style.display='inline'; Codehighlighter1_100_103_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_100_103_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_100_103_Closed_Text.style.display='none'; Codehighlighter1_100_103_Open_Image.style.display='inline'; Codehighlighter1_100_103_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_100_103_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_100_103_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Out()<br /><img id="Codehighlighter1_126_165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_126_165_Open_Text.style.display='none'; Codehighlighter1_126_165_Closed_Image.style.display='inline'; Codehighlighter1_126_165_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_126_165_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_126_165_Closed_Text.style.display='none'; Codehighlighter1_126_165_Open_Image.style.display='inline'; Codehighlighter1_126_165_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_126_165_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_126_165_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">typeid(</span><span style="color: #000000">*</span><span style="color: #0000ff">this</span><span style="color: #000000">).name()</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;Test()<br /><img id="Codehighlighter1_176_215_Open_Image" onclick="this.style.display='none'; Codehighlighter1_176_215_Open_Text.style.display='none'; Codehighlighter1_176_215_Closed_Image.style.display='inline'; Codehighlighter1_176_215_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_176_215_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_176_215_Closed_Text.style.display='none'; Codehighlighter1_176_215_Open_Image.style.display='inline'; Codehighlighter1_176_215_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_176_215_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_176_215_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">typeid(</span><span style="color: #000000">*</span><span style="color: #0000ff">this</span><span style="color: #000000">).name()</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FromTest&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Test<br /><img id="Codehighlighter1_249_273_Open_Image" onclick="this.style.display='none'; Codehighlighter1_249_273_Open_Text.style.display='none'; Codehighlighter1_249_273_Closed_Image.style.display='inline'; Codehighlighter1_249_273_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_249_273_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_249_273_Closed_Text.style.display='none'; Codehighlighter1_249_273_Open_Image.style.display='inline'; Codehighlighter1_249_273_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_249_273_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_249_273_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img id="Codehighlighter1_270_271_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_271_Open_Text.style.display='none'; Codehighlighter1_270_271_Closed_Image.style.display='inline'; Codehighlighter1_270_271_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_270_271_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_270_271_Closed_Text.style.display='none'; Codehighlighter1_270_271_Open_Image.style.display='inline'; Codehighlighter1_270_271_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;FromTest()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_270_271_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_270_271_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_288_570_Open_Image" onclick="this.style.display='none'; Codehighlighter1_288_570_Open_Text.style.display='none'; Codehighlighter1_288_570_Closed_Image.style.display='inline'; Codehighlighter1_288_570_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_288_570_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_288_570_Closed_Text.style.display='none'; Codehighlighter1_288_570_Open_Image.style.display='inline'; Codehighlighter1_288_570_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_288_570_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_288_570_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;void&nbsp;*&nbsp;v=new&nbsp;Test;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;*&nbsp;t=static_cast&lt;Test&nbsp;*&gt;(v);</span><span style="color: #008000"><br /><img id="Codehighlighter1_351_377_Open_Image" onclick="this.style.display='none'; Codehighlighter1_351_377_Open_Text.style.display='none'; Codehighlighter1_351_377_Closed_Image.style.display='inline'; Codehighlighter1_351_377_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_351_377_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_351_377_Closed_Text.style.display='none'; Codehighlighter1_351_377_Open_Image.style.display='inline'; Codehighlighter1_351_377_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_351_377_Closed_Text">/**/</span><span id="Codehighlighter1_351_377_Open_Text"><span style="color: #808080">///</span><span style="color: #008000">/&nbsp;Test&nbsp;*&nbsp;t=(Test&nbsp;*)(v);</span><span style="color: #808080"></span></span><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;cout&lt;&lt;typeid(t).name()&lt;&lt;endl;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;t-&gt;Out();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;int&nbsp;i;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;cout&lt;&lt;typeid(i).name()&lt;&lt;endl;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;FromTest&nbsp;ft;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;Test&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;t;</span><span style="color: #008000">//</span><span style="color: #008000">=new&nbsp;FromTest;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;Test&nbsp;l;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;l.Out();&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;t</span><span style="color: #000000">=&amp;</span><span style="color: #000000">ft;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">typeid(</span><span style="color: #000000">*</span><span style="color: #000000">t).name()</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div><img src ="http://www.cppblog.com/API/aggbug/190729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2012-09-15 10:13 <a href="http://www.cppblog.com/API/archive/2012/09/15/190729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串格式化防止数组越界</title><link>http://www.cppblog.com/API/archive/2012/03/08/167367.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Thu, 08 Mar 2012 01:50:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2012/03/08/167367.html</guid><wfw:comment>http://www.cppblog.com/API/comments/167367.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2012/03/08/167367.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/167367.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/167367.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&nbsp;&nbsp;&nbsp; char</span><span style="color: #000000; ">&nbsp;buffers[</span><span style="color: #000000; ">10</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">_snprintf_s(buffers,sizeof(buffers),"%s","lsdafjasdlfjasdl;fjasdl;fjasd;fjasd;fjasd;fasd;fsd");</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;_snprintf(buffers,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(buffers)</span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">lseeeeeeeeeeeeeeeeeeeed</span><span style="color: #000000; ">"</span><span style="color: #000000;">);<br /><div><span style="color: #000000; ">&nbsp;&nbsp;&nbsp; buffers[</span><span style="color: #000000; ">9</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">0</span><span style="color: #000000; ">;</span></div><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,buffers);<br />&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdin);</span></div><img src ="http://www.cppblog.com/API/aggbug/167367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2012-03-08 09:50 <a href="http://www.cppblog.com/API/archive/2012/03/08/167367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>红黑树及生成超过32768随机数</title><link>http://www.cppblog.com/API/archive/2011/12/11/161926.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Sun, 11 Dec 2011 09:44:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/12/11/161926.html</guid><wfw:comment>http://www.cppblog.com/API/comments/161926.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/12/11/161926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/161926.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/161926.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/*-----------------------------------------------------------&nbsp;&nbsp;&nbsp; RB-Tree的插入和删除操作的实现算法&n...&nbsp;&nbsp;<a href='http://www.cppblog.com/API/archive/2011/12/11/161926.html'>阅读全文</a><img src ="http://www.cppblog.com/API/aggbug/161926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-12-11 17:44 <a href="http://www.cppblog.com/API/archive/2011/12/11/161926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于模板中的嵌套依赖类型名与typename</title><link>http://www.cppblog.com/API/archive/2011/10/28/159270.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 28 Oct 2011 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/10/28/159270.html</guid><wfw:comment>http://www.cppblog.com/API/comments/159270.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/10/28/159270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/159270.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/159270.html</trackback:ping><description><![CDATA[<p>typename一共就两种用法</p>
<p>&#9312;修饰模板参数,说明它是一个类型.此时可以用class关键字来代替.</p>
<p>&#9313;修饰嵌套依赖类型名</p>
<p>&nbsp;</p>
<p>关于第&#9313;点要说明如下:</p>
<p>&nbsp;</p>
<p>1. 依赖类型名: 一个模板中的 依赖于一个模板参数的名字.</p>
<p>2. 嵌套依赖类型名: 嵌套在一个类内部的一个依赖类型名</p>
<p>&nbsp;</p>
<p>比如:</p>
<p>std::list&lt;T&gt;</p>
<p>首先,它是一个依赖于模板参数的类型,所以它是一个依赖类型名</p>
<p>其次,它也是一个嵌套在std内部的类型,所以它是 嵌套依赖类型名,需要用typename来修饰.如下:</p>
<p>typename std::list&lt;T&gt; m_lstT;</p>
<p>&nbsp;</p>
<p>记住:</p>
<p>在涉及到一个模板中的嵌套依赖类型名的任何时候,都必须把typename放在紧挨着它的前面</p><img src ="http://www.cppblog.com/API/aggbug/159270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-10-28 14:39 <a href="http://www.cppblog.com/API/archive/2011/10/28/159270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断两日期是否在同一周内</title><link>http://www.cppblog.com/API/archive/2011/06/23/149341.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Thu, 23 Jun 2011 10:49:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/06/23/149341.html</guid><wfw:comment>http://www.cppblog.com/API/comments/149341.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/06/23/149341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/149341.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/149341.html</trackback:ping><description><![CDATA[<div><span style="font-size: 14pt">一.原由</span><br /><span style="font-size: 14pt">&nbsp;&nbsp;&nbsp; 最近需要编写判断两个日期是否是属于同一周的判断。思路如下：</span><br /><span style="font-size: 14pt">&nbsp; 将每个日期的星期几都归到周一，比如2011-6-23是周四。那将日期减去3天。为2011-6-21正好为周一</span><br /><span style="font-size: 14pt">&nbsp;。于是将两个日期都按上述方式调整。得到的日期，看是否相等。如果相等，说明两日期是在同一周。</span><br /><br /><span style="font-size: 14pt">二。具体代码如下： </span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetMonday(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Date)<br /><img id="Codehighlighter1_24_379_Open_Image" onclick="this.style.display='none'; Codehighlighter1_24_379_Open_Text.style.display='none'; Codehighlighter1_24_379_Closed_Image.style.display='inline'; Codehighlighter1_24_379_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_24_379_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_24_379_Closed_Text.style.display='none'; Codehighlighter1_24_379_Open_Image.style.display='inline'; Codehighlighter1_24_379_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_24_379_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_24_379_Open_Text"><span style="color: #000000">{<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;tm&nbsp;t;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;t_of_day;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t.tm_year</span><span style="color: #000000">=</span><span style="color: #000000">Date</span><span style="color: #000000">/</span><span style="color: #000000">10000</span><span style="color: #000000">-</span><span style="color: #000000">1900</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t.tm_mon</span><span style="color: #000000">=</span><span style="color: #000000">Date</span><span style="color: #000000">/</span><span style="color: #000000">100</span><span style="color: #000000">%</span><span style="color: #000000">100</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t.tm_mday</span><span style="color: #000000">=</span><span style="color: #000000">Date</span><span style="color: #000000">%</span><span style="color: #000000">100</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t.tm_hour</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t.tm_min</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t.tm_sec</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t.tm_isdst</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t_of_day</span><span style="color: #000000">=</span><span style="color: #000000">mktime(</span><span style="color: #000000">&amp;</span><span style="color: #000000">t);<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;tm&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pTmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">localtime(</span><span style="color: #000000">&amp;</span><span style="color: #000000">t_of_day);<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;day;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;week&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pTmp</span><span style="color: #000000">-&gt;</span><span style="color: #000000">tm_wday;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(week</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;week&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;day&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;week&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;t_of_day&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;day</span><span style="color: #000000">*</span><span style="color: #000000">24</span><span style="color: #000000">*</span><span style="color: #000000">3600</span><span style="color: #000000">;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;t_of_day;<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_tmain(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;argv[])<br /><img id="Codehighlighter1_37_196_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_196_Open_Text.style.display='none'; Codehighlighter1_37_196_Closed_Image.style.display='inline'; Codehighlighter1_37_196_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_37_196_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_196_Closed_Text.style.display='none'; Codehighlighter1_37_196_Open_Image.style.display='inline'; Codehighlighter1_37_196_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_37_196_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_37_196_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;aa&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetMonday(</span><span style="color: #000000">20110109</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetMonday(</span><span style="color: #000000">20110110</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(aa&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;bb)<br /><img id="Codehighlighter1_118_156_Open_Image" onclick="this.style.display='none'; Codehighlighter1_118_156_Open_Text.style.display='none'; Codehighlighter1_118_156_Closed_Image.style.display='inline'; Codehighlighter1_118_156_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_118_156_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_118_156_Closed_Text.style.display='none'; Codehighlighter1_118_156_Open_Image.style.display='inline'; Codehighlighter1_118_156_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_118_156_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_118_156_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">为同一周内!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">不为同一周内!\n</span><span style="color: #000000">"</span><span style="color: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div><br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/API/aggbug/149341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-06-23 18:49 <a href="http://www.cppblog.com/API/archive/2011/06/23/149341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 虚析构函数的问题</title><link>http://www.cppblog.com/API/archive/2011/03/11/141565.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 11 Mar 2011 07:10:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/03/11/141565.html</guid><wfw:comment>http://www.cppblog.com/API/comments/141565.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/03/11/141565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/141565.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/141565.html</trackback:ping><description><![CDATA[一.虚析构函数说明<br>&nbsp;&nbsp;&nbsp; 一般来说,如果有被子类继承的类,尽可能的加上关键字virtual,特别是以下情况,可能没有调用子类的析<br>构造成内存泄露.<br><br>二.代码示例:<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">conio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CBase<br><img id=Codehighlighter1_73_164_Open_Image onclick="this.style.display='none'; Codehighlighter1_73_164_Open_Text.style.display='none'; Codehighlighter1_73_164_Closed_Image.style.display='inline'; Codehighlighter1_73_164_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_73_164_Closed_Image onclick="this.style.display='none'; Codehighlighter1_73_164_Closed_Text.style.display='none'; Codehighlighter1_73_164_Open_Image.style.display='inline'; Codehighlighter1_73_164_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_73_164_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_73_164_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注意有加virtual与不加virtual运行情况</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CBase()<br><img id=Codehighlighter1_124_162_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_162_Open_Text.style.display='none'; Codehighlighter1_124_162_Closed_Image.style.display='inline'; Codehighlighter1_124_162_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_124_162_Closed_Image onclick="this.style.display='none'; Codehighlighter1_124_162_Closed_Text.style.display='none'; Codehighlighter1_124_162_Open_Image.style.display='inline'; Codehighlighter1_124_162_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_124_162_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_124_162_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">CBase&nbsp;destructor!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CChild:</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;CBase<br><img id=Codehighlighter1_194_257_Open_Image onclick="this.style.display='none'; Codehighlighter1_194_257_Open_Text.style.display='none'; Codehighlighter1_194_257_Closed_Image.style.display='inline'; Codehighlighter1_194_257_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_194_257_Closed_Image onclick="this.style.display='none'; Codehighlighter1_194_257_Closed_Text.style.display='none'; Codehighlighter1_194_257_Open_Image.style.display='inline'; Codehighlighter1_194_257_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_194_257_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_194_257_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CChild()<br><img id=Codehighlighter1_216_255_Open_Image onclick="this.style.display='none'; Codehighlighter1_216_255_Open_Text.style.display='none'; Codehighlighter1_216_255_Closed_Image.style.display='inline'; Codehighlighter1_216_255_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_216_255_Closed_Image onclick="this.style.display='none'; Codehighlighter1_216_255_Closed_Text.style.display='none'; Codehighlighter1_216_255_Open_Image.style.display='inline'; Codehighlighter1_216_255_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_216_255_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_216_255_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">CChild&nbsp;destructor!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br><img id=Codehighlighter1_294_604_Open_Image onclick="this.style.display='none'; Codehighlighter1_294_604_Open_Text.style.display='none'; Codehighlighter1_294_604_Closed_Image.style.display='inline'; Codehighlighter1_294_604_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_294_604_Closed_Image onclick="this.style.display='none'; Codehighlighter1_294_604_Closed_Text.style.display='none'; Codehighlighter1_294_604_Open_Image.style.display='inline'; Codehighlighter1_294_604_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_294_604_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_294_604_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_297_350_Open_Image onclick="this.style.display='none'; Codehighlighter1_297_350_Open_Text.style.display='none'; Codehighlighter1_297_350_Closed_Image.style.display='inline'; Codehighlighter1_297_350_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_297_350_Closed_Image onclick="this.style.display='none'; Codehighlighter1_297_350_Closed_Text.style.display='none'; Codehighlighter1_297_350_Open_Image.style.display='inline'; Codehighlighter1_297_350_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_297_350_Closed_Text>/**/</span><span id=Codehighlighter1_297_350_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;以下打印结果是<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CChild&nbsp;destructor!<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CBase&nbsp;destructor!<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CChild&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pchild&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CChild();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pchild;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img id=Codehighlighter1_404_534_Open_Image onclick="this.style.display='none'; Codehighlighter1_404_534_Open_Text.style.display='none'; Codehighlighter1_404_534_Closed_Image.style.display='inline'; Codehighlighter1_404_534_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_404_534_Closed_Image onclick="this.style.display='none'; Codehighlighter1_404_534_Closed_Text.style.display='none'; Codehighlighter1_404_534_Open_Image.style.display='inline'; Codehighlighter1_404_534_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_404_534_Closed_Text>/**/</span><span id=Codehighlighter1_404_534_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;1.以下代码有加virtual运行结果是:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CChild&nbsp;destructor!<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CBase&nbsp;destructor!<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;2.去掉virtual运行结果如下:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CBase&nbsp;destructor!<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;可以看到,没有调用CChild的析构函数<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CBase&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pBase&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CChild();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pBase;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;_getch();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/API/aggbug/141565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-03-11 15:10 <a href="http://www.cppblog.com/API/archive/2011/03/11/141565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初始化成员列表以及四种强制类型转换使用</title><link>http://www.cppblog.com/API/archive/2011/03/08/141351.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Tue, 08 Mar 2011 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/03/08/141351.html</guid><wfw:comment>http://www.cppblog.com/API/comments/141351.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/03/08/141351.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/141351.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/141351.html</trackback:ping><description><![CDATA[<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">conio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CParent<br><img id=Codehighlighter1_135_331_Open_Image onclick="this.style.display='none'; Codehighlighter1_135_331_Open_Text.style.display='none'; Codehighlighter1_135_331_Closed_Image.style.display='inline'; Codehighlighter1_135_331_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_135_331_Closed_Image onclick="this.style.display='none'; Codehighlighter1_135_331_Closed_Text.style.display='none'; Codehighlighter1_135_331_Open_Image.style.display='inline'; Codehighlighter1_135_331_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_135_331_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_135_331_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_155_156_Open_Image onclick="this.style.display='none'; Codehighlighter1_155_156_Open_Text.style.display='none'; Codehighlighter1_155_156_Closed_Image.style.display='inline'; Codehighlighter1_155_156_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_155_156_Closed_Image onclick="this.style.display='none'; Codehighlighter1_155_156_Closed_Text.style.display='none'; Codehighlighter1_155_156_Open_Image.style.display='inline'; Codehighlighter1_155_156_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CParent()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_155_156_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_155_156_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">以下在构造函数是初始化成员列表,多个用逗号隔开</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_246_247_Open_Image onclick="this.style.display='none'; Codehighlighter1_246_247_Open_Text.style.display='none'; Codehighlighter1_246_247_Closed_Image.style.display='inline'; Codehighlighter1_246_247_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_246_247_Closed_Image onclick="this.style.display='none'; Codehighlighter1_246_247_Closed_Text.style.display='none'; Codehighlighter1_246_247_Open_Image.style.display='inline'; Codehighlighter1_246_247_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CParent(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;strName,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;age):strName(strName),m_age(age)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_246_247_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_246_247_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">&nbsp;<br><img id=Codehighlighter1_275_291_Open_Image onclick="this.style.display='none'; Codehighlighter1_275_291_Open_Text.style.display='none'; Codehighlighter1_275_291_Closed_Image.style.display='inline'; Codehighlighter1_275_291_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_275_291_Closed_Image onclick="this.style.display='none'; Codehighlighter1_275_291_Closed_Text.style.display='none'; Codehighlighter1_275_291_Open_Image.style.display='inline'; Codehighlighter1_275_291_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;GetName()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_275_291_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_275_291_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;strName;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;strName;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_age;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CChild:</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;CParent<br><img id=Codehighlighter1_364_571_Open_Image onclick="this.style.display='none'; Codehighlighter1_364_571_Open_Text.style.display='none'; Codehighlighter1_364_571_Closed_Image.style.display='inline'; Codehighlighter1_364_571_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_364_571_Closed_Image onclick="this.style.display='none'; Codehighlighter1_364_571_Closed_Text.style.display='none'; Codehighlighter1_364_571_Open_Image.style.display='inline'; Codehighlighter1_364_571_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_364_571_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_364_571_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化成员列表父类与本类的成员<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">加入explicit关键字,防止隐式类型转换</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_507_508_Open_Image onclick="this.style.display='none'; Codehighlighter1_507_508_Open_Text.style.display='none'; Codehighlighter1_507_508_Closed_Image.style.display='inline'; Codehighlighter1_507_508_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_507_508_Closed_Image onclick="this.style.display='none'; Codehighlighter1_507_508_Closed_Text.style.display='none'; Codehighlighter1_507_508_Open_Image.style.display='inline'; Codehighlighter1_507_508_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">explicit</span><span style="COLOR: #000000">&nbsp;CChild(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;strName):CParent(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Parent:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">strName,</span><span style="COLOR: #000000">34</span><span style="COLOR: #000000">),strName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Child:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">strName)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_507_508_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_507_508_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_527_543_Open_Image onclick="this.style.display='none'; Codehighlighter1_527_543_Open_Text.style.display='none'; Codehighlighter1_527_543_Closed_Image.style.display='inline'; Codehighlighter1_527_543_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_527_543_Closed_Image onclick="this.style.display='none'; Codehighlighter1_527_543_Closed_Text.style.display='none'; Codehighlighter1_527_543_Open_Image.style.display='inline'; Codehighlighter1_527_543_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;GetName()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_527_543_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_527_543_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;strName;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;strName;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_613_1846_Open_Image onclick="this.style.display='none'; Codehighlighter1_613_1846_Open_Text.style.display='none'; Codehighlighter1_613_1846_Closed_Image.style.display='inline'; Codehighlighter1_613_1846_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_613_1846_Closed_Image onclick="this.style.display='none'; Codehighlighter1_613_1846_Closed_Text.style.display='none'; Codehighlighter1_613_1846_Open_Image.style.display='inline'; Codehighlighter1_613_1846_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_613_1846_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_613_1846_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;pause;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用父类构造</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CParent&nbsp;parent(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">parent</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">56</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">parent.GetName()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用子类构造</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CChild&nbsp;child(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sky</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">child.GetName()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">子类构造有加explicit,不可以稳式转换<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">CChild&nbsp;child1&nbsp;=&nbsp;"explicitTest";<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">cout&lt;&lt;child1.GetName()&lt;&lt;endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1.static_cast类型转换<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">a.指针转换</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CParent&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pParent</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;pParent&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CParent</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">child)&nbsp;;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">pParent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetName()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用的是CChild类的GetName<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">b.对象间转换</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CParent&nbsp;tmpParent;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">tmpParent&nbsp;=&nbsp;(CParent)child;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;tmpParent&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CParent</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(child)&nbsp;;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">tmpParent.GetName()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用的是父类GetName,因为tmpParent是Cparent对象<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">虚表不起作用<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">2.dynamic_cast类型转换</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CChild&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pChild1;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CChild&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pChild2;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;pChild1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dynamic_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CChild</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">parent);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将返回空指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pChild2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CChild</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">parent);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">返回的是parent地址.但调用子类的方法,将不安全</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_1411_1503_Open_Image onclick="this.style.display='none'; Codehighlighter1_1411_1503_Open_Text.style.display='none'; Codehighlighter1_1411_1503_Closed_Image.style.display='inline'; Codehighlighter1_1411_1503_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1411_1503_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1411_1503_Closed_Text.style.display='none'; Codehighlighter1_1411_1503_Open_Image.style.display='inline'; Codehighlighter1_1411_1503_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1411_1503_Closed_Text>/**/</span><span id=Codehighlighter1_1411_1503_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">dynamic_cast支持交叉转换<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;如果B继承A,C也继承A.<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;那么将B用static_cast转成C是编译错误<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;将B用dynamic_cast转成C返回NULL指针<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">3.const_cast</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;CParent&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">constParent</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CParent&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pParent1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;const_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CParent</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(constParent);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">4.reinterpret_cast<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">最底层的重新解释<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">reinterpret_cast原原本本的位复制,而static_cast有内部解析转换</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;d1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;(n);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">d1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;d2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(n);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">d2</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;_getch();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/API/aggbug/141351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-03-08 14:54 <a href="http://www.cppblog.com/API/archive/2011/03/08/141351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>友元friend在运算符重载中应用</title><link>http://www.cppblog.com/API/archive/2011/03/04/141119.html</link><dc:creator>C++技术中心</dc:creator><author>C++技术中心</author><pubDate>Fri, 04 Mar 2011 07:51:00 GMT</pubDate><guid>http://www.cppblog.com/API/archive/2011/03/04/141119.html</guid><wfw:comment>http://www.cppblog.com/API/comments/141119.html</wfw:comment><comments>http://www.cppblog.com/API/archive/2011/03/04/141119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/API/comments/commentRss/141119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/API/services/trackbacks/141119.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">conio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CProduct<br><img id=Codehighlighter1_95_314_Open_Image onclick="this.style.display='none'; Codehighlighter1_95_314_Open_Text.style.display='none'; Codehighlighter1_95_314_Closed_Image.style.display='inline'; Codehighlighter1_95_314_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_95_314_Closed_Image onclick="this.style.display='none'; Codehighlighter1_95_314_Closed_Text.style.display='none'; Codehighlighter1_95_314_Open_Image.style.display='inline'; Codehighlighter1_95_314_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_95_314_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_95_314_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CProduct(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;high,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;weight,&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;productName);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;os,CProduct&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">product);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_high;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">高</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_weight;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">重量</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;m_productName;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">产品名称</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(ostream</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;os,CProduct&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">product)<br><img id=Codehighlighter1_371_496_Open_Image onclick="this.style.display='none'; Codehighlighter1_371_496_Open_Text.style.display='none'; Codehighlighter1_371_496_Closed_Image.style.display='inline'; Codehighlighter1_371_496_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_371_496_Closed_Image onclick="this.style.display='none'; Codehighlighter1_371_496_Closed_Text.style.display='none'; Codehighlighter1_371_496_Open_Image.style.display='inline'; Codehighlighter1_371_496_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_371_496_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_371_496_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Product&nbsp;Name:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">product.m_productName</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;weight:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">product.m_weight</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;high:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">product.m_high</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;os;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;inline&nbsp;CProduct::CProduct(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;high,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;weight,&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;productName)<br><img id=Codehighlighter1_568_658_Open_Image onclick="this.style.display='none'; Codehighlighter1_568_658_Open_Text.style.display='none'; Codehighlighter1_568_658_Closed_Image.style.display='inline'; Codehighlighter1_568_658_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_568_658_Closed_Image onclick="this.style.display='none'; Codehighlighter1_568_658_Closed_Text.style.display='none'; Codehighlighter1_568_658_Open_Image.style.display='inline'; Codehighlighter1_568_658_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_568_658_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_568_658_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_high&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;high;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_weight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;weight;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_productName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;productName;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br><img id=Codehighlighter1_693_767_Open_Image onclick="this.style.display='none'; Codehighlighter1_693_767_Open_Text.style.display='none'; Codehighlighter1_693_767_Closed_Image.style.display='inline'; Codehighlighter1_693_767_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_693_767_Closed_Image onclick="this.style.display='none'; Codehighlighter1_693_767_Closed_Text.style.display='none'; Codehighlighter1_693_767_Open_Image.style.display='inline'; Codehighlighter1_693_767_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_693_767_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_693_767_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;CProduct&nbsp;product(</span><span style="COLOR: #000000">175</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pig</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">product;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;getch();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/API/aggbug/141119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/API/" target="_blank">C++技术中心</a> 2011-03-04 15:51 <a href="http://www.cppblog.com/API/archive/2011/03/04/141119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>