﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-沐枫小筑(C++)</title><link>http://www.cppblog.com/ly4cn/</link><description>爱老婆，要比编程多一点...</description><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:09:09 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:09:09 GMT</pubDate><ttl>60</ttl><item><title>推荐一个稍微好用些的svn服务器</title><link>http://www.cppblog.com/ly4cn/archive/2007/12/15/38570.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Sat, 15 Dec 2007 10:34:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/12/15/38570.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/38570.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/12/15/38570.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/38570.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/38570.html</trackback:ping><description><![CDATA[今天安装svn服务器。上官网下载，发现windows下有一个稍微好用些的svn服务器。<br>
下载地址： http://www.visualsvn.com/server/<br>
<br>
这个东西有几个特色：<br>
1. 安装和配置过程很方便（最大优点之一）<br>
2. 自带apache/ssl/mod_dav_svn/...等模块，既小巧，又简单，也安全一些。<br>
3. 自带MSC管理工具，可以创建用户、用户组，还可以管理多个源码库，以及配置各个路径的访问权限（最大优点之二）<br>
<br>
通过上面下载地址，可以看到截图。不过，截图的版本稍低点。目前的版本是1.01。核心是Svn1.45，与官方同步。其实它也是为官方提供windows移植版的网站之一。<br>
<br>
需要注意的是，这个网站提供的VisualSVN
Server是免费的，而客户端VisualSVN是收费的。我们可以不用该客户端，客户端还是用TortoiseSVN/AnkhSVN之类的。
VisualSVN客户端从介绍上看，与AkuhSVN是差不多的，只不过功能上略有优点。定价是$49。 <img src ="http://www.cppblog.com/ly4cn/aggbug/38570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-12-15 18:34 <a href="http://www.cppblog.com/ly4cn/archive/2007/12/15/38570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中的一个很奇怪的问题－－关于C4244</title><link>http://www.cppblog.com/ly4cn/archive/2007/11/30/37550.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Fri, 30 Nov 2007 04:50:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/11/30/37550.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/37550.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/11/30/37550.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/37550.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/37550.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 从VC2003到VC2005，一直有一个很奇怪的问题。<br>
&nbsp;&nbsp;&nbsp; 如下的代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;s1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;s2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;s1&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;s2;<br>
</span></div>
&nbsp;&nbsp;&nbsp; 在这两个编译器的 /w4 四级警告打开的时候，就冒出以下的警告来：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">warning&nbsp;C4244:&nbsp;&#8220;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&#8221;:&nbsp;从&#8220;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&#8221;转换到&#8220;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&#8221;，可能丢失数据</span></div>
&nbsp;&nbsp;&nbsp; 为了消除这个警，只能将 += 拆成 = 和 +，如 s1 = s1 + s2。<br>
<br>
&nbsp;&nbsp;&nbsp; 终于，这个问题在VC2008消失了。<img src ="http://www.cppblog.com/ly4cn/aggbug/37550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-11-30 12:50 <a href="http://www.cppblog.com/ly4cn/archive/2007/11/30/37550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汉语编程++</title><link>http://www.cppblog.com/ly4cn/archive/2007/10/17/34476.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Wed, 17 Oct 2007 12:22:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/10/17/34476.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/34476.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/10/17/34476.html#Feedback</comments><slash:comments>38</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/34476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/34476.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 没想到汉语编程又有人开始网上对骂了。一方指另一方骗人，一方吹自已伟大。<br>
&nbsp;&nbsp;&nbsp; 今天群里头有人又把它翻出来了，刚好无聊，也就发明了一个汉语编程语言，集成到visual studio 2005的IDE中，名字就叫汉语编程++，欢迎同样无聊的朋友试用。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">常用头文件</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>
<br>
<br>
整数&nbsp;主函数(整数&nbsp;参数数量,&nbsp;字符指针&nbsp;参数 是数组)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;整数&nbsp;变量1&nbsp;赋值为&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">;<br>
&nbsp;&nbsp;&nbsp;&nbsp;如果(变量1&nbsp;大于&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打印(</span><span style="color: #000000;">"</span><span style="color: #000000;">可以中文编程\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;系统命令(</span><span style="color: #000000;">"</span><span style="color: #000000;">Pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>
&nbsp;&nbsp;&nbsp;&nbsp;返回&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>
}<br>
<br>
</span></div>
<br>
&nbsp;&nbsp;&nbsp; 运行结果就是：&#8220;可以中文编程&#8221;<br>
&nbsp;&nbsp;&nbsp; 语法呢，就是C++一样的，那个&#8220;常用头文件&#8221;的内容如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;整数&nbsp;int</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;如果&nbsp;if</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;大于&nbsp;&gt;</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;打印&nbsp;printf</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;系统命令&nbsp;system</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;赋值为&nbsp;=</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;主函数&nbsp;_tmain</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;字符指针&nbsp;_TCHAR*</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;是数组&nbsp;[]</span><span style="color: #000000;"><br>
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;返回</span><span style="color: #000000;"><br>
<br>
#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tchar.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>
#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span></div>
<br>
&nbsp;&nbsp;&nbsp; 唯一美中不足的是，#include暂时无法汉化。于是劝群里的人用这个写写情书，结果，没人响应...<br><span style="color: #ff0000;">
&nbsp;&nbsp;&nbsp; 不过，#include 可以在项目属性中去掉它（C++高级选项：强制包含），或是指定编译命令参数 /FI "常用头文件" ，这样就可以去掉上面的&#8220;#include "常用头文件"&#8221;了。&nbsp;&nbsp;  </span><br>
-----<br>
以上程序在VC++2005上编译并运行通过。<br>
<br>
附群朋友的程序：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">高興不&lt;&gt;&nbsp; 19:54:59<br>还真有这么玩的啊 <br>沐枫(Liny)()&nbsp; 19:55:02<br>各位朋友，咱们提供一个头文件，于是全中国人都可以用vc++2005来进行中文编程了。<br>风在奔跑()&nbsp; 19:55:05<br>我从来没这么玩过. <br>沐枫(Liny)()&nbsp; 19:55:19<br>玩玩吧，挺好玩的。<br>风在奔跑()&nbsp; 19:55:28<br>干脆把所有函数用中文define成一个中文编程库. <br>沐枫(Liny)()&nbsp; 19:55:30<br>不就是一堆#defing<br>沐枫(Liny)()&nbsp; 20:13:43<br>用这个写情书吧各位。<br>西瓜()&nbsp; 20:13:57<br>女朋友不懂程序怎么办 <br>ＴＬＡＨ()&nbsp; 20:13:58<br>这样的情书...球球不会喜欢的 <br>高興不&lt;&gt;&nbsp; 20:14:04<br>。。。情书里就一个弹出的对话框"欲知详情，请看代码" <br>西瓜()&nbsp; 20:14:17<br>球球又没出现 <br><br>ＴＬＡＨ()&nbsp;&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">19</span><span style="color: #000000;">:</span><span style="color: #000000;">00</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;趁还&nbsp;while</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;那个啥&nbsp;int</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;总的来说&nbsp;main</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;买&nbsp;cin</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;卖&nbsp;cout</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;进&nbsp;&gt;&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;出&nbsp;&lt;&lt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;拜拜了&nbsp;return</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;去掉&nbsp;-=</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;等于&nbsp;=</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;屁&nbsp;100e4</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;我说&nbsp;(</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;是吧&nbsp;)</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;啊&nbsp;a</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;那么就&nbsp;{</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;得了&nbsp;}</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;呀&nbsp;;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br><br>那个啥&nbsp;总的来说&nbsp;我说&nbsp;那个啥&nbsp;啊&nbsp;是吧<br>那么就&nbsp;那个啥&nbsp;有钱&nbsp;等于&nbsp;屁&nbsp;呀<br>趁还&nbsp;我说&nbsp;有钱&nbsp;是吧&nbsp;&nbsp;&nbsp;&nbsp;那么就<br>那个啥&nbsp;多少&nbsp;呀&nbsp;买&nbsp;进&nbsp;多少&nbsp;呀&nbsp;卖&nbsp;出&nbsp;多少&nbsp;呀&nbsp;有钱&nbsp;去掉&nbsp;多少&nbsp;呀<br>卖&nbsp;出&nbsp;多少&nbsp;呀&nbsp;得了<br>拜拜了&nbsp;啊&nbsp;呀&nbsp;得了&nbsp;<br><br>高興不</span><span style="color: #000000;">&lt;&gt;</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">19</span><span style="color: #000000;">:</span><span style="color: #000000;">30</span><span style="color: #000000;"><br>最有语义的中文编程诞生了&nbsp;<br><br><br></span><span style="color: #000000;"><br></span></div><img src ="http://www.cppblog.com/ly4cn/aggbug/34476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-10-17 20:22 <a href="http://www.cppblog.com/ly4cn/archive/2007/10/17/34476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从赋值到初始化</title><link>http://www.cppblog.com/ly4cn/archive/2007/09/27/33039.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Thu, 27 Sep 2007 09:39:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/09/27/33039.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/33039.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/09/27/33039.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/33039.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/33039.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;C语言确实很优雅，整个语言的设计简洁一致。而在C++中，有一个让人诟病的问题就是变量初始化的不一致性。<br>&nbsp;&nbsp;&nbsp;C语言中的初始化，都是用花括号进行，简单美观：</p>
<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"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;array[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Point&nbsp;point&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Point&nbsp;arrPoint[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br>{<br>&nbsp;&nbsp;{</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">},<br>&nbsp;&nbsp;{</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">},<br>&nbsp;&nbsp;{</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">}<br>};</span></div>
<br>&nbsp;&nbsp;&nbsp;C++自然也兼容了C语言的初始化机制。然而，C++的Class乃至STL都不支持。它们要用不同的方式来初始化， 甚至根本不能够直接初始化， 只能使用运行时的赋值。<br>&nbsp;&nbsp;&nbsp;比如Class：
<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"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Param<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Age;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Value;<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Level;<br>};<br><br>Param&nbsp;param&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">};&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;ERROR</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">Param&nbsp;param&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">};&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">ERROR</span></div>
&nbsp;&nbsp;&nbsp;无法初始化。而如果不初始化的话，所有的成员而处于无政府状态，这显然很不让人放心。于是，C++提供了专门用于Class的初始化方式－－构造函数：<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"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Param<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;Param(</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)<br>&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;x_(x),&nbsp;y_(y)<br>&nbsp;&nbsp;{}<br>&nbsp;&nbsp;Param()<br>&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;x_(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">),&nbsp;y_(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;{}<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x_,&nbsp;y_;<br>};<br><br>Param&nbsp;param(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">或</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">Param&nbsp;param;</span></div>
&nbsp;&nbsp;&nbsp;有了构造函数，可以在构造函数的初始化列表中对成员进行初始化。可是很明显，这里头还是有一个陷阱，默认构造初始化和非默认构造初始化的调用方式是不一致的。默认构造函数不能用括号来调用，否则编译器将会发疯：<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"><span style="COLOR: #000000">Param&nbsp;param();</span></div>
&nbsp;&nbsp;&nbsp;它会把上面的语句看成是函数声明，而后面调用的时候就会出错，而错误信息可能会让你抓狂一下。但是这样也就算了，偏偏 new 可以接受有括号和没括号两种写法：<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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Param</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Param;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Param</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Param();</span></div>
&nbsp;&nbsp;&nbsp;再来说说初始化列表。初始化列表，事实上，也只能支持简单的标量类型，诸如int,bool,指针之类的；复杂点的，如数组、结构，不好意思，不支持－－只能在构造函数体中进行赋值。还有一个很迷糊初学者的问题是，成员初始化的顺序仅依赖于成员定义的顺序，而不是初始化列表中的顺序。<br><br>&nbsp;&nbsp;&nbsp;再比如STL容器，这下好象更惨，连构造函数都帮不上忙了，除了初始化一个空的容器，或是复制一下别的容器，我们只能做用默认构造函数进行初始化。我们拿数组和vecotr做个比较：<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"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;数组</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;arr[]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">};<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;vector</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;iarr;<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;必须在某个函数中赋初值</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;init()<br>{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;iarr.push_back(i);<br>}</span></div>
<br>&nbsp;&nbsp;&nbsp;再复杂一点的数据结构，那单单赋值程序就要写上老长，而且还不好看。还要记得调用。这对于仅仅是简单的设置一些初值的用途来说，太过于烦琐。<br><br>&nbsp;&nbsp;&nbsp;横向比较，这次好象C++还不会太落伍，只有C和动态语言提供了初始化特性，其它支持OO高级语言好象都是学C++的。如Java, C#(注C#3.0开始提供初始化功能)...<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;C++能不能做到简洁一致的实始化呢？<br>&nbsp;&nbsp;&nbsp;Boost的assign库做了许多有益的工作。使用assign库，至少现在可以初始化了： <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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;arr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;list_of(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;boost::tuple</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;tuple;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">tuple</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tuple_list_of(&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">foo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;)(&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bar</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;map_list_of(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;names&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;list_of(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Mr.&nbsp;Foo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Mr.&nbsp;Bar</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Mrs.&nbsp;FooBar</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;).to_adapter();</span></div>
&nbsp;&nbsp;&nbsp;如果是赋值，也可以简略很多：<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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;v;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>v&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,repeat(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">),</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;v&nbsp;=&nbsp;[1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,7,8,9]</span></div>
&nbsp; 不过，也仅能如此了。assign经过许多努力，也仅能支持容器的初始化，而且还不够漂亮。<br><br>&nbsp;&nbsp;&nbsp;C++0x已确定提供与C一致的初始化功能。 <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n2215.pdf"><u><font color=#0000ff>Initialer lists</font></u></a>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2220.pdf"><u><font color=#0000ff>Initializer Lists for Standard Containers</font></u></a>&nbsp;<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2385.pdf"><u><font color=#0000ff>Initializer lists WP wording</font></u></a>&nbsp;等草案就是为了这个目的服务的。<br>&nbsp;&nbsp;&nbsp;如果使用C++0x，那么程序的初始化将变得清晰和一致：<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"><span style="COLOR: #000000">complex</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">};&nbsp;<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">或</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">complex</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;z&nbsp;{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">};&nbsp;<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;初始化中，有等号和无等号都是允许的，下同。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">z&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">};<br><br></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">1</span><span style="COLOR: #000000">};&nbsp;<br><br></span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">once</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">upon</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">time</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">};&nbsp;<br><br>f(&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Nicholas</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Annemarie</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}&nbsp;);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;参数是两个元素的列表</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;{&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Norah</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;};&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;返回只有一个元素的列表</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;e&nbsp;{};&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;初始化为0或NULL指针</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;anim&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bear</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">},&nbsp;<br>&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cassovary</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">},&nbsp;<br>&nbsp;&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tiger</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">}&nbsp;<br>};&nbsp;</span></div>
<br>&nbsp;&nbsp;&nbsp;这好象是C++欠了十多年的债吧。<br>&nbsp;&nbsp;&nbsp;<br>
<img src ="http://www.cppblog.com/ly4cn/aggbug/33039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-09-27 17:39 <a href="http://www.cppblog.com/ly4cn/archive/2007/09/27/33039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从for到foreach</title><link>http://www.cppblog.com/ly4cn/archive/2007/09/26/32945.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Wed, 26 Sep 2007 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/09/26/32945.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/32945.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/09/26/32945.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/32945.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/32945.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 一直在使用C/C++，对于循环语句while、do while、for，对于for情有独钟，因为其简洁、清晰、灵活。访问数组类型的变量，只有for写出来的语句是最易于阅读的，如：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;arr[N]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #008000;">/*</span><span style="color: #008000;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif"></span><span style="color: #008000;">*/</span><span style="color: #000000;">};<br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;N;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br>&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">arr[%d]&nbsp;=&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;i,&nbsp;arr[i]);</span></div>
<br>&nbsp;&nbsp;&nbsp; 然而，这种情况，到了STL时，就有些变味了：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">(vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MyClass</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::const_iterator&nbsp;iter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m_vecData.begin();&nbsp;iter&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;m_vecData.end();&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">iter)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">iter</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">IsBusy())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">DoSomeThing(param);<br>}<br></span></div>
&nbsp;&nbsp;&nbsp; 这么长的一个for，不再给人一种清晰的感觉了。或许因为这个程序比较短，还没有太大的感觉，当回头去看自已的程序中，有不少这样的写法时，我就觉得一阵心烦。改改？<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">(size_t&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;m_vecData.size();&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">m_vecData[i].IsBusy())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_vecData[i].DoSomeThing(param);<br>}</span></div>
&nbsp;&nbsp;&nbsp; 不错，还是简单点好啊。但是因为这里举的是vector的例子。如果是list或是别的什么容器，就行不通了。<br>&nbsp;&nbsp;&nbsp; 其它的高级语言，都提供了foreach或是for in语句，写出来就很清晰：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">foreach</span><span style="color: #000000;">(item&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;m_vecData)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">item.IsBusy())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomeThing(param);<br>}</span></div>
&nbsp;&nbsp;&nbsp; C++是不是也可以这么简单？好象STL中也有一个for_each，试着改写一下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">struct</span><span style="color: #000000;"> IfNotBusyThenDoSomeThing<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;"></span><span style="color: #000000;">IfNotBusyThenDoSomeThing</span><span style="color: #000000;">(</span><span style="color: #000000;"></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Param</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;param)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;param_(param)<br>&nbsp;&nbsp;&nbsp;&nbsp;{}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">operator</span><span style="color: #000000;">()&nbsp;(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;MyClass</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;item)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">item.IsBusy())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomeThing(param_);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;Param</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;param_;<br>};<br><br>for_each(m_vecData.begin(),&nbsp;m_vecData.end(), </span><span style="color: #000000;">IfNotBusyThenDoSomeThing</span><span style="color: #000000;">(param));</span></div>
&nbsp;&nbsp;&nbsp; 不错，for语句简单了，但是却多了<span style="color: #000000;">IfNotBusyThenDoSomeThing的定义，这代码可是多了好几倍。要是每个循环都要来这么一下，我还不如直接写for，要来得爽快一些。或许还有别的办法：<br></span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MyClass</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;notBusyClass;<br>remove_copy_if(m_vecData.begin(),&nbsp;m_vecData.end(),&nbsp;inserter(notBusyClass,&nbsp;notBusyClass.begin()), mem_fun_ref(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyClass::IsBusy));<br>for_each(notBusyClass.begin(),&nbsp;notBusyClass.end(),&nbsp;bind2nd(mem_fun_ref(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyClass::DoSomeThing),&nbsp;param));</span></div>
&nbsp;&nbsp;&nbsp; 天哪，这种写法好象更恐怖。而且，还不是每种情况都能用的：<br>&nbsp;&nbsp;&nbsp; 1. notBusyClass不能是vector&lt;const MyClass&amp;&gt;，因为不能建立指向引用的指针。这就要求MyClass是可拷贝的。但就算是可拷贝的，有时候拷贝成本也是很高的。<br>&nbsp;&nbsp;&nbsp; 2. MyClass::DoSomeThing的参数不能是引用（我们常定义参数为：const Param&amp;），因为不能定义引用的引用这种类型。<br>&nbsp;&nbsp;&nbsp; 3. 一旦出现错误，这错误信息会让人极其昏倒。<br><br>&nbsp;&nbsp;&nbsp; 看来单靠标准C++是不成的。Boost的lambda的库似乎很不错，用用：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">for_each(m_vecData.begin(),&nbsp;m_vecData.end(), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if_then( !bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyClass::IsBusy,&nbsp;_1), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyClass::DoSomeThing,&nbsp;_1,&nbsp;param)));<br></span><span style="color: #000000;"></span></div>
&nbsp;&nbsp;&nbsp; 不错，好了一些，但是还是很不好看。有没有更好的？有，boost1.34新加入的BOOST_FOREACH：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">BOOST_FOREACH(cosnt&nbsp;MyClass</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;item,&nbsp;m_vecData)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">item.IsBusy())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomeThing(param);<br>}</span></div>
&nbsp;&nbsp;&nbsp; Oh Yeah!<br><br>&nbsp;&nbsp;&nbsp; 好了，问题来了，为什么C++不直接在语言中提供foreach这个功能呢？<br>&nbsp;&nbsp;&nbsp; 个人认为，原因有几点：<br>&nbsp;&nbsp;&nbsp; 1. C/C++除了数组外，没有内置的容器，因此for语句足矣。<br>&nbsp;&nbsp;&nbsp; 2. 当C++进化到STL的时候，C++标准委员会根本没空去考虑其它的。<br>&nbsp;&nbsp;&nbsp; 而其它高级语言之所以内置了foreach，就是因为它们一开始就提供了标准的容器库和迭代/枚举接口，因此提供foreach就顺理成章了。<br><br>&nbsp;&nbsp;&nbsp; 现在，总算C++开始考虑，由模板引入而造成的代码复杂性的问题，这的确是Cpper的福音。因此，一系列相关的提案被提交。牵涉到上面代码中的提案就有： <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf">Decltype</a>， <a href="http://www.research.att.com/~bs/N1968-lambda-expressions.pdf">Lambda expressions and closures for C++</a>，<a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1796.html">proposal for new for-loop</a>。　　<br>&nbsp;&nbsp;&nbsp; 其中，最符合foreach要求的就是新的for循环。采用这个语句，上面的程序就可以这么写：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;MyClass</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;item&nbsp;:&nbsp;m_vecData)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">item.IsBusy())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.DoSomeThing(param);<br>}</span></div>
<br>&nbsp;&nbsp;&nbsp; 不过，考虑到Decltype&amp;auto提案已经被采纳，新的for-loop就不知道能不能再被采纳。因为使用Decltype&amp;auto后，程序可以这么写：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">(auto&nbsp;iter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m_vecData.begin(),&nbsp;end&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m_vecData.end();&nbsp;iter&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;end;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">iter)<br>{<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">iter-&gt;IsBusy())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter-&gt;DoSomeThing(param);<br></span><span style="color: #000000;">}</span></div>
&nbsp;&nbsp;&nbsp; 似乎还是复杂点是吧？但是有了decltype&amp;auto后，foreach功能可以用程序库或宏的形式被模拟，BOOST_FOREACH就是这么做的。具体模拟的方式&lt;&lt;proposal for new for-loop&gt;&gt;提案写的很清楚了。<br>&nbsp;&nbsp;&nbsp; 同时，假如lambda提案要是能再被通过的话，那就真的要开心了：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">for_each(<br>&nbsp;&nbsp;m_vecData,&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #000000;">&lt;&gt;</span><span style="color: #000000;">(item)</span><span style="color: #0000ff;"> extern</span><span style="color: #000000;">(param)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(!item.IsBusy())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item.DoSomeThing(param);<br>&nbsp;&nbsp;}<br>);</span></div>
&nbsp;&nbsp;&nbsp; Cool!<br><br>&nbsp;&nbsp;&nbsp; 不过，VC++2008倒是增加了foreach功能，不过关键字不是foreach，而是for each，这个让人有点郁闷．要用的时候最好用宏定义替换一下，免得可移植性上出现问题．<br><br><img src ="http://www.cppblog.com/ly4cn/aggbug/32945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-09-26 19:51 <a href="http://www.cppblog.com/ly4cn/archive/2007/09/26/32945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC2008 beta2 的几个新东西</title><link>http://www.cppblog.com/ly4cn/archive/2007/08/14/29954.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Mon, 13 Aug 2007 16:40:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/08/14/29954.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/29954.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/08/14/29954.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/29954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/29954.html</trackback:ping><description><![CDATA[关于.net方面，已经有许多人在关注了，我就关注一下，VC2008方面的新东西吧。<br>1. 晕倒，实证后，没有增加tr1库（仅增加了tr1::hexfloat).<br>2. 对于模板的&gt;&gt;符号，中间不再需要空格了。<br>3. 增加了for each(T&amp; in A){}语法－－这个不算是改进吧，估计是为了与.NET一起工作的产物。<br><br>这是今天下午初步扫一眼VC2008中Native C++后的感觉。<br>同时，标准库已不再支持Win95/98/me和NT4了。<br><br>至于C++/CLR，一个重要的部份就是STL/CLR。  <img src ="http://www.cppblog.com/ly4cn/aggbug/29954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-08-14 00:40 <a href="http://www.cppblog.com/ly4cn/archive/2007/08/14/29954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++指针探讨 (四) 函数对象</title><link>http://www.cppblog.com/ly4cn/archive/2007/07/21/28524.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Sat, 21 Jul 2007 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/07/21/28524.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/28524.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/07/21/28524.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/28524.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/28524.html</trackback:ping><description><![CDATA[这是入门级的随笔，说的是函数对象的定义，使用，以及与函数指针，成员函数指针的关系。&nbsp;&nbsp;<a  href="http://www.cnblogs.com/ly4cn/archive/2007/07/21/826885.html">阅读全文</a><img src ="http://www.cppblog.com/ly4cn/aggbug/28524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-07-21 21:36 <a href="http://www.cppblog.com/ly4cn/archive/2007/07/21/28524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost 1.34 终于简化了内嵌python的支持</title><link>http://www.cppblog.com/ly4cn/archive/2007/05/23/24686.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Wed, 23 May 2007 04:58:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/05/23/24686.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/24686.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/05/23/24686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/24686.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/24686.html</trackback:ping><description><![CDATA[boost 1.34 终于简化了内嵌python的支持。<br>还支持了python2.5。<br>在中文windows下用vc8编译boost的过程中，虽然仍有代码页字符警告，但是可以正常编译成功，不再象1.33.1那样造成正则表达式库不修改源码不能够编译通过的问题了。<br><br>下面的例子是从boost文档中来的：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><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>#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>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #000000;">python.hpp</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">boost</span><span style="color: #000000;">/</span><span style="color: #0000ff;">ref</span><span style="color: #000000;">.hpp</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vector</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;boost::python;<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;greet()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;main&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;import(</span><span style="color: #000000;">"</span><span style="color: #000000;">__main__</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;global(main.attr(</span><span style="color: #000000;">"</span><span style="color: #000000;">__dict__</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Define&nbsp;greet&nbsp;function&nbsp;in&nbsp;Python.</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;exec(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">def&nbsp;greet(a):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;return&nbsp;'Hello&nbsp;%s&nbsp;from&nbsp;Python!'&nbsp;%&nbsp;a&nbsp;\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global,&nbsp;global);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;greet&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;global[</span><span style="color: #000000;">"</span><span style="color: #000000;">greet</span><span style="color: #000000;">"</span><span style="color: #000000;">];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;lst;<br>&nbsp;&nbsp;&nbsp;&nbsp;lst.append(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;lst.append(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;greet(lst);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;extract</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">std::</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(r);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;message&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br>}<br><br></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>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br>&nbsp;&nbsp;&nbsp;&nbsp;greet();<br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">Pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span></div>
<br>BTW:<br>&nbsp; 我用vc8编译了全部的boost，然后，include加上lib目录（内仅有lib和dll文件），合计2.68GB。<br><br>   <img src ="http://www.cppblog.com/ly4cn/aggbug/24686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-05-23 12:58 <a href="http://www.cppblog.com/ly4cn/archive/2007/05/23/24686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost 1.34.0 于5.12发布</title><link>http://www.cppblog.com/ly4cn/archive/2007/05/13/24069.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Sun, 13 May 2007 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2007/05/13/24069.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/24069.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2007/05/13/24069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/24069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/24069.html</trackback:ping><description><![CDATA[<div class="postbody">
<p>昨天，boost终于发布了1.34版本。该版本新增加了几个内容：<br>1. BOOST_FOREACH 宏<br>　　一直对于C++的iterator枚举元素造成的bad smell感到无奈，同时，许多语言都增加了foreach机制。终于，boost增加了这个枚举工具。从此，C++的枚举不再难看。如：<br></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;foreach&nbsp;BOOST_FOREACH</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;array_short[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;};<br></span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">(&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;i,&nbsp;array_short&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i;<br>}<br></span></div>
<span class="special"></span><br>　　BOOST_FOREACH宏大大改良了代码可读性。<br>
<p>　　上述程序执行后，array_short的内容为：{2,3,4}。&nbsp;</p>
<p>2. 状态图<br>　　随着工作流(WorkFlow)的流行，Boost也加入了状态机。这对于程序结构的优化，将是一个好的补充。<br>3. Tr1<br>　　随着C++0x的进展，Tr1已经被通过。下一次Boost可能将增加Tr2了。<br>4. Typeof 库<br>　　C++0x中的auto的替代品。时常关心C++0x进展的人就会知道auto的作用，现在终于可以提前使用了。只是没有auto漂亮，目前也仅能如此了，毕竟它现在能工作。<br>5. Xpressive库<br>　　属于C++的正则表达式库。以前都是用字串来保存正则表达式，现在终于可以用C++的表达式来写正则了。<br></p>
<p>见 <a href="http://www.boost.org/"><font color="#1d58d1">http://www.boost.org</font></a></p>
</div><img src ="http://www.cppblog.com/ly4cn/aggbug/24069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2007-05-13 22:24 <a href="http://www.cppblog.com/ly4cn/archive/2007/05/13/24069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua脚本入门</title><link>http://www.cppblog.com/ly4cn/archive/2006/08/08/10983.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Tue, 08 Aug 2006 05:09:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2006/08/08/10983.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/10983.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2006/08/08/10983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/10983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/10983.html</trackback:ping><description><![CDATA[
		<div class="posthead">摘要:　　在这里，我想向大家介绍如何进行Lua程序设计。<br /><br />全文：<a id="_36e1fb1c2c34_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/ly4cn/archive/2006/08/04/467550.html">Lua脚本入门</a></div>
