﻿<?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++博客-TanZek's 技术空间-文章分类-C++</title><link>http://www.cppblog.com/urgentmind/category/385.html</link><description>勇往直前，专注于技术...</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 00:20:52 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 00:20:52 GMT</pubDate><ttl>60</ttl><item><title>[转]《C++编程规范》笔记的编程设计风格及编程步骤</title><link>http://www.cppblog.com/urgentmind/articles/7920.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Wed, 31 May 2006 03:27:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/7920.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/7920.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/7920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/7920.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/7920.html</trackback:ping><description><![CDATA[第1条：一个实体应该只有一个紧凑的职责 <br />　　单一职责原则。这个原则并不那么容易执行，即使是STL这样的程序库，也一样会犯违反该原则的错误。在这里，举了两个违反这一原则的著名实现：realloc和stl 中的basic_string。不过，对于basic_string，我想比起MFC中的CString还是好了不少。在《Exceptional C++ style》中，对basic_string作了剖析，并且得出一个普遍的原则：尽量将函数实现为独立的函数而不是成员函数。<br />　 尝试用一句话来说明一个模块的功能，既不多，也不少。如果无法用这样的一句话加以概括，那么重新考虑规划该模块的职责。　　 
<p class="main">第2条：正确、简单和清晰第一 <br />　　简单的说，坚持KISS原则：正确优于速度，简单优于复杂，清晰优于机巧，安全优于不安全。<br />    程序必须为阅读它的人编写，只是顺便用于机器执行 <br />    编写程序应该以人为本，计算机第二。 <br />　　计算机系统中最便宜、最快速、最可靠的组件都还不存在，简单设计的重要性怎么强调也不过分。<br />    使一个正确的程序变快，比使一个快速的程序正确要容易的多。<br />    避免使用程序设计语言的冷僻特性，应该使用最简单的有效技术。<br />    不要毫无节制地重载运算符。   <br />    不要滥用匿名变量，合理使用命名变量。  <br />    当然，这不是说连 vector().swap(other)这样的惯用法也要排斥。　</p><p class="main">第3条：编程中应知道何时和如何考虑可伸缩性 <br />　　从字面上来看，这差不多等于外交辞令。答案无非是“适当的”时候“适当地”考虑可伸缩性。这非常依赖于软件工程师的经验和知识。所以，本条目也“适当地”回避了那种缺乏营养的教导，着重讨论算法复杂度的选择问题。 <br />　　基本上，线性复杂度可以作为一个算法是否可选的分界点。值得花费精力避免选择差于线性复杂度的算法，而不差于线性复杂度的算法则可以接受。所以，把性能放在嘴边的兄弟们注意了，你的精力可别放错了地方，高德纳言犹在耳：不成熟的优化是程序设计中的万恶之源。必要时，先努力优化复杂度（选择好的算法--- -算法无用论者，去面壁！）。 <br />　　顺便提一句排序算法，通用排序算法的复杂度最好是O(NlgN)，但是特定领域完全可以有更好复杂度的算法。　　 </p><p class="main">第4条：不要进行不成熟的优化 <br />　　“不成熟的优化是程序设计中的万恶之源” ----高德纳引用的这句话这本书中出现了若干次，高德纳在他的不朽名著《计算机程序设计艺术》中也一再强调了这一点，还说他以前程序中的许多错误都是关于不成熟优化的。看来，唯一在诱惑面前没有堕落的，只有耶稣，即使是大师也无法抗拒。既然如此，建议把下面的话放在电脑桌面上：　　 <br />　　让一个正确的程序更快速，比让一个快速的程序正确，要容易的太多太多。 </p><p class="main">第5条：不要进行不成熟的劣化 <br />　　什么是不成熟的劣化呢？典型的有：　　 <br />　　在可以通过引用传递的时候，却定义了通过值传递参数。 <br />　　在使用前缀++操作符很适合的场合，却使用后缀版本。 <br />　　在构造函数中使用赋值操作而不是初始化列表。 <br />　　关于第一条有一些例外，一般而言，不建议传递原生类型的引用（讨论前提是传值的程序语义没有问题）。关于第二条，一些很老的C语言的书上有过后缀版本可能比前缀版本更快----当然，这只可能针对原生类型--的说法，忘记它吧，现代编译器会轻而易举的优化掉这之间的差异。而对于用户定义类型，实现后缀形式的++和--操作符都意味着效率上的损失。习惯的力量是巨大的，养成使用前缀版本的习惯吧。<br />　　然而，要区别不成熟的优化和不成熟的劣化之间，需要足够的训练和基础知识，这些知识可以从《Effective C++》,《More Effective C++》《Exceptional C++》《More Exceptional C++》中获得。</p><p class="main"><br />第6条：尽量减少全局和共享数据 <br />　　全局数据是应该努力避免的，它导致两个问题：名字污染和远程耦合。类的公有静态变量只是解决了名字污染问题，并没有解决远程数据耦合问题。同样，Singleton模式也存在远程耦合问题。 <br />　　全局数据通常就意味着共享，共享数据则意味着关系，意味着复杂性。再多线程中，对共享数据的访问通常都需要串行化。 <br />　　关于变量，一个比较深刻的看法是：一个算法使用的变量（命名的和匿名的）越少，就越好。这个变量包括局部变量。　　 </p><p class="main">第7条：信息隐藏 <br />　　对于一个类，决不要将数据公开（数值聚合的struct 例外），也不要返回指向内部数据成员的指针或引用供外部代码修改。通过提供抽象，我们将获得插入不变式检查的能力。　　 </p><p class="main">第8条：懂得何时和如何进行并发性编程 <br />　　这个问题主要是考虑多线程和多进程的编程，我期待着并行程序设计进入C++的领域。要编写正确、安全的多线程代码并不简单，特别是考虑到可移植性时，更是如此。 <br />　　不过，本条目的题目太大了，很难在一个条目中描述完整，只能概述几个要点：　　 <br />　　参考目标平台文档，了解该平台的同步化原语。 <br />　　最好将平台原语用自己设计的抽象包装起来 <br />　　确保正在使用的类型在多线程程序中使用是安全的 </p><p class="main">第9条：确保资源为对象所拥有。使用显式的RAII和智能指针 <br />　　好像是在《Imperfact C++》中说过：仅仅因为有RAII就值得使用C++。C++/CLI也强调引入确定性析构，确定性析构正式RAII得以实现的基础之一。通过RAII我们能够得到的远远超出一般程序员的想象，在讨论异常安全代码时，将进一步见识RAII的威力。 <br />　　在实现RAII时，需要小心复制构造和赋值，编译器的版本可能并不正确。另外，需要确保资源为对象所有，不要在一行分配一个以上的资源。下面的代码是不安全的： <br />　　Fun(shared_ptr(new Widget), shared_ptr(new Widget)); <br />　　取而代之的正确方法是： <br />　　shared_ptr sp1(new Widget), sp2(new Widget); <br />　　 Fun(sp1, sp2);</p><p class="main"><font size="2">Trackback: <a class="" title="http://ncre.csai.cn/ncrefx/200605300909241137.htm" href="http://ncre.csai.cn/ncrefx/200605300909241137.htm" target="_blank">http://ncre.csai.cn/ncrefx/200605300909241137.htm</a></font><br /></p><img src ="http://www.cppblog.com/urgentmind/aggbug/7920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2006-05-31 11:27 <a href="http://www.cppblog.com/urgentmind/articles/7920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++delete运算符的想法</title><link>http://www.cppblog.com/urgentmind/articles/1882.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Mon, 19 Dec 2005 07:47:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/1882.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/1882.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/1882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/1882.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/1882.html</trackback:ping><description><![CDATA[问题的提出：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;针对C++的delete运算符的用法，运行下例程序段：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;e</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">(e);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">p</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;*</SPAN><SPAN style="COLOR: #000000">p</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>delete&nbsp;p;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">p</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;*</SPAN><SPAN style="COLOR: #000000">p</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>p</SPAN><SPAN style="COLOR: #000000">=&amp;</SPAN><SPAN style="COLOR: #000000">e;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">p</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;*</SPAN><SPAN style="COLOR: #000000">p</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;</SPAN></DIV><BR>Output:<BR>0x4a2480 3<BR>0x4a2480 0<BR>0x22ff74 3<BR><BR>为何p在释放后还有其地址存在，且其指向变为初始值？<BR>用char型变量测试，如同，只是改成了初始值""<BR>对于后面的p=&amp;e，为何能够继续运行？<BR><BR>对于内存变量的操作，释放内存空间的真正操作为什么？<img src ="http://www.cppblog.com/urgentmind/aggbug/1882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2005-12-19 15:47 <a href="http://www.cppblog.com/urgentmind/articles/1882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个C语言内定义的宏(转)</title><link>http://www.cppblog.com/urgentmind/articles/1648.html</link><dc:creator>TanZek</dc:creator><author>TanZek</author><pubDate>Fri, 09 Dec 2005 10:43:00 GMT</pubDate><guid>http://www.cppblog.com/urgentmind/articles/1648.html</guid><wfw:comment>http://www.cppblog.com/urgentmind/comments/1648.html</wfw:comment><comments>http://www.cppblog.com/urgentmind/articles/1648.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/urgentmind/comments/commentRss/1648.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/urgentmind/services/trackbacks/1648.html</trackback:ping><description><![CDATA[<P>C标准中指定了一些预定义的宏<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__DATE__<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进行预处理的日期（“Mmm&nbsp;dd&nbsp;yyyy”形式的字符串文字）<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__FILE__<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代表当前源代码文件名的字符串文字<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__LINE__<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代表当前源代码中的行号的整数常量<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__TIME__<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;源文件编译时间，格式微“hh：mm：ss”<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__func__<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当前所在函数名&nbsp;<BR><BR><BR>上述宏的使用:<BR>//cpp.cpp<BR>#include &lt;iostream&gt;<BR>#include &lt;cstdlib&gt;</P>
<P>void why_me();</P>
<P>using namespace std;</P>
<P>int main(int argc, char* argv[])<BR>{<BR>&nbsp; cout&lt;&lt;"The file is "&lt;&lt;__FILE__&lt;&lt;"."&lt;&lt;endl;<BR>&nbsp; cout&lt;&lt;"The date is "&lt;&lt;__DATE__&lt;&lt;"."&lt;&lt;endl;<BR>&nbsp; cout&lt;&lt;"The time is "&lt;&lt;__TIME__&lt;&lt;"."&lt;&lt;endl;<BR>&nbsp; cout&lt;&lt;"This is line "&lt;&lt;__LINE__&lt;&lt;"."&lt;&lt;endl;<BR>&nbsp; cout&lt;&lt;"This function is "&lt;&lt;__func__&lt;&lt;"."&lt;&lt;endl;<BR>&nbsp; why_me();<BR>&nbsp; system("PAUSE");<BR>&nbsp; return 0;<BR>}</P>
<P>void why_me(void)<BR>{<BR>&nbsp; cout&lt;&lt;"This function is "&lt;&lt;__func__&lt;&lt;"."&lt;&lt;endl;<BR>&nbsp; cout&lt;&lt;"The file is "&lt;&lt;__FILE__&lt;&lt;"."&lt;&lt;endl;<BR>&nbsp; cout&lt;&lt;"This is line "&lt;&lt;__LINE__&lt;&lt;"."&lt;&lt;endl;<BR>}<BR></P>
<P><BR>输出结果如下:<BR><IMG height=151 alt=output.bmp src="http://www.cppblog.com/images/cppblog_com/urgentmind/output.bmp" width=511 border=0><BR><BR><BR>Trackback:&nbsp; <A href="http://www.blogcn.com/user65/yk103/index.html">http://www.blogcn.com/user65/yk103/index.html</A></P><img src ="http://www.cppblog.com/urgentmind/aggbug/1648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/urgentmind/" target="_blank">TanZek</a> 2005-12-09 18:43 <a href="http://www.cppblog.com/urgentmind/articles/1648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>