﻿<?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>BlogJava-流浪的蜗牛-文章分类-C\C++</title><link>http://www.blogjava.net/vagasnail/category/42600.html</link><description>读历史、看小说、写程序都是我所爱。</description><language>zh-cn</language><lastBuildDate>Sat, 12 Jun 2010 21:19:21 GMT</lastBuildDate><pubDate>Sat, 12 Jun 2010 21:19:21 GMT</pubDate><ttl>60</ttl><item><title>CRichEdit的中文字体问题</title><link>http://www.blogjava.net/vagasnail/articles/317636.html</link><dc:creator>vagasnail</dc:creator><author>vagasnail</author><pubDate>Wed, 07 Apr 2010 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/vagasnail/articles/317636.html</guid><wfw:comment>http://www.blogjava.net/vagasnail/comments/317636.html</wfw:comment><comments>http://www.blogjava.net/vagasnail/articles/317636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vagasnail/comments/commentRss/317636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vagasnail/services/trackbacks/317636.html</trackback:ping><description><![CDATA[
		<p>记录一下困扰我很多天的，关于CRichEdit的问题：当双击打开一个文档时，中文字体在显示时会大一个字号，真的不知道是为什么，现在也不知道是为什么，但是我一个一个函数的试终于得到了如下的结论：悲剧啊！</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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> pContext )<br /><img id="Codehighlighter1_82_541_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_541_Open_Text.style.display='none'; Codehighlighter1_82_541_Closed_Image.style.display='inline'; Codehighlighter1_82_541_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_82_541_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_82_541_Closed_Text.style.display='none'; Codehighlighter1_82_541_Open_Image.style.display='inline'; Codehighlighter1_82_541_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_82_541_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.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_82_541_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 不要调用这个函数，这个函数默认通过 pContext 创建了一个 CView<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 可以通过重写这个函数，来改变窗体的主客户区的显示。</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> success </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> m_wndSplitter.CreateStatic(</span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> success </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> m_wndSplitter.CreateView(</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  RUNTIME_CLASS(CMyXmlBoxView), <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  CSize(</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, (</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000">)(height </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">)), <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  pContext);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> success </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> m_wndSplitter.CreateView(</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">, <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  RUNTIME_CLASS(COutputView), <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  CSize(</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">, (</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000">)(height </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">)), <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  pContext);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 竟然在这里就可以避开，双击打开文档的函数调用序列，到底是为什么呢？<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 鬼才晓得，记得就可以了，在MainFrame的OnCreateClient中调用设置文本和段落<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 格式可以免于使字体诡异的扩大一个字号，对底层我们很难了解，也是我讨厌<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> MFC的原因了。</span><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> ((CMyXmlBoxView</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)m_wndSplitter.GetPane(</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">-&gt;</span>
						<span style="COLOR: #000000">SetEditFormat();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> success;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<br />不要问我为什么？我也不知道。<img src ="http://www.blogjava.net/vagasnail/aggbug/317636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vagasnail/" target="_blank">vagasnail</a> 2010-04-07 14:20 <a href="http://www.blogjava.net/vagasnail/articles/317636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近的一些小心得</title><link>http://www.blogjava.net/vagasnail/articles/317317.html</link><dc:creator>vagasnail</dc:creator><author>vagasnail</author><pubDate>Fri, 02 Apr 2010 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/vagasnail/articles/317317.html</guid><wfw:comment>http://www.blogjava.net/vagasnail/comments/317317.html</wfw:comment><comments>http://www.blogjava.net/vagasnail/articles/317317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vagasnail/comments/commentRss/317317.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vagasnail/services/trackbacks/317317.html</trackback:ping><description><![CDATA[1. 每个模块，应该总是让他们的功能能够内聚一些，这样也不会将bug扩散 <br />2. 记得在构造程序的时候，千万不要想着优化，要等到当前模块，甚至是整个程序完成后再考虑优化问题。 <br />3. 写程序的时候，请先写好注释，再写实现的代码，这样会更有思路。 <br />4. 在开始写程序的时候，要先在脑子里想好，先在纸上或者电脑上得出大概的实现思路，而不是一上手就开始盲目的编码，这样只会浪费时间，而且使脑子混乱。在想出具体而大致完整的解决思路后才可以开始编码。 <br />5. i++, ++i<br /> 第一个是在表达式之后求值，包括复合表达式(如逗号表达式) 第二个是在表达式之前求值，包括复合表达式<img src ="http://www.blogjava.net/vagasnail/aggbug/317317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vagasnail/" target="_blank">vagasnail</a> 2010-04-02 15:49 <a href="http://www.blogjava.net/vagasnail/articles/317317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A star算法弱弱的小结</title><link>http://www.blogjava.net/vagasnail/articles/307937.html</link><dc:creator>vagasnail</dc:creator><author>vagasnail</author><pubDate>Thu, 31 Dec 2009 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/vagasnail/articles/307937.html</guid><wfw:comment>http://www.blogjava.net/vagasnail/comments/307937.html</wfw:comment><comments>http://www.blogjava.net/vagasnail/articles/307937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vagasnail/comments/commentRss/307937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vagasnail/services/trackbacks/307937.html</trackback:ping><description><![CDATA[
		<p>搞了N个小时，终于杯具的把A*算法写出来了，这里只能弱弱的小结一下：<br />A*算法是一种启发式算法：<br />即每次迭代都进行启发式思考，判断F值：<br />我们维护两个表，我这只用简单的数组实现。<br />OPEN表和CLOSE表<br />OPEN表存储我们待搜索的节点<br />CLOSE表存储已经搜索好的节点，这些节点都是每次启发时F值最小的。<br />A为其点<br />B为终点</p>
		<p>F = H + G<br />G = 从起点A，沿着产生的路径，移动到网格上指定方格的移动耗费。G = 距离(A) * 偏移量 <br />H = 从网格上那个方格移动到终点B的预估移动耗费。这经常被称为启发式的，<br />    可能会让你有点迷惑。这样叫的原因是因为它只是个猜测。<br />    我们没办法事先知道路径的长度，因为路上可能存在各种障碍(墙，水，等等)。<br />    虽然本文只提供了一种计算H的方法，但是你可以在网上找到很多其他的方法。<br />    H = (列距离(B) + 行距离(B)) * 偏移量 <br />我们选定上一次添加到CLOSE表的节点为当前节点。<br />然后依次判断当前节点的四个或八个方向的节点。如果这些节点是障碍，或者已经在CLOSE表中，<br />则不予考虑，否则将这些节点的父节点设为当前节点，这些节点如果也没有在OPEN表中，<br />则加入OPEN表，如果这些节点编号已经出现在OPEN表中，则判断他们的G值，G值小的留下，G值大的扔掉。<br />如果G值也相同，保留后出现的。<br />我们每次把OPEN表F值最小的节点删去加入到CLOSE表中。<br />但是如果存在两个节点的F值相同呢？随机选一个。<br />如此反复，直到我们将B点加入CLOSE表。<br />如何得到我们的路径呢？从B点依靠父节点向上遍历就行了。</p>
		<p>注意一点。我们要保持OPEN表的有序就对了，显然我们这里是通过F值来维持OPEN表的次序。<br />而且每次添加新的节点到OPEN表时都要排序。当然这里是用降序，这样对于数组来说更好操作。<br /><br />感谢，网上朋友提供的详细的资料。<br /></p>
<img src ="http://www.blogjava.net/vagasnail/aggbug/307937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vagasnail/" target="_blank">vagasnail</a> 2009-12-31 17:21 <a href="http://www.blogjava.net/vagasnail/articles/307937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CSDN中关于C++学习的讨论</title><link>http://www.blogjava.net/vagasnail/articles/301214.html</link><dc:creator>vagasnail</dc:creator><author>vagasnail</author><pubDate>Thu, 05 Nov 2009 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/vagasnail/articles/301214.html</guid><wfw:comment>http://www.blogjava.net/vagasnail/comments/301214.html</wfw:comment><comments>http://www.blogjava.net/vagasnail/articles/301214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vagasnail/comments/commentRss/301214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vagasnail/services/trackbacks/301214.html</trackback:ping><description><![CDATA[
		<p>　　本文从CSDN转载  <a href="http://blog.csdn.net/pongba/archive/2007/05/16/1611593.aspx" target="_blank">http://blog.csdn.net/pongba/archive/2007/05/16/1611593.aspx</a></p>
		<p>　　1. <em><font face="宋体">大众是容易被误导的，我也曾经是。以为掌握了更多的语言细节就更牛，但实际却是那些语言细节十有八九是平时编程用都用不到的。</font></em><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'">C++</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">中众多的细节虽然在库设计者手里面有其用武之地，但普通程序员则根本无需过多关注，尤其是没有实际动机的关注</span></strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">。</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'"><a href="http://www.amazon.com/Code-Complete-Second-Steve-McConnell/dp/0735619670/ref=pd_bbs_sr_1/103-5143973-1863031?ie=UTF8&amp;s=books&amp;qid=1179295689&amp;sr=8-1" target="_blank"><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'"><span lang="EN-US"><font color="#0066ff">一般性</font></span></span></a></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">的</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'"><a href="http://www.amazon.com/C%2B%2B-Coding-Standards-Guidelines-Depth/dp/0321113586/ref=pd_bbs_sr_1/103-5143973-1863031?ie=UTF8&amp;s=books&amp;qid=1179297053&amp;sr=8-1" target="_blank"><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'"><span lang="EN-US"><font color="#0066ff">编码实践准则</font></span></span></a></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">，以及基本的</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'"><a href="http://www.amazon.com/Computer-Systems-Programmers-Randal-Bryant/dp/013034074X/ref=sr_1_1/103-5143973-1863031?ie=UTF8&amp;s=books&amp;qid=1179295519&amp;sr=8-1" target="_blank"><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'"><span lang="EN-US"><font color="#0066ff">编程能力和基本功</font></span></span></a></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">，乃至</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'"><a href="http://mitpress.mit.edu/sicp/" target="_blank"><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'"><span lang="EN-US"><font color="#0066ff">基本的程序设计理论</font></span></span></a></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">以及</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'"><a href="http://www.amazon.com/Introduction-Algorithms-Thomas-H-Cormen/dp/0262032937/ref=pd_bbs_2/103-5143973-1863031?ie=UTF8&amp;s=books&amp;qid=1179295605&amp;sr=8-2" target="_blank"><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'"><span lang="EN-US"><font color="#0066ff">算法<span lang="EN-US">设计</span></font></span></span></a></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">。才是真正需要花时间掌握的东西。</span></p>
		<p>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">　　2. <em>熟练运用一门语言绝不意味着要把它的边边角角全都记住</em>。<em style="mso-bidi-font-style: normal">懂得一些常识，有了编程的基本直觉，遇到一些细节错误的时候再去查书，是最节省时间的办法</em>。</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">　　3. <span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">学习最佳编码实践比学习</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'">C++</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">更重要。看优秀的代码也比埋头用差劲的编码方式写垃圾代码要有效。直接、清晰、明了、</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'">KISS</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">地表达意图比玩编码花招要重要</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'">…<?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span></span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">    4.这里是C++之父 Bjarne Stroustrup的关于如何学习<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 'Century Gothic'">C++</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">（以及编程）的看法的摘录：</span></span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">　　Obviously, C++ is very complex. Obviously, people get lost. However, most peple get lost when they get diverted into becoming language lawyers rather than getting lost when they have a clear idea of what they want to express and simply look at C++ language features to see how to express it. Once you know data absreaction, class hierarchies (object-oriented programming), and parameterization with types (generic programming) in a fairly general way, the C++ language features fall in place.</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">译：诚然，C++非常复杂。诚然，人们迷失其中了。然而问题是，大多数人不是因为首先对自己想要表达什么有了清晰的认识只不过在去C++语言中搜寻合适的语言特性时迷失的，相反，大多数人是在不觉成为语言律师的路上迷失在细节的丛林中的。事实是，只需对数据抽象、类体系结构（OOP）以及参数化类型（GP）有一个相当一般层面的了解，C++纷繁的语言特性也就清晰起来了。</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">
				</span> </p>
		<p>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">
				</span> </p>
		<p>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Century Gothic'; mso-hansi-font-family: 'Century Gothic'">　　</span>
		</p>
<img src ="http://www.blogjava.net/vagasnail/aggbug/301214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vagasnail/" target="_blank">vagasnail</a> 2009-11-05 09:57 <a href="http://www.blogjava.net/vagasnail/articles/301214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于函数</title><link>http://www.blogjava.net/vagasnail/articles/301130.html</link><dc:creator>vagasnail</dc:creator><author>vagasnail</author><pubDate>Wed, 04 Nov 2009 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/vagasnail/articles/301130.html</guid><wfw:comment>http://www.blogjava.net/vagasnail/comments/301130.html</wfw:comment><comments>http://www.blogjava.net/vagasnail/articles/301130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vagasnail/comments/commentRss/301130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vagasnail/services/trackbacks/301130.html</trackback:ping><description><![CDATA[
		<span style="BACKGROUND-COLOR: yellow">
				<div id="blogDetailDiv" style="FONT-SIZE: 16px">
						<p>#include&lt;iostream&gt;<br />#include "string"<br />using namespace std;<br />/*<br />size_t count_calls()<br />{<br /> static size_t ctr = 0;<br /> return ++ctr;<br />}<br />*/<br />//不可以间隔省，不可以向后省，具体自己以编译器的角度理解<br />/*<br />string screenInit(string::size_type height = 24, <br />      string::size_type width = 80,<br />      char background = ' ')<br />{<br /> return "";<br />}<br />*/</p>
						<p>bool lengthCompare(const string &amp;str1, const string &amp;str2)//声明一个函数<br />{<br /> if(str1.length() &gt;= str2.length())<br />  return true;<br /> else<br />  return false;<br />}</p>
						<p>void useBigger(const string &amp;, const string &amp;,<br />      bool(const string &amp;, const string &amp;));//将函数指针作为参数<br />void useBigger(const string &amp;, const string &amp;,<br />      bool (*)(const string &amp;, const string &amp;));//也可以这样传递函数指针。</p>
						<p>int (*ff(int))(int *, int);//返回指向函数的指针，需要从里往外理解<br />//很难理解大致为 有一个ff(int)函数，他带有(int *, int)的参数，返回一个int<br />//可使用typedef简化为<br />typedef int (*FF)(int *, int)<br />FF ff(int)<br />//真鸡巴复杂</p>
						<p>
								<br />int main()<br />{<br />/* <br /> typedef bool (*cmpFcn)(const string &amp;, const string &amp;); //只要函数类型相同皆可<br /> //所谓的函数类型，是指函数参数及其类型、个数、顺序等，还有返回值<br /> cmpFcn pf1 = 0;<br /> cmpFcn pf2 = lengthCompare;<br /> pf2("111","2222");//直接引用函数名等效于在函数名上应用取地址操作符<br /> pf1 = pf2;<br /> pf1("2222","111");//不需要使用解引用操作符*,直接通过指针调用函数。<br />*/ <br />/*<br /> for(size_t i = 0;i != 100; ++i)<br />  cout&lt;&lt;count_calls()&lt;&lt;endl;<br /> return 0;<br />*/</p>
						<p> </p>
						<p>return 0;<br />}</p>
						<p> </p>
						<p>最后加几点注意：</p>
						<p>1.  千万不要返回局部对象的引用，因为局部对象已被回收，所以引用将会变成空引用，而返回对象执行的是值拷贝，也就是重新生成了一个对象。</p>
						<p>2. 如果不希望引用返回的值被修改，返回引用请声明为const，同理形参也是一样，如果不希望被修改请设为const。</p>
						<p>3. 千万不要返回局部对象的引用，基本和引用相同，方法返回后局部对象被释放，所以指针为垂悬指针。</p>
						<p>4. 默认实参是通过给形参表中提供明确的初始值来指定的。在函数声明中指定，而且在同一个文件中只能为一个函数指定一次。</p>
				</div>
		</span>
<img src ="http://www.blogjava.net/vagasnail/aggbug/301130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vagasnail/" target="_blank">vagasnail</a> 2009-11-04 19:19 <a href="http://www.blogjava.net/vagasnail/articles/301130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于指针</title><link>http://www.blogjava.net/vagasnail/articles/301128.html</link><dc:creator>vagasnail</dc:creator><author>vagasnail</author><pubDate>Wed, 04 Nov 2009 11:18:00 GMT</pubDate><guid>http://www.blogjava.net/vagasnail/articles/301128.html</guid><wfw:comment>http://www.blogjava.net/vagasnail/comments/301128.html</wfw:comment><comments>http://www.blogjava.net/vagasnail/articles/301128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vagasnail/comments/commentRss/301128.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vagasnail/services/trackbacks/301128.html</trackback:ping><description><![CDATA[
		<div id="blogDetailDiv" style="FONT-SIZE: 16px">
				<p>#include &lt;iostream.h&gt;<br />#include &lt;string.h&gt;<br />void main()<br />{<br />/* test 1 <br /> const int c_ival = 0;<br /> int *pi;<br /> pi = c_ival;//指针变量可以通过一个常量赋值<br /> int ival = 2;//指针变量不可以通过一个变量赋值<br /> //pi = 2; //任何字面量，除0外，都不可以给指针变量赋值<br /> pi = 0; //指针只能通过字面值0或者const量0，以及NULL预定义变量赋值<br /> pi = NULL;//NULL是一个预处理变量，也可以为指针变量赋值。<br />*/</p>
				<p>/* test 2<br /> double dval;<br /> double *pd = &amp;dval;//可通过变量的地址(指针)给指针变量赋值<br /> double *pd2 = pd; //同类型的指针变量可以赋值<br />// int *pi = pd;   //不同类型的当然不能复制了<br />// int *pi = &amp;dval; //类型不同的变量的指针不能互相赋值<br />*/</p>
				<p>/* test 3<br /> double obj = 3.14;<br /> double *pd = &amp;obj;//OK,不多说<br /> void *pv = &amp;obj;<br /> pv = pd;<br /> int *pi;<br /> //pi = &amp;2;//不能对常量取地址。<br /> int iv = 11;<br /> pi = &amp;iv;<br /> pv = pi;//类型相同的变量才可以赋值，而且void*型指针可以保持任何对象的地址<br /> //void*指针只能用于比较，传参，不可以操作其指向的对象<br />*/</p>
				<p> /**<br />  友情提供：<br />  指针和引用的比较：<br />  虽然引用(reference)和指针都可以间接访问另一个值，但它们之间有两个主要的区别。<br />  第一个区别在于引用总是指向某个对象：定义引用时没有初始化是错误的。第二个重要<br />  的区别则是赋值行为的差异：给引用赋值修改的是该引用所关联的对象的值，而并不是<br />  使引用与另一个对象关联。应用一经初始化，就始终指向同一个特定的对象。<br /> */</p>
				<p>/* test 4<br /> int ival = 1024, ival2 = 2048;<br /> int *pi = &amp;ival, *pi2 = &amp;ival2;<br /> pi = pi2;<br />//正确<br /> int &amp;ri = ival, &amp;ri2 = ival2;<br /> ri = ri2;<br /> cout&lt;&lt;"ri = "&lt;&lt;ri&lt;&lt;", ri2 = "&lt;&lt;ri2&lt;&lt;endl;<br /> //output :ri = 2048, ri2 = 2048<br /> //注意这里并没有改变ri与ri2的指向，而是改变他们所各自关联的对象的值。<br />*/</p>
				<p>/* test 5<br /> int ival = 1024;<br /> int *pi = &amp;ival;<br /> int **ppi = &amp;pi; //C++使用**操作符指派一个指针指向另一个指针。**也是指向符。<br /> //下面相同的值，相同的对象<br /> cout&lt;&lt;ival&lt;&lt;" "&lt;&lt;*pi&lt;&lt;" "&lt;&lt;**ppi&lt;&lt;endl;<br />*/</p>
				<p>//忍不住了，讨论下，const引用<br /> //正解：const引用是指向const对象的引用。<br /> //const int ival = 1024; //引用必须初始化<br /> //const int &amp;refVal = ival;<br /> //int &amp;ref2 = ival;//非常量对象的引用不可以指向常量对象的引用</p>
				<p>// const int &amp;refVal2 = 2;//const引用可以以字面量初始化<br />// int vali = 1111;<br />// const int &amp;refVal3 = vali;//const引用可以以变量初始化，但是通过该引用访问该变量，就只能当做常量使用。<br />// refVal3 = 100; 不可修改，表明这里是该引用指向了一个常量对象。<br /> //l-value左值，左值是变量，可左可右。 r-value右值，右值是常量(包括字面量)，只能右</p>
				<p> /*<br />  在指针上加上(或减去)一个整形数值n等效于获得一个新指针，该新指针指向指针原来指向的元素之后<br />  (或之前)的第n个元素。<br />  两个指针减法操作的结果是标准库类型ptrdiff_t的数据。这是一个signed整形，它表示两个指针之间<br />  的差距。<br /> */      <br />/* test 6<br /> const size_t arr_sz = 5;<br /> int int_arr[arr_sz] = {0, 1, 2, 3, 4};<br /> for(int *pbegin = int_arr, *pend = int_arr + arr_sz;<br />   pbegin != pend; ++pbegin)<br />   {<br />   // cout&lt;&lt;int_arr[5]; 为什么会输出5，诡异啊。<br />    cout&lt;&lt;*pbegin&lt;&lt;' ';<br />   }<br />*/</p>
				<p> //指向const对象的指针和const指针<br /> //指向const对象的指针这样声明 const double *cptr;<br /> //1. 不能修改所指对象的值，因为是const对象嘛。<br /> //*cptr = 42; //这是错误的。<br /> //2. 不能使用void*指针保持const对象的地址，而必须使用const void*。<br />// const int universe = 42;<br />// const void *cpv = &amp;universe;<br />// void *pv = &amp;universe; //错误的，必须使用const void*<br /> //3. 对于非const对象的处理和const引用是一样的。<br /> //但是我们可以修改指针变量的值，使我们的指针指向新的对象。只是这个对象无论是否为const<br /> //只要我们通过这个指针访问，那么系统都认为其为const。(自以为指向const的指针)</p>
				<p> //const指针是这样 double *const cptr;<br /> //指针变量的本身的值无法修改，也就是指针无法执行初始指定的对象的值，<br /> //这样和const引用则比较像了,但是我们可以修改我们所执行的对象。</p>
				<p>/*<br /> double dval = 33.33;<br /> double *const cptr = &amp;dval;<br /> *cptr = 332.02;<br /> cout&lt;&lt;dval&lt;&lt;" "&lt;&lt;*cptr;<br /> //下面最变态的：指向const对象的const指针<br /> const double pi = 3.14159;<br /> const double *const pi_ptr = &amp;pi;<br /> //从右向左读，关于指针都一般都这么读，既不可以修改指针所指向的对象的值，也不可以修改该指针的指向。<br />*/<br />/*<br /> //typedef和指针 不多说反正记得typedef不是简单的文本扩展，其实只要注意const应该写在类型后面就可以了<br /> //所以：<br /> //下面 <br /> typedef string *pstring;<br /> const pstring cstr;<br /> //等价于<br /> string *const cstr;//也就是const指针。<br />*/</p>
				<p>}</p>
				<p> </p>
				<p>再加一点，天亮了要睡觉了啊！</p>
				<p>#include &lt;stdio.h&gt;<br />#include &lt;iostream.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;string&gt;<br />using namespace std;<br />void main()<br />{<br /> const char *cp1 = "A string example";<br /> const char *cp2 = "A different string";<br />// int i = strcmp(cp1, cp2);<br />// printf("%d\n", i);<br />// i = strcmp(cp2, cp1);<br />// printf("%d\n", i);<br />// i = strcmp(cp1, cp1);<br />// printf("%d\n", i);</p>
				<p>// char largeStr[16 + 18 + 2];<br />// strcpy(largeStr, cp1);<br />// printf("%s\n", largeStr);<br />// strcat(largeStr, " ");<br />// strcat(largeStr, cp2);<br />// printf("%s\n", largeStr);</p>
				<p>// char ca[] = {'C', '+', '+', '\0'};<br />// cout&lt;&lt;strlen(ca)&lt;&lt;endl; 空格并不是null</p>
				<p>
						<br /> int ia[3][4] = {<br />  {0, 1, 2, 3},<br />  {4, 5, 6, 7},<br />  {8, 9, 10, 11},<br /> };</p>
				<p> typedef int int_array[4];<br /> int_array *ip = ia;</p>
				<p> for(int_array *p = ia; p != ia + 3; ++p)<br />  for(int *q = *p; q != *p + 4; ++q)<br />   cout&lt;&lt; *q &lt;&lt;endl;</p>
				<p> //可使用数组长度后面的一对圆括号，对数组元素做值初始化:<br />  int *pia2 = new int[10]();<br /> // 这里初始化为0<br /> // 允许定义类类型的const数组，但该类型必须提供默认的构造函数<br /> // const string *pcs = new const string[100];//似乎不支持, 而且没有必要，<br />  //因为string早已做好了相关的支持。<br />  //这里就会使用默认构造函数来初始化数组元素<br />  //使用delete [] 数组名 来释放数组空间。<br />  //delete [] pcs;<br />  delete [] pia2;</p>
				<p>}</p>
				<p> </p>
		</div>
<img src ="http://www.blogjava.net/vagasnail/aggbug/301128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vagasnail/" target="_blank">vagasnail</a> 2009-11-04 19:18 <a href="http://www.blogjava.net/vagasnail/articles/301128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>