<img src ="http://www.cppblog.com/ly4cn/aggbug/10983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2006-08-08 13:09 <a href="http://www.cppblog.com/ly4cn/archive/2006/08/08/10983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++用bitset进行2进制输入输出 </title><link>http://www.cppblog.com/ly4cn/archive/2006/06/29/9142.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Thu, 29 Jun 2006 02:14:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2006/06/29/9142.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/9142.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2006/06/29/9142.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/9142.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/9142.html</trackback:ping><description><![CDATA[
		<a class="singleposttitle" id="viewpost1_TitleUrl" href="http://ly4cn.cnblogs.com/archive/2006/06/29/438382.html">
				<font color="#223355">用bitset进行2进制输入输出</font>
		</a>
<img src ="http://www.cppblog.com/ly4cn/aggbug/9142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2006-06-29 10:14 <a href="http://www.cppblog.com/ly4cn/archive/2006/06/29/9142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汇编语言的Hello World</title><link>http://www.cppblog.com/ly4cn/archive/2006/04/06/5077.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Thu, 06 Apr 2006 04:05:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2006/04/06/5077.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/5077.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2006/04/06/5077.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/5077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/5077.html</trackback:ping><description><![CDATA[汇编语言没有我想象的那么低级，它已经具备了不少高级语言的特性，代码也变得清晰，层次清楚，易于维护了。<br />全文见：<a id="_3e9d596dd2f8_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl" href="http://ly4cn.cnblogs.com/archive/2006/04/06/368210.html">汇编语言的Hello World</a><img src ="http://www.cppblog.com/ly4cn/aggbug/5077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2006-04-06 12:05 <a href="http://www.cppblog.com/ly4cn/archive/2006/04/06/5077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++指针探讨 (三) 成员函数指针</title><link>http://www.cppblog.com/ly4cn/archive/2006/03/13/4092.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Mon, 13 Mar 2006 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2006/03/13/4092.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/4092.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2006/03/13/4092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/4092.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/4092.html</trackback:ping><description><![CDATA[<P>　　C语言的指针相当的灵活方便，但也相当容易出错。许多C语言初学者，甚至C语言老鸟都很容易栽倒在C语言的指针下。但不可否认的是，指针在C语言中的位置极其重要，也许可以偏激一点的来说：没有指针的C程序不是真正的C程序。<BR>　　然而C++的指针却常常给我一种束手束脚的感觉。C++比C语言更加强调强类型，强调类型安全，强调编译时检查。因此，对于C语言中最容易错用的指针，更是不能放过：C++的指针被分成数据指针，数据成员指针，函数指针，成员函数指针，而且不能随便相互转换。而且这些指针的声明格式都不一样：</P>
<P>
<TABLE style="WIDTH: 320px; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 border=1>
<TBODY>
<TR>
<TD>数据指针</TD>
<TD>T&nbsp;*</TD></TR>
<TR>
<TD>成员数据指针</TD>
<TD>T::*</TD></TR>
<TR>
<TD>函数指针</TD>
<TD>R&nbsp;(*)(...)</TD></TR>
<TR>
<TD>成员函数指针</TD>
<TD>R (T::*)(...)</TD></TR></TBODY></TABLE><BR>　　尽管C++中仍然有万能指针void*，但它却属于被批斗的对象，而且再也不能“万能”了。它不能转换成成员指针。</P>
<P>　　这样一来，C++的指针就变得很尴尬：我们需要一种指针能够指向同一类型的数据，不管这个数据是普通数据，还是成员数据；我们更需要一种指针能够指向同一类型的函数，不管这个函数是静态函数，还是成员函数。但是没有，至少从现在的C++标准中，还没有看到。<BR><BR>全文见 《<A id=viewpost1_TitleUrl href="http://ly4cn.cnblogs.com/archive/2006/03/13/349180.html"><FONT color=#000080>C++指针探讨 (三) 成员函数指针 </FONT></A>》</P><img src ="http://www.cppblog.com/ly4cn/aggbug/4092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2006-03-13 16:44 <a href="http://www.cppblog.com/ly4cn/archive/2006/03/13/4092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++指针探讨 (二) 函数指针</title><link>http://www.cppblog.com/ly4cn/archive/2005/12/17/1843.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Sat, 17 Dec 2005 03:53:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2005/12/17/1843.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/1843.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2005/12/17/1843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/1843.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/1843.html</trackback:ping><description><![CDATA[<DIV class=postTitle>在C/C++中，数据指针是最直接，也最常用的，因此，理解起来也比较容易。而函数指针，作为运行时动态调用（比如回调函数 CallBack Function）是一种常见的，而且是很好用的手段。 <BR><BR>注：这一部份没什么价值，纯是为了引出下一节的内容。<BR><BR>请点此处阅读全文：<A id=_33cd042ed710233_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl0_TitleUrl href="http://ly4cn.cnblogs.com/archive/2005/12/17/299007.html"><FONT color=#000080>C++指针探讨 (二) 函数指针</FONT></A> </DIV><img src ="http://www.cppblog.com/ly4cn/aggbug/1843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2005-12-17 11:53 <a href="http://www.cppblog.com/ly4cn/archive/2005/12/17/1843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++指针探讨 （一）数据指针</title><link>http://www.cppblog.com/ly4cn/archive/2005/11/30/1434.html</link><dc:creator>沐枫</dc:creator><author>沐枫</author><pubDate>Wed, 30 Nov 2005 03:12:00 GMT</pubDate><guid>http://www.cppblog.com/ly4cn/archive/2005/11/30/1434.html</guid><wfw:comment>http://www.cppblog.com/ly4cn/comments/1434.html</wfw:comment><comments>http://www.cppblog.com/ly4cn/archive/2005/11/30/1434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ly4cn/comments/commentRss/1434.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ly4cn/services/trackbacks/1434.html</trackback:ping><description><![CDATA[指针，在C/C++语言中一直是很受宠的；几乎找不到一个不使用指针的C/C++应用。用于存储数据和程序的地址，这是指针的基本功能。用于指向整型数，用整数指针(int*)；指向浮点数用浮点数指针(float*)；指向结构，用对应的结构指针(struct xxx *)；指向任意地址，用无类型指针(void*)。 <BR>本文先探讨C++中用于存储各种类型数据的指针。 <BR><BR>——全文请见：<A id=_1edf50c25fd11b89_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl0_TitleUrl href="http://ly4cn.cnblogs.com/archive/2005/11/28/286185.html"><FONT color=#000080>C++指针探讨 （一）数据指针</FONT></A><BR><img src ="http://www.cppblog.com/ly4cn/aggbug/1434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ly4cn/" target="_blank">沐枫</a> 2005-11-30 11:12 <a href="http://www.cppblog.com/ly4cn/archive/2005/11/30/1434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>