﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++编程失乐园-随笔分类-C++特性</title><link>http://www.cppblog.com/mumutou/category/3313.html</link><description>致力于解决论坛的不足,探讨C++的原理</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 09:08:45 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 09:08:45 GMT</pubDate><ttl>60</ttl><item><title>C++随笔 之 C++风格的类型转换的用法 (转载)</title><link>http://www.cppblog.com/mumutou/archive/2007/01/16/17682.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Tue, 16 Jan 2007 05:24:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2007/01/16/17682.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/17682.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2007/01/16/17682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/17682.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/17682.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<font face="Courier New" size="2">C++风格的类型转换的用法 </font>
				<p>
						<font face="Courier New" size="2">这是More Effecitve C++里的第二条对类型转换讲的很好，也很基础好懂。<br />Item M2：尽量使用C++风格的类型转换<br />仔细想想地位卑贱的类型转换功能（cast），其在程序设计中的地位就象goto语句一样令人鄙视。但是它还不是无法令人忍受，因为当在某些紧要的关头，类型转换还是必需的，这时它是一个必需品。<br />不过C风格的类型转换并不代表所有的类型转换功能。<br />一来它们过于粗鲁，能允许你在任何类型之间进行转换。不过如果要进行更精确的类型转换，这会是一个优点。在这些类型转换中存在着巨大的不同，例如把一个指向 const对象的指针（pointer-to-const-object）转换成指向非const对象的指针（pointer-to-non-const -object）(即一个仅仅去除const的类型转换)，把一个指向基类的指针转换成指向子类的指针（即完全改变对象类型）。传统的C风格的类型转换不对上述两种转换进行区分。（这一点也不令人惊讶，因为C风格的类型转换是为C语言设计的，而不是为C++语言设计的）。<br />二来C风格的类型转换在程序语句中难以识别。在语法上，类型转换由圆括号和标识符组成，而这些可以用在C＋＋中的任何地方。这使得回答象这样一个最基本的有关类型转换的问题变得很困难：“在这个程序中是否使用了类型转换？”。这是因为人工阅读很可能忽略了类型转换的语句，而利用象grep的工具程序也不能从语句构成上区分出它们来。<br />C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点，这四个操作符是, static_cast, const_cast, dynamic_cast, 和reinterpret_cast。在大多数情况下，对于这些操作符你只需要知道原来你习惯于这样写，<br />(type) expression<br />而现在你总应该这样写：<br />static_cast&lt;type&gt;(expression)<br />例如，假设你想把一个int转换成double，以便让包含int类型变量的表达式产生出浮点数值的结果。如果用C风格的类型转换，你能这样写：<br />int firstNumber, secondNumber;<br />...<br />double result = ((double)firstNumber)/secondNumber；<br />如果用上述新的类型转换方法，你应该这样写：<br />double result = static_cast&lt;double&gt;(firstNumber)/secondNumber;<br />这样的类型转换不论是对人工还是对程序都很容易识别。<br />static_cast 在功能上基本上与C风格的类型转换一样强大，含义也一样。它也有功能上限制。例如，你不能用static_cast象用C风格的类型转换一样把 struct转换成int类型或者把double类型转换成指针类型，另外，static_cast不能从表达式中去除const属性，因为另一个新的类型转换操作符const_cast有这样的功能。<br />其它新的C++类型转换操作符被用在需要更多限制的地方。const_cast用于类型转换掉表达式的const或volatileness属性。通过使用const_cast，你向人们和编译器强调你通过类型转换想做的只是改变一些东西的 constness或者volatileness属性。这个含义被编译器所约束。如果你试图使用const_cast来完成修改constness 或者volatileness属性之外的事情，你的类型转换将被拒绝。下面是一些例子：<br />class Widget { ... };<br />class SpecialWidget: public Widget { ... };<br />void update(SpecialWidget *psw);<br />SpecialWidget sw; // sw 是一个非const 对象。<br />const SpecialWidget&amp; csw = sw; // csw 是sw的一个引用<br />// 它是一个const 对象<br />update(&amp;csw); // 错误!不能传递一个const SpecialWidget* 变量<br />// 给一个处理SpecialWidget*类型变量的函数<br />update(const_cast&lt;SpecialWidget*&gt;(&amp;csw));<br />// 正确，csw的const被显示地转换掉（<br />// csw和sw两个变量值在update<br />//函数中能被更新）<br />update((SpecialWidget*)&amp;csw);<br />// 同上，但用了一个更难识别<br />//的C风格的类型转换<br />Widget *pw = new SpecialWidget;<br />update(pw); // 错误！pw的类型是Widget*，但是<br />// update函数处理的是SpecialWidget*类型<br />update(const_cast&lt;SpecialWidget*&gt;(pw));<br />// 错误！const_cast仅能被用在影响<br />// constness or volatileness的地方上。,<br />// 不能用在向继承子类进行类型转换。<br />到目前为止，const_cast最普通的用途就是转换掉对象的const属性。<br />第二种特殊的类型转换符是dynamic_cast，它被用于安全地沿着类的继承关系向下进行类型转换。这就是说，你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用，而且你能知道转换是否成功。失败的转换将返回空指针（当对指针进行类型转换时）或者抛出异常（当对引用进行类型转换时）：<br />Widget *pw;<br />...<br />update(dynamic_cast&lt;SpecialWidget*&gt;(pw));<br />// 正确，传递给update函数一个指针<br />// 是指向变量类型为SpecialWidget的pw的指针<br />// 如果pw确实指向一个对象,<br />// 否则传递过去的将使空指针。<br />void updateViaRef(SpecialWidget&amp; rsw);<br />updateViaRef(dynamic_cast&lt;SpecialWidget&amp;&gt;(*pw));<br />//正确。传递给updateViaRef函数<br />// SpecialWidget pw 指针，如果pw<br />// 确实指向了某个对象<br />// 否则将抛出异常<br />dynamic_casts在帮助你浏览继承层次上是有限制的。它不能被用于缺乏虚函数的类型上（参见条款M24），也不能用它来转换掉constness：<br />int firstNumber, secondNumber;<br />...<br />double result = dynamic_cast&lt;double&gt;(firstNumber)/secondNumber;<br />// 错误！没有继承关系<br />const SpecialWidget sw;<br />...<br />update(dynamic_cast&lt;SpecialWidget*&gt;(&amp;sw));<br />// 错误! dynamic_cast不能转换<br />// 掉const。<br />如你想在没有继承关系的类型中进行转换，你可能想到static_cast。如果是为了去除const，你总得用const_cast。<br />这四个类型转换符中的最后一个是reinterpret_cast。使用这个操作符的类型转换，其的转换结果几乎都是执行期定义（implementation-defined）。因此，使用reinterpret_casts的代码很难移植。<br />reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。例如，假设你有一个函数指针数组：<br />typedef void (*FuncPtr)(); // FuncPtr is 一个指向函数<br />// 的指针，该函数没有参数<br />// 返回值类型为void<br />FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳<br />// 10个FuncPtrs指针的数组<br />让我们假设你希望（因为某些莫名其妙的原因）把一个指向下面函数的指针存入funcPtrArray数组：<br />int doSomething();<br />你不能不经过类型转换而直接去做，因为doSomething函数对于funcPtrArray数组来说有一个错误的类型。在FuncPtrArray数组里的函数返回值是void类型，而doSomething函数返回值是int类型。<br />funcPtrArray[0] = &amp;doSomething; // 错误！类型不匹配<br />reinterpret_cast可以让你迫使编译器以你的方法去看待它们：<br />funcPtrArray[0] = // this compiles<br />reinterpret_cast&lt;FuncPtr&gt;(&amp;doSomething);<br />转换函数指针的代码是不可移植的（C++不保证所有的函数指针都被用一样的方法表示），在一些情况下这样的转换会产生不正确的结果（参见条款M31），所以你应该避免转换函数指针类型，除非你处于着背水一战和尖刀架喉的危急时刻。一把锋利的刀。一把非常锋利的刀。<br />如果你使用的编译器缺乏对新的类型转换方式的支持，你可以用传统的类型转换方法代替static_cast, const_cast, 以及reinterpret_cast。也可以用下面的宏替换来模拟新的类型转换语法：<br />#define static_cast(TYPE,EXPR) ((TYPE)(EXPR))<br />#define const_cast(TYPE,EXPR) ((TYPE)(EXPR))<br />#define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR))<br />你可以象这样使用使用：<br />double result = static_cast(double, firstNumber)/secondNumber;<br />update(const_cast(SpecialWidget*, &amp;sw));<br />funcPtrArray[0] = reinterpret_cast(FuncPtr, &amp;doSomething);<br />这些模拟不会象真实的操作符一样安全，但是当你的编译器可以支持新的的类型转换时，它们可以简化你把代码升级的过程。<br />没有一个容易的方法来模拟dynamic_cast的操作，但是很多函数库提供了函数，安全地在派生类与基类之间进行类型转换。如果你没有这些函数而你有必须进行这样的类型转换，你也可以回到C风格的类型转换方法上，但是这样的话你将不能获知类型转换是否失败。当然，你也可以定义一个宏来模拟 dynamic_cast的功能，就象模拟其它的类型转换一样：<br />#define dynamic_cast(TYPE,EXPR) (TYPE)(EXPR)<br />请记住，这个模拟并不能完全实现dynamic_cast的功能，它没有办法知道转换是否失败。<br />我知道，是的，我知道，新的类型转换操作符不是很美观而且用键盘键入也很麻烦。如果你发现它们看上去实在令人讨厌，C风格的类型转换还可以继续使用并且合法。然而，正是因为新的类型转换符缺乏美感才能使它弥补了在含义精确性和可辨认性上的缺点。并且，使用新类型转换符的程序更容易被解析（不论是对人工还是对于工具程序），它们允许编译器检测出原来不能发现的错误。这些都是放弃C风格类型转换方法的强有力的理由。还有第三个理由：也许让类型转换符不美观和键入麻烦是一件好事。 </font>
				</p>
		</div>
<img src ="http://www.cppblog.com/mumutou/aggbug/17682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2007-01-16 13:24 <a href="http://www.cppblog.com/mumutou/archive/2007/01/16/17682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 explicit 关键字(转载)</title><link>http://www.cppblog.com/mumutou/archive/2007/01/16/17681.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Tue, 16 Jan 2007 05:21:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2007/01/16/17681.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/17681.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2007/01/16/17681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/17681.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/17681.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">explicit关键字用于取消构造函数的隐式转换，对有多个参数的构造函数使用explicit是个语法错误。<br /></font>
		<p>
				<br />
		</p>
		<p>
				<font face="Courier New" size="2">In C++ it is possible to declare constructors for a class, taking a single parameter, and use those constructors for doing type conversion. For example: <br /></font>
		</p>
		<pre>
				<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<span style="COLOR: rgb(0,0,0)">
						</span>
						<span style="COLOR: rgb(0,0,255)">
								<font size="2">class</font>
						</span>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> A {<br /></span>
								<span style="COLOR: rgb(0,0,255)">public</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">:<br />        A(</span>
								<span style="COLOR: rgb(0,0,255)">int</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />};<br /><br /></span>
								<span style="COLOR: rgb(0,0,255)">void</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> f(A) {}<br /></span>
								<span style="COLOR: rgb(0,0,255)">void</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> g()<br />{<br />         A a1 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,0)">37</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">;<br />         A a2 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> A(</span>
								<span style="COLOR: rgb(0,0,0)">47</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />         A a3(</span>
								<span style="COLOR: rgb(0,0,0)">57</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />         a1 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,0)">67</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">;<br />         f(</span>
								<span style="COLOR: rgb(0,0,0)">77</span>
						</font>
						<span style="COLOR: rgb(0,0,0)">
								<font size="2">);<br />}<br /></font>
						</span>
				</div>
				<br />
				<font size="2">A declaration like:<br />	 A a1 = 37;<br />says to call the A(int) constructor to create an A object from
the integer value. Such a constructor is called a "converting
constructor". <br /></font>
		</pre>
		<p>
				<font face="Courier New" size="2">However, this type of implicit conversion can be confusing, and there is a way of disabling it, using a new keyword "explicit" in the constructor declaration: <br /></font>
		</p>
		<pre>
				<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<span style="COLOR: rgb(0,0,0)">
						</span>
						<span style="COLOR: rgb(0,0,255)">
								<font size="2">class</font>
						</span>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> A {<br /></span>
								<span style="COLOR: rgb(0,0,255)">public</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">:<br />        </span>
								<span style="COLOR: rgb(0,0,255)">explicit</span>
								<span style="COLOR: rgb(0,0,0)"> A(</span>
								<span style="COLOR: rgb(0,0,255)">int</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />};<br /><br /></span>
								<span style="COLOR: rgb(0,0,255)">void</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> f(A) {}<br /></span>
								<span style="COLOR: rgb(0,0,255)">void</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> g()<br />{<br />          A a1 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,0)">37</span>
								<span style="COLOR: rgb(0,0,0)">;      </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> illegal</span>
						</font>
						<span style="COLOR: rgb(0,128,0)">
								<br />
						</span>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">          A a2 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> A(</span>
								<span style="COLOR: rgb(0,0,0)">47</span>
								<span style="COLOR: rgb(0,0,0)">);   </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> OK</span>
						</font>
						<span style="COLOR: rgb(0,128,0)">
								<br />
						</span>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">          A a3(</span>
								<span style="COLOR: rgb(0,0,0)">57</span>
								<span style="COLOR: rgb(0,0,0)">);       </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> OK</span>
						</font>
						<span style="COLOR: rgb(0,128,0)">
								<br />
						</span>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">          a1 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,0)">67</span>
								<span style="COLOR: rgb(0,0,0)">;        </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> illegal</span>
						</font>
						<span style="COLOR: rgb(0,128,0)">
								<br />
						</span>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">          f(</span>
								<span style="COLOR: rgb(0,0,0)">77</span>
								<span style="COLOR: rgb(0,0,0)">);          </span>
								<span style="COLOR: rgb(0,128,0)">//</span>
								<span style="COLOR: rgb(0,128,0)"> illegal</span>
						</font>
						<span style="COLOR: rgb(0,128,0)">
								<br />
						</span>
						<span style="COLOR: rgb(0,0,0)">
								<font size="2">}<br /><br /></font>
						</span>
				</div>
				<br />
		</pre>
		<font face="Courier New" size="2">Using the explicit keyword, a constructor is declared to be<br />"nonconverting", and explicit constructor syntax is required:<br /><br /></font>
		<pre>
				<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
						<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
						<span style="COLOR: rgb(0,0,255)">
								<font size="2">class</font>
						</span>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> A {<br /></span>
								<span style="COLOR: rgb(0,0,255)">public</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">:<br />        </span>
								<span style="COLOR: rgb(0,0,255)">explicit</span>
								<span style="COLOR: rgb(0,0,0)"> A(</span>
								<span style="COLOR: rgb(0,0,255)">int</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />        };<br /><br /></span>
								<span style="COLOR: rgb(0,0,255)">void</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> f(A) {}<br /><br /></span>
								<span style="COLOR: rgb(0,0,255)">void</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> g()<br />{<br />        A a1 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> A(</span>
								<span style="COLOR: rgb(0,0,0)">37</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />        A a2 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> A(</span>
								<span style="COLOR: rgb(0,0,0)">47</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />        A a3(</span>
								<span style="COLOR: rgb(0,0,0)">57</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />        a1 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> A(</span>
								<span style="COLOR: rgb(0,0,0)">67</span>
						</font>
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">);<br />        f(A(</span>
								<span style="COLOR: rgb(0,0,0)">77</span>
						</font>
						<span style="COLOR: rgb(0,0,0)">
								<font size="2">));<br />}<br /><br /></font>
						</span>
				</div>
				<br />
		</pre>
		<p>
				<font face="Courier New" size="2">Note that an expression such as: <br /></font>
		</p>
		<pre>
				<font size="2">        A(47)<br /></font>
		</pre>
		<p>
				<font face="Courier New" size="2">is closely related to function-style casts supported by C++. For example: <br /></font>
		</p>
		<pre>
				<font size="2">        double d = 12.34;<br /><br />        int i = int(d);<br /></font>
		</pre>
<img src ="http://www.cppblog.com/mumutou/aggbug/17681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2007-01-16 13:21 <a href="http://www.cppblog.com/mumutou/archive/2007/01/16/17681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 文件操作(转载)</title><link>http://www.cppblog.com/mumutou/archive/2007/01/16/17680.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Tue, 16 Jan 2007 05:18:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2007/01/16/17680.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/17680.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2007/01/16/17680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/17680.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/17680.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="/lmlf001/archive/2006/04/18/5815.html">
						<font face="Courier New" size="2">C++文件操作</font>
				</a>
				<font face="Courier New" size="2">
				</font>
		</h2>
		<font face="Courier New" size="2"> 原文地址：http://www.layz.net/blog/user1/xuanxuan/archives/2006/67.html<br /> 在C++中，有一个stream这个类，所有的I/O都以这个“流”类为基础的，包括我们要认识的文件I/O，stream这个类有两个重要的运算符： <br /><br />1、插入器(&lt;&lt;) <br />　　向流输出数据。比如说系统有一个默认的标准输出流(cout)，一般情况下就是指的显示器，所以，cout&lt;&lt;"Write Stdout"&lt;&lt;'\n';就表示把字符串"Write Stdout"和换行字符('\n')输出到标准输出流。 <br /><br />2、析取器(&gt;&gt;) <br />　　从流中输入数据。比如说系统有一个默认的标准输入流(cin)，一般情况下就是指的键盘，所以，cin&gt;&gt;x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。 <br /><br />　　在C++中，对文件的操作是通过stream的子类fstream(file stream)来实现的，所以，要用这种方式操作文件，就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。 <br /><br />一、打开文件 <br />　　在fstream类中，有一个成员函数open()，就是用来打开文件的，其原型是： <br /><br />void open(const char* filename,int mode,int access); <br /><br />参数： <br /><br />filename：　　要打开的文件名 <br />mode：　　　　要打开文件的方式 <br />access：　　　打开文件的属性 <br />打开文件的方式在类ios(是所有流式I/O类的基类)中定义，常用的值如下： <br /><br />ios::app：　　　以追加的方式打开文件 <br />ios::ate：　　　文件打开后定位到文件尾，ios:app就包含有此属性 <br />ios::binary： 　以二进制方式打开文件，缺省的方式是文本方式。两种方式的区别见前文 <br />ios::in：　　　 文件以输入方式打开 <br />ios::out：　　　文件以输出方式打开 <br />ios::nocreate： 不建立文件，所以文件不存在时打开失败　 <br />ios::noreplace：不覆盖文件，所以打开文件时如果文件存在失败 <br />ios::trunc：　　如果文件存在，把文件长度设为0 <br />　　可以用“或”把以上属性连接起来，如ios::out|ios::binary <br /><br />　　打开文件的属性取值是： <br /><br />0：普通文件，打开访问 <br />1：只读文件 <br />2：隐含文件 <br />4：系统文件 <br />　　可以用“或”或者“+”把以上属性连接起来 ，如3或1|2就是以只读和隐含属性打开文件。 <br /><br />　　例如：以二进制输入方式打开文件c:\config.sys <br /><br />　　fstream file1; <br />　　file1.open("c:\\config.sys",ios::binary|ios::in,0); <br /><br />　　如果open函数只有文件名一个参数，则是以读/写普通文件打开，即： <br /><br />　　file1.open("c:\\config.sys");&lt;=&gt;file1.open("c:\\config.sys",ios::in|ios::out,0); <br /><br />　　另外，fstream还有和open()一样的构造函数，对于上例，在定义的时侯就可以打开文件了： <br /><br />　　fstream file1("c:\\config.sys"); <br /><br />　　特别提出的是，fstream有两个子类：ifstream(input file stream)和ofstream(outpu file stream)，ifstream默认以输入方式打开文件，而ofstream默认以输出方式打开文件。 <br /><br />　　ifstream file2("c:\\pdos.def");//以输入方式打开文件 <br />　　ofstream file3("c:\\x.123");//以输出方式打开文件 <br /><br />　　所以，在实际应用中，根据需要的不同，选择不同的类来定义：如果想以输入方式打开，就用ifstream来定义；如果想以输出方式打开，就用ofstream来定义；如果想以输入/输出方式来打开，就用fstream来定义。 <br /><br />二、关闭文件 <br />　　打开的文件使用完成后一定要关闭，fstream提供了成员函数close()来完成此操作，如：file1.close();就把file1相连的文件关闭。 <br /><br />三、读写文件 <br />　　读写文件分为文本文件和二进制文件的读取，对于文本文件的读取比较简单，用插入器和析取器就可以了；而对于二进制的读取就要复杂些，下要就详细的介绍这两种方式 <br /><br />　　1、文本文件的读写 <br />　　文本文件的读写很简单：用插入器(&lt;&lt;)向文件输出；用析取器(&gt;&gt;)从文件输入。假设file1是以输入方式打开，file2以输出打开。示例如下： <br /><br />　　file2&lt;&lt;"I Love You";//向文件写入字符串"I Love You" <br />　　int i; <br />　　file1&gt;&gt;i;//从文件输入一个整数值。 <br /><br />　　这种方式还有一种简单的格式化能力，比如可以指定输出为16进制等等，具体的格式有以下一些 <br /><br />操纵符 功能 输入/输出 <br />dec 格式化为十进制数值数据 输入和输出 <br />endl 输出一个换行符并刷新此流 输出 <br />ends 输出一个空字符 输出 <br />hex 格式化为十六进制数值数据 输入和输出 <br />oct 格式化为八进制数值数据 输入和输出 <br />setpxecision(int p) 设置浮点数的精度位数 输出 <br /><br />　　比如要把123当作十六进制输出：file1&lt;&lt;&lt;123;要把3.1415926以5位精度输出：FILE1&lt;<setpxecision(5)>&lt;&lt;3.1415926。 <br /><br />　　2、二进制文件的读写 <br />①put() <br />　　put()函数向流写入一个字符，其原型是ofstream &amp;put(char ch)，使用也比较简单，如file1.put('c');就是向流写一个字符'c'。 <br /><br />②get() <br />　　get()函数比较灵活，有3种常用的重载形式： <br /><br />　　一种就是和put()对应的形式：ifstream &amp;get(char &amp;ch);功能是从流中读取一个字符，结果保存在引用ch中，如果到文件尾，返回空字符。如file2.get(x);表示从文件中读取一个字符，并把读取的字符保存在x中。 <br /><br />　　另一种重载形式的原型是： int get();这种形式是从流中返回一个字符，如果到达文件尾，返回EOF，如x=file2.get();和上例功能是一样的。 <br /><br />　　还有一种形式的原型是：ifstream &amp;get(char *buf,int num,char delim='\n')；这种形式把字符读入由 buf 指向的数组，直到读入了 num 个字符或遇到了由 delim 指定的字符，如果没使用 delim 这个参数，将使用缺省值换行符'\n'。例如： <br /><br />　　file2.get(str1,127,'A');//从文件中读取字符到字符串str1，当遇到字符'A'或读取了127个字符时终止。 <br /><br />③读写数据块 <br />　　要读写二进制数据块，使用成员函数read()和write()成员函数，它们原型如下： <br /><br />　　　　read(unsigned char *buf,int num); <br />　　　　write(const unsigned char *buf,int num); <br /><br />　　read()从文件中读取 num 个字符到 buf 指向的缓存中，如果在还未读入 num 个字符时就到了文件尾，可以用成员函数 int gcount();来取得实际读取的字符数；而 write() 从buf 指向的缓存写 num 个字符到文件中，值得注意的是缓存的类型是 unsigned char *，有时可能需要类型转换。 <br /><br />例： <br /><br />　　　　unsigned char str1[]="I Love You"; <br />　　　　int n[5]; <br />　　　　ifstream in("xxx.xxx"); <br />　　　　ofstream out("yyy.yyy"); <br />　　　　out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中 <br />　　　　in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数，注意类型转换 <br />　　　　in.close();out.close(); <br /><br />四、检测EOF <br />　　成员函数eof()用来检测是否到达文件尾，如果到达文件尾返回非0值，否则返回0。原型是int eof(); <br /><br />例：　　if(in.eof())ShowMessage("已经到达文件尾！"); <br /><br />五、文件定位 <br />　　和C的文件操作方式不同的是，C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针，它说明输入操作在文件中的位置；另一个是写指针，它下次写操作的位置。每次执行输入或输出时，相应的指针自动变化。所以，C++的文件定位分为读位置和写位置的定位，对应的成员函数是 seekg()和 seekp()，seekg()是设置读位置，seekp是设置写位置。它们最通用的形式如下： <br /><br />　　　　istream &amp;seekg(streamoff offset,seek_dir origin); <br />　　　　ostream &amp;seekp(streamoff offset,seek_dir origin); <br /><br />　　streamoff定义于 iostream.h 中，定义有偏移量 offset 所能取得的最大值，seek_dir 表示移动的基准位置，是一个有以下值的枚举： <br /><br />ios::beg：　　文件开头 <br />ios::cur：　　文件当前位置 <br />ios::end：　　文件结尾 <br />　　这两个函数一般用于二进制文件，因为文本文件会因为系统对字符的解释而可能与预想的值不同。 <br /><br />例： <br /><br />　　　　 file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节 <br />　　　　 file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节</setpxecision(5)></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/17680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2007-01-16 13:18 <a href="http://www.cppblog.com/mumutou/archive/2007/01/16/17680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 函数模板(Function Template)1 (原创)</title><link>http://www.cppblog.com/mumutou/archive/2007/01/10/17497.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Wed, 10 Jan 2007 06:36:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2007/01/10/17497.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/17497.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2007/01/10/17497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/17497.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/17497.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">1.Function Template可以针对不同的Template arguments完成一个系列的函数<br />例如<br />template&lt;typename T&gt;<br />inline T const &amp; max(T const &amp;a,T const &amp;b)<br />{<br />   return   a&gt;b?a:b;<br />}<br />2.Function template可以从传递过来的arguments的类型来具体化<br />int a = ::max(10,20);<br />那么Function template 就具体化为<br />inline int const&amp; max(int const &amp;a,int const &amp; b)<br />3.你可以具体指出它的参数类型<br />int a = ::max&lt;int&gt;(10,20);<br />4.Function template可以被重载overloaded<br />inline T const&amp; max(T const &amp;a,T const &amp;b,T const &amp;c)<br />{<br />   return ::max(::max(a,b),c);<br />}<br />当然记住一点，重载的相似点越小越好</font>
<img src ="http://www.cppblog.com/mumutou/aggbug/17497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2007-01-10 14:36 <a href="http://www.cppblog.com/mumutou/archive/2007/01/10/17497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 关于C++中的指针问题 </title><link>http://www.cppblog.com/mumutou/archive/2007/01/09/17458.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Tue, 09 Jan 2007 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2007/01/09/17458.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/17458.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2007/01/09/17458.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/17458.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/17458.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">原文出处<br /></font>
				<a href="http://community.csdn.net/Expert/topic/5279/5279199.xml?temp=.2457392">
						<font face="Courier New" size="2">http://community.csdn.net/Expert/topic/5279/5279199.xml?temp=.2457392</font>
				</a>
				<br />
				<font face="Courier New" size="2">在文章中大家在讨论一个问题:<br />如果没有存储上没有区别的话,请看下例：<br />float a=3.45;<br />int * p1=&amp;a;<br />float * p2=&amp;a;<br />cout&lt;&lt;"p1"&lt;&lt;"=&gt;"&lt;&lt;*p1&lt;&lt;endl;<br />cout&lt;&lt;"p2"&lt;&lt;"=&gt;"&lt;&lt;*p2&lt;&lt;endl;</font>
		</p>
		<p>
				<font face="Courier New" size="2">结果是：<br />p1=&gt;1107951616<br />p2=&gt;3.45</font>
		</p>
		<p>
				<font face="Courier New" size="2">书上的解释是：p1尽管与p2的地址相同，但它是整型指针，它总是访问该地址中的整型数。<br />首先在32位CPU上面,指针都是4位的,例如0xXX XX XX XX<br />那么既然指针是一样的,那么为什么指针类型不同的话,读出来的数据就变了样呢?<br />这是编译器的问题,例如我有个例子<br /><br />char *p = 'c';<br />int *p1 = 10;<br />在32位机器上面<br />这里面p1是指向4字节的int变量,而p是指向1字节的char 变量<br />这样编译器在用p1变量的时候,会取0x XX XX XX XX后面的4个字节<br />而p变量,只会取0x XX XX XX XX后面的1个字节<br /><br />因为本人现在在网吧里面[不知道大家有没有在网吧里面碰到装有c++编译器的计算机]<br />晚上我给大家一个例子,可以从其内存上面看的很清楚</font>
		</p>
<img src ="http://www.cppblog.com/mumutou/aggbug/17458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2007-01-09 13:48 <a href="http://www.cppblog.com/mumutou/archive/2007/01/09/17458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 泛型编程与设计新思维(转载)</title><link>http://www.cppblog.com/mumutou/archive/2007/01/04/17238.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Thu, 04 Jan 2007 07:07:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2007/01/04/17238.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/17238.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2007/01/04/17238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/17238.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/17238.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">  <font size="3">作者：徐景周<br /></font><br />   永远记住，编写代码的宗旨在于简单明了，不要使用语言中的冷僻特性，耍小聪明，重要的是编写你理解的代码，理解你编写的代码，这样你可能会做的更好。 </font>
		<div align="right">
				<font face="Courier New" size="2">--- Herb Sutter </font>
		</div>
		<br />
		<font face="Courier New" size="2">    1998年，国际C++标准正式通过，标准化对C++最重要的贡献是：对"强大的抽象概念"给于更有力的支持，以降低软件的复杂度，C++提供了二种功能强大的抽象方法：面向对象编程与泛型编程。面向对象编程大家一定很熟悉了，这里就不再哆嗦了。提到泛型编程(Generic Programming)，有的人可能还不太熟悉，但是提到STL，你就一定会有所耳闻了。STL(Standard Template Library，标准模板库) 其实就是泛型编程的实现品，STL是由Alexander Stepanov(STL之父)、David R Musser和Meng Lee三位大师共同发展，于1994年被纳入C++标准程序库。STL虽然加入C++标准库的时间相对较晚，但它却是C++标准程序库中最具革命性的部分，同时也是C++标准程序库中最重要的组成部分。由于新的C++标准库中几乎每一样东西都是由模板(Template)构成的，当然，STL也不会例外。所以，在这里有必要先概要说明一下模板的有关概念。 <br /><br /><img style="WIDTH: 85px" src="http://www.window07.com/up_files/image/2006-3-5/45488081.gif" /> 模板概念 <br />    通过使用模板可以使程序具有更好的代码重用性。记住，模板是对源代码进行重用，而不是通过继承和组合重用对象代码，当用户使用模板时，参数由编译器来替换。模板由类模板和函数模板二部分组成，以所处理的数据类型的说明作为参数的类就叫类模板，而以所处理的数据类型的说明作为参数的函数叫做函数模板。模板参数可以由类型参数或非类型参数组成，类型参数可用class和typename关键字来指明，二者的意义相同，都表示后面的参数名代表一个潜在的内置或用户定义的类型，非类型参数由一个普通参数声明构成。下面是类模板和函数模板的简单用法： template&lt;class T1, int Size&gt; class Queue // 类模板，其中T1为类型参数，Size为非类型参数 { public: explicit Queue():size_(Size){}; // 显式构造，避免隐式转换 …… template&lt;class T2&gt; void assign(T2 first,T2 last); // 内嵌函数模板 private: T* temp_; int size_; } // 类模板中内嵌函数模板Compare的外围实现(如在Queue类外实现) template&lt;class T1,int Size&gt; template&lt;class T2&gt; void Queue&lt;T1,Size&gt;::assign (T2 first,T2 last) {}; // 模板的使用方法 int ia[4] = {0,1,2,3}; Queue&lt;int, sizeof(ia)/sizeof(int)&gt; qi; qi.assign(ai,ai+4); <img style="WIDTH: 85px" src="http://www.window07.com/up_files/image/2006-3-5/45488081.gif" /> 泛型编程 <br />    泛型编程和面向对象编程不同，它并不要求你通过额外的间接层来调用函数，它让你编写完全一般化并可重复使用的算法，其效率与针对某特定数据类型而设计的算法相同。泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。所谓泛型(Genericity)，是指具有在多种数据类型上皆可操作的含意，与模板有些相似。STL巨大，而且可以扩充，它包含很多计算机基本算法和数据结构，而且将算法与数据结构完全分离，其中算法是泛型的，不与任何特定数据结构或对象类型系在一起。STL以迭代器(Iterators)和容器(Containers)为基础，是一种泛型算法(Generic Algorithms)库，容器的存在使这些算法有东西可以操作。STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(function objects)。STL并非只是一些有用组件的集合，它是描述软件组件抽象需求条件的一个正规而有条理的架构。 <br />    迭代器(Iterators)是STL的核心，它们是泛型指针，是一种指向其他对象(objects)的对象，迭代器能够遍历由对象所形成的区间(range)。迭代器让我们得以将容器(containers)与作用其上的算法(algorithms)分离，大多数的算法自身并不直接操作于容器上，而是操作于迭代器所形成的区间中。迭代器一般分为五种：Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iterator就象只从输入区间中读取数据一样，具有只读性，属于单向移动，如STL中的istream_iterator。Output Iterator刚好相反，只写出数据到输出区间中，具有只写性，属于单向移动，如STL中的ostream_iterator。Forward Iterator也属于单向移动，但不同之处是它同时具有数据读、写性。Bidirections Iterator如名称暗示，支持双向移动，不但可以累加(++)取得下一个元素，而且可以递减(--)取前一个元素，支持读、写性。Random Access Iterator功能最强，除了以上各迭代器的功能外，还支持随机元素访问(p+=n)，下标(p[n])、相减(p1-p2)及前后次序关系(p1&lt;p2)等。Input Iterator和Output Iterator属于同等最弱的二种迭代器，Forward Iterator是前二者功能的强化(refinement)，Bidirections Iterator又是Forward Iterator迭代器的强化，最后Random Access Iterator又是Bidirections Iterator迭代器的强化。如下简单示例展示Input Iterator、Forward Iterator、Bidirections Iterator和Radom Access Iterator迭代器的功能（其中input_iterator_tag等带tag字符串为各不同迭代器的专属标识）： <br />1、InputIterator template&lt;class InputIterator, class Distance&gt; void advance(InputIterator&amp; i, Distance n, input_iterator_tag) { for(; n&gt;0; --n,++i){} // InputIterator具有++性 } 2、ForwardIterator template&lt;class ForwardIterator, class Distance&gt; void advance(ForwardIterator&amp; i, Distance n,forward_iterator_tag) { advance(i, n, input_iterator_tag()); } 3、BidirectionalIterator template&lt;class BidirectionalIterator, class Distance&gt; void advance(BidirectionalIterator&amp; i, Distance n, bidirectional_iterator_tag) { if(n&gt;=0) // 具有++、--性 for(; n&gt;0; --n,++i){} else for(; n&gt;0; ++n,--i){} } 4、RandomAccessIterator template&lt;class RandomAccessIterator, class Distance&gt; void advance(RandomAccessIterator&amp; i, Distance n, random_access_iterator_tag) { i += n; // 具有++、--、+=等性 }     函数对象(Function object)也称仿函数(Functor)，是一种能以一般函数调用语法来调用的对象，函数指针(Function pointer)是一种函数对象，所有具有operator()操作符重载的成员函数也是函数对象。函数对象一般分为无参函数(Generator)，单参函数(Unary Function)和双参函数(Binary Function)三种形式，它们分别能以f()、f(x)和f(x,y)的形式被调用，STL定义的其他所有函数对象都是这三种概念的强化。如下简单示例展示几种形式的实现：<br /><br />1、无参(Generator)形式 struct counter { typedef int result_type; counter(result_type init=0):n(init){} result_type operator() { return n++;} result_type n; } 2、单参(Unary Function)形式 template&lt;class Number&gt; struct even // 函数对象even，找出第一个偶数 { bool operator()(Number x) const {return (x&amp;1) == 0;} } // 使用算法find_if在区间A到A+N中找到满足函数对象even的元素 int A[] = {1,0,3,4}; const int N=sizeof(A)/sizeof(int); find_if(A,A+N, even&lt;int&gt;()); 3、双参(Binary Function)形式 struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1&lt;s2) &lt; 0;} }; // 使用函数对象ltstr，输出set容器中A和B的并集 const int N=3 const char* a[N] = {"xjz","xzh","gh"}; const char* b[N]= {"jzx","zhx","abc"}; set&lt;const char*,ltstr&gt; A(a,a+N); set&lt;const char*,ltstr&gt; B(b,b+N); set_union(A.begin(),A.end(),B.begin(),B.end(), ostream_iterator&lt;const char*&gt;(cout," "), ltstr());     容器(container)是一种对象(object)，可以包含并管理其它的对象，并提供迭代器(iterators)用以定址其所包含之元素。根据迭代器种类的不同，容器也分为几中，以Input Iterator为迭代器的一般container，以Forward Iterator为迭代器的Forward Container，以Bidirectional Iterator 为迭代器的Reversible Container，以Random Access Iterator为迭代器的Random Access Container。STL定义二种大小可变的容器：序列式容器(Sequence Container)和关联式容器(Associative Container)序列式容器包括vector、list和deque，关联式容器包括set、map、multiset和multimap。以下示例简单说明部分容器的使用： 1、vector使用 // 将A中以元素5为分割点，分别排序，使排序后5后面的元素都大于5之前的元素(后区间不排序)， // 然后输出 int main() { int A[] = {7,2,6,4,5,8,9,3,1}; const int N=sizeof(A)/sizeof(int); vector&lt;int&gt; V(A,A+N); partial_sort(V,V+5,V+N); copy(V,V+N,ostream_iterator&lt;int&gt;(cout," ")); cout &lt;&lt; endl; } 输出可能是：1 2 3 4 5 8 9 7 6 2、list使用 // 产生一空list，插入元素后排序，然后输出 int main() { list&lt;int&gt; L1; L1.push_back(0); L1.push_front(1); L1.insert(++L1.begin,3); L1.sort(); copy(L1.begin(),L1.end(),ostream_iterator&lt;int&gt;(cout," ")); } 输出：0 1 3 3、deque使用 int main() { deque&lt;int&gt; Q; Q.push_back(3); Q.push_front(1); Q.insert(Q.begin()+1,2); Copy(Q.begin(),Q.end(),ostream_iterator&lt;int&gt;(cout," ")); } 输出：1 2 3 4、map使用 int main() { map&lt;string,int&gt; M; M.insert(make_pair("A",11); pair&lt;map&lt;string,int&gt;::iterator, bool&gt; p = M.insert(make_pair("C",5)); if(p.second) cout &lt;&lt; p.first-&gt;second&lt;&lt;endl; } 输出：5 5、multiset使用 int main() { const int N = 5; int a[N] = {4,1,1,3,5}; multiset&lt;int&gt; A(a,a+N); copy(A.begin(),A.end(),ostream_iterator&lt;int&gt;(cout," ")); } 输出：1 1 3 4 5 <img style="WIDTH: 85px" src="http://www.window07.com/up_files/image/2006-3-5/45488081.gif" /> 设计新思维 <br />    将设计模式(design patterns)、泛型编程(generic programming)和面向对象编程(object-oriented programming)有机的结合起来，便形成了设计新思维。其中，设计模式是经过提炼的出色设计方法，对于很多情况下碰到的问题，它都是合理而可复用的解决方案；泛型编程是一种典范(paradigm)，专注于将类型抽象化，形成功能需求方面的一个精细集合，并利用这些需求来实现算法，相同的算法可以运用于广泛的类型集中，所谓泛型，就是具有在多种数据类型上皆可操作的含意；最后同面象对象编程中的多态(polymorphism)和模板(templates)等技术相结合，便获得极高层次上的具有可复用性的泛型组件。泛型组件预先实现了设计模块，可以让用户指定类型和行为，从而形成合理的设计，主要特点是灵活、通用和易用。 <br />    policies和policy类，是一种重要的类设计技术，所谓policy，是用来定义一个类或类模板的接口，该接口由下列之一或全部组成：内部类型定义、成员函数和成员变量。基于policy的类由许多小型类(称为policies)组成，每一个这样的小型类只负责单纯如行为或结构的某一方面。Policies机制由模板和多重继承组成，它们可以互相混合搭配，从而形成设计戎的多样性，通过plicy类，不但可以定制行为，也可以定制结构。 <br /><br />下面简单举例说明泛化思维和面向对象思维在部分设计模式中的运用。 <br /><br />    Singletons设计模式泛化实现 Singleton模式是一种保证一个对象(class)只有一个实体，并为它提供一个全局访问点。Singleton是一种经过改进的全局变量，既在程序中只能有唯一实体的类型，它的重点主要集中在产生和管理一个独立对象上，而且不允许产生另一个这样的对象。 <br />先让我们看看一般的C++实现的基本手法，下面是实现源码： // Singleton.h文件中 class Singleton { public: static Singleton&amp; Instance() { if(!pInstance_){ if(destroyed_){ // 引用是否已经失效 OnDeadReference(); } else { Create(); // 第一次时创建实例 } } return *pInstance_; } private: Singleton(); // 禁止默认构造 Singleton(const Singleton&amp;); // 禁止拷贝构造 Singleton&amp; operator= (const Singleton&amp;);　 // 禁止赋值操作 static void Create() // 传加创建的实例引用 { static Singleton theInstance; pInstance_ = &amp;theInstance; } static void OnDeadReference() { throw std::runtime_error(" 实例被不正当消毁"); } virtual ~Singleton() { pInstance- = 0; destroyed_ = true; } static Singleton *pInstance_; static bool destroyed_; } // Singleton.cpp中静态成员变量初始化 Singleton* Singleton::pInstance_ = 0; Bool Singleton::destroyed_ = false;     如上所示，Singleton模式实现中只有一个public成员Instance()用来第一次使用时创建单一实例，当第二次使用时静态变量将已经被设定好，不会再次创建实例。还将默认构造函数、拷贝构造函数和赋值操作符放在private中，目地是不让用户使用它们。另外，为避免实例意外消毁后再实例化情况，加入静态布尔变量destroy_来进行判断是否出错，从而达到稳定性。<br />    从上面一般实现可以看出Singleton模式实现主要在于创建(Creation)方面和生存期(Lifetime)方面，既可以通过各种方法来创建Singleton。Creation必然能创建和摧毁对象，必然要开放这两个相应函数，将创建作为独立策略分离开来是必需的，这样你就可以创建多态对象了，所以泛化Singleton并不拥有Creator对象，它被放在CreationPolicy&lt;T&gt;类模板之中。生命期是指要遵循C++规则，后创建都先摧毁，负责程序生命期某一时刻摧毁Singleton对象。 <br /><br />下面是一个简单的泛化Singleton模式的实现(不考虑线程因素) template &lt; class T, template&lt;class&gt; calss CreationPolicy = CreateUsingNew, template&lt;class&gt; class LifetimePolicy=DefaultLifetime, &gt; classs SingletonHolder { public: static T&amp; Instance() { if(!pInstance_) { if(destroyed_) { LifetimePolicy&lt;T&gt;::OnDeadReference(); destroyed_ = false; } pInstance_ = CreationPolicy&lt;T&gt;::Create(); LifetimePolicy&lt;T&gt;::SchedultCall(&amp;DestorySingleton); } return *pInstance_; } private: static void DestroySinleton() { assert(!destroyed_); CreationPlicy&lt;T&gt;::Destroy(pInstance_); pInstance_ = 0; destroyed_ = true; } SingletonHolder(); SingletonHolder (const SingletonHolder &amp;); SingletonHolder &amp; operator= (const SingletonHolder &amp;);　 Static T* pInstance_; Static bool destroyed_; };     Instance()是SingletonHolder开放的唯一一个public函数，它在CreationPolicy、LifetimePolicy中打造了一层外壳。其中模板参数类型T，接收类名，既需要进行Singleton的类。模板参数内的类模板缺省参数CreateUsingNew是指通过new操作符和默认构造函数来产生对象，DefaultLifetime是通过C++规则来管理生命期。LifetimePolicy&lt;T&gt;中有二个成员函数，ScheduleDestrution()函数接受一个函数指针，指向析构操作的实际执行函数，如上面DestorySingleton析构函数；OnDeadReference()函数同上面一般C++中同名函数相同，是负责发现失效实例来抛出异常的。CreationPlicy&lt;T&gt;中的Create()和Destroy()两函数是用来创建并摧毁具体对象的。 <br /><br />下面是上述泛化Singleton模式实现的使用： <br /><br />1、应用一 class A{}; typedef SingletonHolder&lt;A, CreateUsingNew&gt; SingleA; 2、应用二 class A{}; class Derived : public A {}; template&lt;class T&gt; struct MyCreator : public CreateUsingNew&lt;T&gt; { static T* Create() { return new Derived; } static void Destroy(T* pInstance) { delete pInstance; } } typedef SingletonHolder&lt;A,MyCreator&gt; SingleA;     通过上面示例可以看出， SingletonHolder采用基于plicy设计实现，它将Singleton对象分解为数个policies，模板参数类中CreationPolicy和LifetimePolicy相当于二个policies封装体。利用它们可以协助制作出使用者自定义的Singleton对象，同时还预留了调整和扩展的空间。由此而得，泛型组件(generic components)，是一种可复用的设计模板，结合了模板和模式，是C++中创造可扩充设计的新方法，提供了从设计到代码的简易过渡，帮助我们编写清晰、灵活、高度可复用的代码。 <br /><br /><img style="WIDTH: 85px" src="http://www.window07.com/up_files/image/2006-3-5/45488081.gif" /> 参考文献 </font>
		<ul>
				<li>
						<font face="Courier New" size="2">C++ Primer(第三版) --- 潘爱民等译 </font>
				</li>
				<li>
						<font face="Courier New" size="2">Effective C++(第二版) --- 侯捷译 </font>
				</li>
				<li>
						<font face="Courier New" size="2">More Effective C++ --- 侯捷译 </font>
				</li>
				<li>
						<font face="Courier New" size="2">Exceptional C++ --- 卓小涛译 </font>
				</li>
				<li>
						<font face="Courier New" size="2">More Exceptional C++ --- 於春景译 </font>
				</li>
				<li>
						<font face="Courier New" size="2">深度探索C++对象模型 --- 侯捷译 </font>
				</li>
				<li>
						<font face="Courier New" size="2">泛型编程与STL --- 侯捷译 </font>
				</li>
				<li>
						<font face="Courier New" size="2">C++ STL程序员开发指南 --- 彭木根等箸 </font>
				</li>
				<li>
						<font face="Courier New" size="2">设计模式：可复用面向对象软件的元素 --- 李英军等译 </font>
				</li>
				<li>
						<font face="Courier New" size="2">C++设计新思维 --- 侯捷等译 </font>
				</li>
		</ul>
<img src ="http://www.cppblog.com/mumutou/aggbug/17238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2007-01-04 15:07 <a href="http://www.cppblog.com/mumutou/archive/2007/01/04/17238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 STL[vector]的存储技术(原创)</title><link>http://www.cppblog.com/mumutou/archive/2007/01/04/17231.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Thu, 04 Jan 2007 06:26:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2007/01/04/17231.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/17231.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2007/01/04/17231.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/17231.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/17231.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">首先我们先来看Example Code:<br />#include &lt;vector&gt;<br />#include &lt;iostream&gt;<br />#include &lt;memory&gt;<br />using namespace std;<br />void main()<br />{<br /> vector&lt;int&gt; v;<br />// cout&lt;&lt;v.allocator;<br /> v.push_back(0);<br /> v.push_back(1);<br /> v.push_back(2);<br /> v.push_back(3);<br /> v.push_back(4);<br /> v.push_back(5);<br /> cout&lt;&lt;v.max_size();<br />}<br />利用VC6.0的内存调试<br /> v.push_back(0);之后<br />//_First迭代器00481B40<br />//_Last迭代器00481B44<br />//_End迭代器004B1B44<br /> v.push_back(1);之后<br />//_First迭代器00481B00<br />//_Last迭代器00481B08<br />//_End迭代器004B1B08<br /><font style="BACKGROUND-COLOR: #800080" color="#ffffff">为什么在执行一次push_back之后,迭代器全部会变呢?</font><br />下面我们看看P.J. Plauger的代码<br /> void insert(iterator _P, size_type _M, const _Ty&amp; _X)<br />  {if (_End - _Last &lt; _M)<br />   {size_type _N = size() + (_M &lt; size() ? size() : _M);<br />   iterator _S = allocator.allocate(_N, (void *)0);<br />   iterator _Q = _Ucopy(_First, _P, _S);<br />   _Ufill(_Q, _M, _X);<br />   _Ucopy(_P, _Last, _Q + _M);<br />   _Destroy(_First, _Last);<br />   allocator.deallocate(_First, _End - _First);<br />   _End = _S + _N;<br />   _Last = _S + size() + _M;<br />   _First = _S; }<br />  else if (_Last - _P &lt; _M)<br />   {_Ucopy(_P, _Last, _P + _M);<br />   _Ufill(_Last, _M - (_Last - _P), _X);<br />   fill(_P, _Last, _X);<br />   _Last += _M; }<br />  else if (0 &lt; _M)<br />   {_Ucopy(_Last - _M, _Last, _Last);<br />   copy_backward(_P, _Last - _M, _Last);<br />   fill(_P, _P + _M, _X);<br />   _Last += _M; }}<br /><br />其中M = 1;<br />当_End - _Last &lt; _M时,就要重新分配内存了,哦原来时这样的.<br /><font color="#ff1493">[个人认为,在方便调试的时候,可以把C:\MSDEV\VC98\Include\下面的vector文件中的protected改成public:]</font><br />下面我给出在5次插入之后其内存分配<br />push_back(2)<br />//00481AC0<br />//00481ACC<br />//00481AD0<br />push_back(3);<br />//00481AC0<br />//00481AD0<br />//00481AD0<br />push_back(4);<br />//00481B20<br />//00481B34<br />//00481B40<br />push_back(5);<br />//00481B20<br />//00481B38<br />//00481B40<br />注意没有,_Last - _First之后的明显是size() * 4<br />[注:在VC6.0的STL版本是采用的PJSTL版本,是一种公认最垃圾的STL版本<br />在C++ Builder中的STL版本是采用的RW版本,Rouge Wave公司<br />在unix下面GCC采用的是SGI Silicon Graphics Computer System Inc公司STL版本,我认为在可读性,可移植性方面最好的一个版本]<br /></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/17231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2007-01-04 14:26 <a href="http://www.cppblog.com/mumutou/archive/2007/01/04/17231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 C++标准库5(原创)－－STL</title><link>http://www.cppblog.com/mumutou/archive/2007/01/04/17207.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Thu, 04 Jan 2007 02:48:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2007/01/04/17207.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/17207.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2007/01/04/17207.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/17207.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/17207.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: STL						是个部件库						(component library)						，其中的部件包括有容器						(container						，储存任意类型对象的对象						)						和算法。只要用户对自己定义的部件做点小小的要求，						STL						中的算法就可以工作在用户自定义的容器上，或者						STL				...&nbsp;&nbsp;<a href='http://www.cppblog.com/mumutou/archive/2007/01/04/17207.html'>阅读全文</a><img src ="http://www.cppblog.com/mumutou/aggbug/17207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2007-01-04 10:48 <a href="http://www.cppblog.com/mumutou/archive/2007/01/04/17207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 C++标准库4(原创)－－模版方法</title><link>http://www.cppblog.com/mumutou/archive/2006/12/29/16984.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Fri, 29 Dec 2006 07:12:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/29/16984.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16984.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/29/16984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16984.html</trackback:ping><description><![CDATA[
		<font size="6">
				<strong>模版方法<br /></strong>
		</font>在3中我已经说过了，C++标准库是基于模版技术构建的，complex是模版，string是模版，vector是模版，就连I/O也是模版。<br />在C++标准库中模版共分为2中，一种是类模板，还有一种是函数模版<br />模版的一般定义方式<br />template &lt;类型型参表&gt; 返回类型 类名 &lt;类型名表&gt;::成员函数1(型参表)<br />{<br />   成员函数1定义体<br />}<br />模版函数的一般定义方式<br />template &lt;类型型参表&gt;返回类型 函数名(型参表)<br />{<br />   函数定义体<br />}<br />有一句话说的比较好，一个类模版描述的是一个无限的类的集合，而程序员所看到的是这些类中的最普遍的地方。那么，C++也支持无限集合函数的概念了。<br />下面是一个模版函数的定义实例：<br />Example Code:<br />template &lt;class T&gt;<br />T max(T a1,T a2,T a3)<br />{<br />   T temp;<br />   if((a1 &gt; a2) &amp;&amp; (a1 &gt;a3)) {temp = a1;}<br />   else if((a2 &gt; a1) &amp;&amp; (a2 &gt; a3)){temp = a2;}<br />   else   {temp = a3};<br />   return a3;<br />}<br />就可以使用max(100,200,300);<br />类模版的一般定义方式<br />template &lt;class T&gt;<br />class A:<br />{<br />   T* x;<br />   int size;<br />public:<br />   T&amp; operator[](int);<br />};<br />就可以使用A&lt;int&gt; a;定义了<br /><img src ="http://www.cppblog.com/mumutou/aggbug/16984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-29 15:12 <a href="http://www.cppblog.com/mumutou/archive/2006/12/29/16984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 随笔 之 C++标准库3(原创)－－C++标准库简介</title><link>http://www.cppblog.com/mumutou/archive/2006/12/29/16980.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Fri, 29 Dec 2006 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/29/16980.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16980.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/29/16980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16980.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16980.html</trackback:ping><description><![CDATA[
		<font size="6">
				<strong>C++标准库简介</strong>
		</font>
		<br />
		<font face="Courier New" size="2">首先为了考虑通用性，如果用一种新的标准导致原有的代码不能用，那将是一件得不偿失的事情。<br />所以为了减轻我们的负担，是程序员的开发变得简单，标准委员会决定为包装了std的那部分标准库构建新的文件名，生成新的头文件名的方法就是<br />对于C++头文件名,去掉头文件名后的.h<br />&lt;iostream.h&gt;---&lt;iostream&gt;<br />&lt;complex.h&gt; ----&lt;complex&gt;<br />对于C头文件名，在每个名字前面加上c<br />&lt;string.h&gt;-----&lt;cstring&gt;<br />&lt;stdlib.h&gt; ------&lt;cstdlib&gt;<br />原有C++头文件的未来:<br />1.C++头文件名如&lt;iostream.h&gt;将会继续被使用，尽管它们不在提倡范围之内，但是这些头文件的内容不命名空间std中。<br />2.新的C++头文件如&lt;iostream&gt;所包含的基本功能和对应的就C++头文件相同，但是它们的内容却在命名空间std中。<br />3.就的C头文件如&lt;string.h&gt;继续使用，但是这些头文件的内容不在std中。<br />4.具有C头文件功能的新C++头文件&lt;cstring&gt;实现和原有C头文件相同的功能，但是内容在std中。<br />整个融合后新C++标准库有以下组件：<br />1.标准C库...&lt;cstring&gt;,&lt;cstdlib&gt;等等<br />2.I/O流技术，和传统的I/O流技术相比，它已经模版化了<br />3.string对象。这里我要着重讲一下<br />在原有的C头文件&lt;string.h&gt;，是基于char*的字符串处理函数，<br />而在std命名空间中，或者说新的C++标准库中，或者说&lt;string&gt;中，</font>
		<font size="2">
				<font face="Courier New">
						<font color="#ff1493">
								<strong>或者说&lt;cstring&gt;[说法错误，为什么错误？呵呵，想想就明白了,它是C头文件的std] <br /></strong>
						</font>它是一个类，一个string类，一个基于basic_string&lt;char&gt;的类<br />typedef base_string &lt;char&gt; string<br />4.容器，标准库提供了vector,list,deque,queue,stack,map,set,multimap等等<br />5.算法，算法将容器的内容当作序列。<br />6.所有的库中一切几乎都是模版，I/O是模板，string是模版，vector是模板，complex是模版。<br /></font>
		</font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-29 14:54 <a href="http://www.cppblog.com/mumutou/archive/2006/12/29/16980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 C++标准库2(原创)－－C++编译器支持</title><link>http://www.cppblog.com/mumutou/archive/2006/12/29/16977.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Fri, 29 Dec 2006 06:24:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/29/16977.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16977.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/29/16977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16977.html</trackback:ping><description><![CDATA[
		<font color="#000000" size="6">
				<strong>C++编译器支持</strong>
		</font>
		<br />
		<font face="Courier New" size="2">以下我所说的C++标准库是指新的C++标准库<br />支持C++标准库的编译器：<br />Borland C++,version 5.5(DOS/Windows)及其以上版本<br />SGI C++,version 7.3.1m及其以上版本<br />GNU C++,version 2.95.2及其以上版本<br />Microsoft Visual C++ Compiler,Version6.0及其以上版本。<br />由于目前Microsoft Visual C++ Compiler不能完全支持C++标准库，所以本人觉得不提倡采用Visual C++ 6.0 IDE进行C++标准库编程。<br /></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-29 14:24 <a href="http://www.cppblog.com/mumutou/archive/2006/12/29/16977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之  C++标准库1(原创)－－标准库的历史</title><link>http://www.cppblog.com/mumutou/archive/2006/12/29/16976.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Fri, 29 Dec 2006 06:20:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/29/16976.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16976.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/29/16976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16976.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16976.html</trackback:ping><description><![CDATA[
		<p align="left">
				<font size="6">
						<strong>C++标准库的分类</strong>
				</font>
				<br />
				<font face="Courier New" size="2">首先，C++标准库有两种，一种是老的，一种是新的<br />老的C++标准大概在80年代末，90年代初定型的。<br />对于我们现在所写的一些程序依旧在使用老的C++ 标准库，<br />例如<br />#include &lt;iostream.h&gt;<br />#include &lt;string.h&gt;这是老的C++标准库<br /><br />#include &lt;cstring&gt;这是新的C++标准库<br />大概在1998年的时候成立的这个一个标准，后来是大概在2001年加入STL 模版标准，在C++标准的草案中接纳STL为C++标准的一部分。也就是说STL只是C++标准库中的一部分。<br />现在我们一般的编译器都支持STL模版标准，[因为这个本身也是C++标准一部分]<br />然后VC6.0中的MFC是一个另类，这是microsoft公司为了打造它的IDE，不惜使用了一些和C++标准库想违背的东西，但是没有没有办法，谁让人家是老大那？<br />Visual C++编译器只是部分支持老的C++标准库和新的 C++标准库。<br /><br /></font>
		</p>
<img src ="http://www.cppblog.com/mumutou/aggbug/16976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-29 14:20 <a href="http://www.cppblog.com/mumutou/archive/2006/12/29/16976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++ 随笔 之 常用工具(转载)</title><link>http://www.cppblog.com/mumutou/archive/2006/12/28/16939.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Thu, 28 Dec 2006 06:02:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/28/16939.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16939.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/28/16939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16939.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16939.html</trackback:ping><description><![CDATA[
		<div class="storycontent">
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td valign="top" align="left" width="100%">
												<div class="diaryTitleBg">
														<font face="Courier New" size="2">给c++程序员的一份礼物——常用工具集  </font>
												</div>
										</td>
								</tr>
								<tr>
										<td valign="top" align="left" width="100%">
												<div class="diarybody">
														<div>
																<font face="Courier New" color="#0000ff" size="2">原文出处：http://morningspace.51.net/</font>
																<a href="http://blog.csdn.net/freexploit/archive/2005/01/26/269527.aspx">
																		<font color="#333399">
																		</font>
																</a>
														</div>
														<div>
																<p>
																		<font face="Courier New">
																				<font size="2">
																						<font color="#0000ff"> </font>　所谓"工欲善其事，必先利其器"，从程序员的角度来讲，好工具的使用总会给人带来事半功倍的效果。面对众多工具/软件，我们应该如何取舍呢。前不久，笔者在csdn的c++论坛发了一篇</font>
																		</font>
																		<a href="http://expert.csdn.net/Expert/TopicView1.asp?id=1839543">
																				<font face="Courier New" color="#333399" size="2">贴文</font>
																		</a>
																		<font face="Courier New" size="2">，以期能征求大家的广泛意见，得到了不错的反响。本文在对该贴进行整理的基础上，又做了一些补充。在这里要特别感谢网友：DanielWYO(爱上小白)，redleaves(无心红叶)。 </font>
																</p>
														</div>
														<br />
														<p>
																<font face="Courier New" size="2">有以下几点需要声明： </font>
														</p>
														<ol>
																<li>
																		<font face="Courier New" size="2">本文主要是针对c++程序员的，但一些综合类的通用型工具/软件，作为c++程序员而言也是不可或缺的，因此也被列入其中。同样，这些工具/软件，对其他语言的程序员，也是适用的。 　　　　 </font>
																</li>
																<li>
																		<font face="Courier New" size="2">对所列各类工具/软件的评价，其依据是多数网友的观点汇总，并结合了笔者自己的个人观点，供参考，如有不实之处，欢迎指正。 　　　　 </font>
																</li>
																<li>
																		<font face="Courier New" size="2">对所列各类工具/软件的排名不分先后，其中既有Open source软件，也有商业产品。对于前者，我将提供下载地址，对于后者，我将尽量提供相关信息的参考网址。 　　　　 </font>
																</li>
																<li>
																		<font face="Courier New" size="2">这份清单并非static的，所列工具/软件也远非保罗万象，如果你有好的建议和想法，也可以提供。如有必要，我会对该清单作定期更新^_^ </font>
																</li>
														</ol>
														<p>
																<font face="Courier New" size="2">
																</font>
														</p>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">开发环境</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">Turbo c</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">DOS时代c语言开发的经典工具，目前适合两类人使用：c语言beginner（尤其是学生一族），具有怀旧情节的专业人士：）</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Visual C++ 6.0/7.0</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">稳定而强大的IDE开发环境，具有丰富的调试功能，定制宏的功能也是其一大特色。Microsoft的经典之作，功能强大自不必言说。附带的一些工具也很不错，比如：Spy++。但编译器较之同类，支持c++标准的程度不够好，尤其6.0及以前的版本。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">BCB</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">Borland的C++ Builder是可以与VC匹敌的另一个功能强大的IDE，速度和稳定性稍逊，但对c++标准支持的程度较好。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Cygwin</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">Windows平台下的C++编译器，基于gcc，又完全兼容Window特有的东西，比如对winsock的支持。从http://www.cygwin.com可以找到有关Cygwin的详细信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Dev-c++</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">Windows平台下，一个类似VC、BCB的c++ IDE开发环境，属于共享软件。界面亲切优雅，size也不大，其4.9.x版有中文语言支持，无需汉化。编译器基于gcc，完全支持STL。但是对于规模较大的软件项目，恐怕难以胜任。可以从:http://www.bloodshed.net/dev/devcpp.html找到有关Dev-c++的有关信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Source Insight</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">有着和Dev c++一样漂亮的界面，提供代码的编辑和察看功能，具有丰富的语法加亮功能，可以像VC一样自动弹出成员函数的提示，并具有快速方便的函数跳转功能（但是跳转速度似乎有点慢）。只是默认设置不适合时，需要仔细的调整和修改。无法查找经typedef之后的名字。</font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">辅助</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">Visual Assist</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">VC IDE环境下的辅助编程工具，能识别各种关键字、函数、成员变量，自动给出tip，并自动更正大小写错误，标示拼写错误等。是VC开发的良好伴侣。 </font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Understand for C++</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">一款c/c++IDE编程的辅助工具，支持反向工程，代码导向和一些统计功能，从http://www.scitools.com可以找到有关Understand for C++的详细信息。 </font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">程序编辑器</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">EditPlus</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">一款很不错的文本编辑软件，功能强大却又十分轻巧。支持不同语言的语法加亮，还有Project组织功能，具有丰富的自定义功能。通过设置User Tool，可以和其他语言编译器结合，形成一个简单的IDE。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Ultra Edit</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">功能和EditPlus相当，通过脚本文件提供的配置功能可以定制编辑环境，但自6.0版以后一直没多大变化，就编程而言，自定义设置没有EditPlus方便。 </font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">EMACS</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">公认的世界上功能最多，最复杂的文本编辑器，其实也可以当作程序员用的编辑器。 </font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Visual Slick Edit</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">一个功能强大的程序员用编辑器。最值得一提的是其定制功能，很好用，可以和EMACS相比。自带了一套PCODE解释器，用c的语法，还可以挂接动态库。配合mingw一起使用很方便。从http://www.slickedit.com可以找到有关SlickEdit的详细信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">IQEdit</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">全功能的程序员用编辑器，界面很漂亮，从http://pwksoftware.com可以找到有关IQEdit的详细信息。</font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">UML/建模</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">Rational Rose</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">强大的建模工具，早已"家喻户晓"，功过自然不必多加评说了。从http://www.rationalsoftware.com.cn可以找到有关Rational Rose的详细信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Visual Modeler</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">MS Visual Studio 6.0所附的小工具。属于Rational和MicroSoft合作的战略产品，是Rose的简化版。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Visio</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">Microsoft的建模工具，感觉更人性化一些，但功能没有Rose多、强、专，支持正向的代码生成，以及对代码的反向工程。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Together</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">另一款功能强大的建模工具，用java编写而成，口碑不错，不过速度稍稍慢了一些。从http://www.togethersoft.com可以找到有关Togather的详细信息，另外，以下网址提供了一个有关Together的教程：<br />http://www.cc.puv.fi/~tka/kurssit/Tietojarjestelmien_suunnittelu/together/TCCGuide6</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Visual UML</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">支持多种语言类型，比如：VC、VB、DELPHI、CORBA IDL等，可以直接从UML设计图生成代码，简单易用，完全适合Personal use，界面也很清爽。从http://www.visualObject.com可以找到有关Visual UML的详细信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">SmartDraw</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">通用图表制作软件，可以用来制作组织机构图、流程图、统计图表等。随带有图库，基本满足制作各类图表的需要。从http://www.smartdraw.com可以找到有关SmartDraw的详细信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">PlayCase</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">国产面向对象的建模软件，兼容UML和IDEF，轻量级软件，只是界面看起来有点简朴，乃是高展先生用Delphi完成的。</font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">版本控制</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">ClearCase</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">Rational的版本控制管理软件，功能强大，可以控制多种类型的文档，甚至包括Word、Excel、PowerPoint文档。但使用复杂，不易上手，且不是免费软件。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">CVS</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">为基于Web的分布式协同开发提供了版本控制管理手段，且是免费软件，可以通过脚本定制功能。但在权限控制方面功能相对较弱。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">VSS</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">微软的版本控制管理工具，功能相对简单，适合于小型团队开发，将其整合到微软的其他开发工具中，使用起来十分方便。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">SourceOffSite</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">微软为开发人员提供的远程访问VSS数据库的工具，使数据库得以远程更新，以支持远程办公。</font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<font face="Courier New" size="2">其他的版本管理工具还包括：PVCS、VCS、RCS等。 </font>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">XML</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">expat</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">用于读取和处理XML文档的c函数库，最初是James Clark的个人作品，简单轻巧，且速度快。但支持的编码方式有限，最遗憾的是不支持中文。从http://expat.sourceforge.net可以找到有关expat的详细信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">xml4c</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">IBM的XML Parser，用c++语言写就，功能超级强大。号称支持多达100种字符编码，能够支持中文，适合于大规模的xml应用。若只是很小范围的应用，则非最佳选择，毕竟，你需要"背负"约12M左右的dll的沉重负担。从http://www.alphaworks.ibm.com/tech/xml4c可以找到有关xml4c的详细信息。 </font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Xerces c++</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">Apache的XML项目，同样是c++实现，来源于IBM的xml4c，因此编程接口也是和xml4c一致的。但是目前只支持少数的字符编码，如ASCII，UTF-8，UTF-16等，不能处理包含中文字符的XML文档。从http://xml.apache.org/xerces-c可以找到有关Xerces c++的详细信息。</font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">测试</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">CppUnit</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">一个c++的单元测试框架，可以通过派生测试类的方式，定制具体的测试方案。xUnit家族的一员，从JUnit移植而来，JUnit是Java语言的单元测试框架。从http://cppuint.sourceforge.net可以找到有关CppUint的详细信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Rational ROBOT</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">Rational的自动化测试工具，通过编写脚本的方式提供自动化测试特性。其GUI方式的脚本录制功能，有助于对GUI软件进行功能测试；其VU方式的脚本录制功能，有助于测试某些软件的数据通讯功能。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Rational Purify</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">同样是Rational的自动化测试工具，不需要被测程序的源代码，可以用来检查内存访问错误、Windows API调用错误等，以完成软件的可靠性测试，属于白盒测试。</font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
														<font face="Courier New" size="2">其他的Rational测试工具还包括：TestFactory、PureCoverage、TestManager等。 </font>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">日志</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">log4cpp</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">一个用于日志记录的c++函数库，可以将内容以定制的方式记录到不同的目的地，比如：文件、控制台、syslog等，同时还可以通过控制记录级别来屏蔽掉某些无关记录。从http://log4cpp.sourceforge.net可以找到有关log4cpp的详细信息。</font>
																				</td>
																		</tr>
																</tbody>
														</table>
														<p style="PADDING-RIGHT: 5pt; PADDING-LEFT: 5pt; PADDING-BOTTOM: 5pt; FONT: bold 14px/13pt courier new, courier, mono; WIDTH: 100%; COLOR: #003399; PADDING-TOP: 5pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #f5f0f0">
																<font size="2">注释</font>
														</p>
														<p>
														</p>
														<table border="1">
																<tbody>
																		<tr>
																				<td width="15%">
																						<font face="Courier New" size="2">Doc++</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">注释文档生成工具，根据源程序中的文档注释，可以输出TeX和HTML格式的文档。除了支持c/c++语言外，还支持IDL和java。仅提供命令行使用方式。从http://docpp.sourceforge.net可以找到有关Doc++的详细信息。</font>
																				</td>
																		</tr>
																		<tr>
																				<td>
																						<font face="Courier New" size="2">Doxygen</font>
																				</td>
																				<td>
																						<font face="Courier New" size="2">注释文档生成工具，较之Doc++功能更为齐全，可以生成包括HTML、PDF、RTF在内的多种格式的文档，并有GUI界面，除了支持c/c++语言外，还支持IDL、java、PHP、c#等。从</font>
																						<a href="http://www.stack.nl/~dimitri/doxygen">
																								<font face="Courier New" color="#333399" size="2">http://www.stack.nl/~dimitri/doxygen</font>
																						</a>
																						<font face="Courier New" size="2">可以找到有关Doxygen的详细信息。</font>
																				</td>
																		</tr>
																</tbody>
														</table>
												</div>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
		</div>
<img src ="http://www.cppblog.com/mumutou/aggbug/16939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-28 14:02 <a href="http://www.cppblog.com/mumutou/archive/2006/12/28/16939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++随笔  之 头文件一览 (转载)</title><link>http://www.cppblog.com/mumutou/archive/2006/12/28/16937.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Thu, 28 Dec 2006 05:50:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/28/16937.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16937.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/28/16937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16937.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16937.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">C</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">、传统<span lang="EN-US"> C++</span></span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;assert.h&gt;//</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">设定插入点</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;ctype.h&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">字符处理</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;errno.h&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">定义错误码</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;float.h&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">浮点数处理</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;fstream.h&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //</span>文件输入／输出</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;iomanip.h&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //</span>参数化输入／输出</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;iostream.h&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//</span>数据流输入／输出</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;limits.h&gt;//</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">定义各种数据类型最值常量</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;locale.h&gt;//</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">定义本地化函数</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;math.h&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//</span>定义数学函数</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;stdio.h&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">定义输入／输出函数</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;stdlib.h&gt;//</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">定义杂项函数及内存分配函数</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;string.h&gt;//</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">字符串处理</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;strstrea.h&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//</span>基于数组的输入／输出</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;time.h&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//</span>定义关于时间的函数</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;wchar.h&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">宽字符处理及输入／输出</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;wctype.h&gt;//</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">宽字符分类</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">//////////////////////////////////////////////////////////////////////////</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">标准<span lang="EN-US"> C++</span>　（同上的不再注释）</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;algorithm&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //STL </span>通用算法</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;bitset&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//STL </span>位集容器</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;cctype&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;cerrno&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;clocale&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;cmath&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;complex&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">复数类</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;cstdio&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;cstdlib&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;cstring&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;ctime&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;deque&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //STL </span>双端队列容器</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;exception&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //</span>异常处理类</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;fstream&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;functional&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//STL </span>定义运算函数（代替运算符）</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;limits&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;list&gt;//STL </span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">线性列表容器</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;map&gt; //STL </span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">映射容器</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;iomanip&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;ios&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">基本输入／输出支持</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;iosfwd&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//</span>输入／输出系统使用的前置声明</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;iostream&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;istream&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">基本输入流</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;ostream&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">基本输出流</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;queue&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //STL </span>队列容器</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;set&gt; //STL </span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">集合容器</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;sstream&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">基于字符串的流</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;stack&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //STL </span>堆栈容器</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;stdexcept&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //</span>标准异常类</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;streambuf&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US"> //</span>底层输入／输出支持</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;string&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//</span>字符串类</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;utility&gt; //STL </span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">通用模板类</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;vector&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//STL </span>动态数组容器</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;cwchar&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;cwctype&gt;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">using namespace std;</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">//////////////////////////////////////////////////////////////////////////</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">C99 </span>
						<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">增加</span>
						<font size="2">
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;complex.h&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">复数处理</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;fenv.h&gt;//</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">浮点环境</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;inttypes.h&gt;//</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">整数格式转换</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;stdbool.h&gt; //</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">布尔环境</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;stdint.h&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//</span>整型环境</span>
						</font>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<br />
						<br />
				</span>
				<font face="Courier New">
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">#include &lt;tgmath.h&gt;</span>
						<font size="2">
								<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　<span lang="EN-US">//</span>通用类型数学宏</span>
						</font>
				</font>
		</p>
<img src ="http://www.cppblog.com/mumutou/aggbug/16937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-28 13:50 <a href="http://www.cppblog.com/mumutou/archive/2006/12/28/16937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++随笔 之malloc/free 和new/delete区别</title><link>http://www.cppblog.com/mumutou/archive/2006/12/28/16927.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Thu, 28 Dec 2006 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/28/16927.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16927.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/28/16927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16927.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">malloc/free ,new/delete<br />相信大家对上面两个命令都不默认<br />大家这两个命令其实是又区别的<br />首先<br />1.malloc 与free 是C++/C 语言的标准库函数，new/delete 是C++的运算符<br />2.不能够把执行构造函数和析构函数的任务强加于malloc/free<br />3.两者都可以使用异常出错函数,不过个人觉得malloc/free对于异常出错处理更加方便<br />malloc/free这个命令只是对内存操作,纯内存操作函数<br />而new/delete命令会执行构造函数和析构函数<br />所以我的意见是:<br />对于非系统内部数据的话,尽量使用new/delete<br />当然如果是自己新建类的话,也使用new/delete,不然怎么调用构造函数和析构函数那?<br />对于系统内部函数的话,使用malloc/free<br />int *p = (int*)malloc(sizeof(int)*num);<br />class A<br />{<br />   A();<br />   ~A();<br />};<br /><br />A *a = new A;<br />new也有一个好处,可以处理不同的构造函数<br />Example Code:<br />class A<br />{<br />   A();<br />   ~A();<br />}<br />A *a = new A;<br />在类声明种加入<br />A(int x,int y);<br />就可以使用<br />A *a = new A(1,2);<br /><br /></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-28 10:36 <a href="http://www.cppblog.com/mumutou/archive/2006/12/28/16927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 指针分析</title><link>http://www.cppblog.com/mumutou/archive/2006/12/28/16926.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Thu, 28 Dec 2006 02:22:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/28/16926.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16926.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/28/16926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16926.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16926.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">在C++里面,指针是一种比较麻烦的操作,但是我们又不得不用.因为他给我们编程以很大的灵活性<br />下面我讲以下指针作为函数参数时的问题<br />在函数参数中,编译器总是要为函数的每个参数制作临时副本，指针<br />参数p 的副本是 _p，编译器使 _p = p 。如果函数体内的程序修改了_p 的内容，就导致<br />参数p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中，_p 申请<br />了新的内存，只是把_p 所指的内存地址改变了，但是p 丝毫未变。<br />以上是林锐博士在高质量C++编程中的描述<br />下面我们结合描述给出调试CODE<br /> Example Code:<br />void GetMemory(char *p,int num)<br />{<br /> p = (char*)malloc(sizeof(char)*num);<br />// return<br />}</font>
		</p>
		<p>
				<font face="Courier New" size="2">void main()<br />{<br /> char *str = NULL;<br /> GetMemory(str,100);<br /> strcpy(str,"Hello World");//出错<br />}<br />首先我们先看看asm<br />004010B8   mov         dword ptr [ebp-4],0<br />004010BF   push        64h<br />004010C1   mov         eax,dword ptr [ebp-4]<br />004010C4   push        eax<br />004010C5   call        @ILT+50(GetMemory) (00401037)<br />str 地址:12FF7C<br />其副本地址:12FF28<br />在存入参数的时候,同时都指向00 00 00 00<br />在执行p = (char*)malloc(sizeof(char)*num);之后<br />12FF28指向的内容变成了20 1C 43 00了.<br />林锐博士在这边的意思是只用指向指针的指针,这种方法我们在第二种方法种介绍,<br />下面给出我的一种看法,大家觉得好不好<br />我的方法:<br />char *GetMemory(char *p,int num)<br />{<br /> p = (char*)malloc(sizeof(char)*num);<br /> return p;<br />}</font>
		</p>
		<p>
				<font face="Courier New" size="2">void main()<br />{<br /> char *str = NULL;<br /> str = GetMemory(str,100);<br /> strcpy(str,"Hello World");<br /> cout&lt;&lt;str&lt;&lt;endl;<br />}<br />可以简化为:<br />char *GetMemory(int num)<br />{<br /> char *p = (char*)malloc(sizeof(char)*num);<br /> return p;<br />}<font size="3"></font></font>
		</p>
		<p>
				<font face="Courier New" size="2">void main()<br />{<br /> char *str = NULL;<br /> str = GetMemory(100);<br /> strcpy(str,"Hello World");<br /> cout&lt;&lt;str&lt;&lt;endl;<br />}</font>
				<br />林锐博士的看法:<br />void GetMemory(char **p,int num)<br />{<br />   *p = (char*)malloc(sizeof(char)*num);<br />}<br />void main()<br />{<br />   char *str = NULL;<br />   GetMemory(&amp;str,100);<br />   strcpy(str,"Hello,World");<br />   cout &lt;&lt;str&lt;&lt;endl;<br />}<br /><br /><br /><br /></p>
<img src ="http://www.cppblog.com/mumutou/aggbug/16926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-28 10:22 <a href="http://www.cppblog.com/mumutou/archive/2006/12/28/16926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 随笔 之 库--转(收藏) </title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16843.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16843.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16843.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16843.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16843.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<font face="Courier New" size="2">在C++中，库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过</font>
		</div>
		<p>
				<font face="Courier New" size="2">设计更多的语法的言论。现实中，C++的库门类繁多，解决的问题也是极其广泛，库从轻量级到重量级</font>
		</p>
		<p>
				<font face="Courier New" size="2">的都有。不少都是让人眼界大开，亦或是望而生叹的思维杰作。由于库的数量非常庞大，而且限于笔者</font>
		</p>
		<p>
				<font face="Courier New" size="2">水平，其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。</font>
		</p>
		<p>
				<font face="Courier New" size="2">标准库</font>
		</p>
		<p>
				<font face="Courier New" size="2">标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年，直到标准的出台才正</font>
		</p>
		<p>
				<font face="Courier New" size="2">式定型，但是在标准库的实现上却很令人欣慰得看到多种实现，并且已被实践证明为有工业级别强度的</font>
		</p>
		<p>
				<font face="Courier New" size="2">佳作。</font>
		</p>
		<p>
				<font face="Courier New" size="2">1、   Dinkumware C++ Library</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考站点：</font>
				<a href="http://www.dinkumware.com/">
						<font face="Courier New" size="2">http://www.dinkumware.com</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编</font>
		</p>
		<p>
				<font face="Courier New" size="2">写的库长期被Microsoft采用，并且最近Borland也取得了其OEM的license，在其C/C++的产品中采用</font>
		</p>
		<p>
				<font face="Courier New" size="2">Dinkumware的库。</font>
		</p>
		<p>
				<font face="Courier New" size="2">2、   RogueWave Standard C++ Library</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考站点：</font>
				<a href="http://www.roguewave.com/" courier="" new?="" size="2">http://www.roguewave.com/</a>
				<font face="Courier New" size="2">
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">这个库在Borland C++ Builder的早期版本中曾经被采用，后来被其他的库给替换了。笔者不推荐</font>
				<font face="Courier New" size="2">。</font>
		</p>
		<p>
				<font face="Courier New" size="2">3、SGI STL</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考站点：</font>
				<a href="http://www.roguewave.com/" courier="" new?="" size="2">http://www.roguewave.com/</a>
				<font face="Courier New" size="2">
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">SGI公司的C++标准模版库。</font>
		</p>
		<p>
				<font face="Courier New" size="2">4、STLport</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考站点：</font>
				<a href="http://www.stlport.org/">
						<font face="Courier New" size="2">http://www.stlport.org</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">SGI STL库的跨平台可移植版本。</font>
		</p>
		<p>
				<font face="Courier New" size="2">准标准库——Boost</font>
		</p>
		<p>
				<font face="Courier New" size="2">Boost库是一个经过千锤百炼、可移植、提供源代码的C++库，作为标准库的后备，是C++标准化进程的</font>
		</p>
		<p>
				<font face="Courier New" size="2">发动机之一。 Boost库由C++标准委员会库工作组成员发起，在C++社区中影响甚大，其成员已近2000人</font>
		</p>
		<p>
				<font face="Courier New" size="2">。 Boost库为我们带来了最新、最酷、最实用的技术，是不折不扣的“准”标准库。</font>
		</p>
		<p>
				<font face="Courier New" size="2">Boost中比较有名气的有这么几个库：</font>
		</p>
		<p>
				<font face="Courier New" size="2">Regex<br />正则表达式库</font>
		</p>
		<p>
				<font face="Courier New" size="2">Spirit<br />LL parser framework，用C++代码直接表达EBNF</font>
		</p>
		<p>
				<font face="Courier New" size="2">Graph<br />图组件和算法</font>
		</p>
		<p>
				<font face="Courier New" size="2">Lambda<br />在调用的地方定义短小匿名的函数对象，很实用的functional功能</font>
		</p>
		<p>
				<font face="Courier New" size="2">concept check<br />检查泛型编程中的concept</font>
		</p>
		<p>
				<font face="Courier New" size="2">Mpl<br />用模板实现的元编程框架</font>
		</p>
		<p>
				<font face="Courier New" size="2">Thread<br />可移植的C++多线程库</font>
		</p>
		<p>
				<font face="Courier New" size="2">Python<br />把C++类和函数映射到Python之中</font>
		</p>
		<p>
				<font face="Courier New" size="2">Pool<br />内存池管理</font>
		</p>
		<p>
				<font face="Courier New" size="2">smart_ptr<br />5个智能指针，学习智能指针必读，一份不错的参考是来自CUJ的文章：</font>
		</p>
		<p>
				<font face="Courier New" size="2">Smart Pointers in Boost,哦，这篇文章可以查到，CUJ是提供在线浏览的。中文版见笔者在《Dr. </font>
		</p>
		<p>
				<font face="Courier New" size="2">Dobb's Journal软件研发杂志》第7辑上的译文。</font>
		</p>
		<p>
				<br />
				<font face="Courier New" size="2">Boost总体来说是实用价值很高，质量很高的库。并且由于其对跨平台的强调，对标准C++的强调，是编</font>
		</p>
		<p>
				<font face="Courier New" size="2">写平台无关，现代C++的开发者必备的工具。但是Boost中也有很多是实验性质的东西，在实际的开发中</font>
		</p>
		<p>
				<font face="Courier New" size="2">实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展，其构造用尽精巧的手法，不要贸然</font>
		</p>
		<p>
				<font face="Courier New" size="2">的花费时间研读。Boost另外一面，比如Graph这样的库则是具有工业强度，结构良好，非常值得研读的</font>
		</p>
		<p>
				<font face="Courier New" size="2">精品代码，并且也可以放心的在产品代码中多多利用。</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考站点：</font>
				<a href="http://www.boost.org/">
						<font face="Courier New" size="2">http://www.boost.org</font> </a>
				<br />
				<font face="Courier New" size="2">         （国内镜像：</font>
				<a href="http://www.c-view.org/tech/lib/boost/index.htm">
						<font face="Courier New" size="2">http://www.c-view.org/tech/lib/boost/index.htm</font>
				</a>
				<font face="Courier New" size="2">）</font>
		</p>
		<p>
				<font face="Courier New" size="2">GUI</font>
		</p>
		<p>
				<font face="Courier New" size="2">在众多C++的库中，GUI部分的库算是比较繁荣，也比较引人注目的。在实际开发中，GUI库的选择也是</font>
		</p>
		<p>
				<font face="Courier New" size="2">非常重要的一件事情，下面我们综述一下可选择的GUI库，各自的特点以及相关工具的支持。</font>
		</p>
		<p>
				<font face="Courier New" size="2">1、   MFC</font>
		</p>
		<p>
				<font face="Courier New" size="2">大名鼎鼎的微软基础类库（Microsoft Foundation Class）。大凡学过VC++的人都应该知道这个库。虽</font>
		</p>
		<p>
				<font face="Courier New" size="2">然从技术角度讲，MFC是不大漂亮的，但是它构建于Windows API 之上，能够使程序员的工作更容易,编</font>
		</p>
		<p>
				<font face="Courier New" size="2">程效率高，减少了大量在建立 Windows 程序时必须编写的代码，同时它还提供了所有一般 C++ 编程的</font>
		</p>
		<p>
				<font face="Courier New" size="2">优点，例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的，例如，在 </font>
		</p>
		<p>
				<font face="Courier New" size="2">Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。但是在最近发展以及</font>
		</p>
		<p>
				<font face="Courier New" size="2">官方支持上日渐势微。</font>
		</p>
		<p>
				<font face="Courier New" size="2">2、   QT</font>    <br /><font face="Courier New" size="2">         参考网站：</font><a href="http://www.trolltech.com/"><font face="Courier New" size="2">http://www.trolltech.com/</font></a></p>
		<p>
				<font face="Courier New" size="2">Qt是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术</font>
		</p>
		<p>
				<font face="Courier New" size="2">级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展，并且允许真正地组件编程。自从</font>
		</p>
		<p>
				<font face="Courier New" size="2">1996年早些时候，Qt进入商业领域，它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流</font>
		</p>
		<p>
				<font face="Courier New" size="2">行的Linux桌面环境KDE 的基础，同时它还支持Windows、Macintosh、Unix/X11等多种平台。</font>
		</p>
		<p>
				<font face="Courier New" size="2">3、WxWindows</font>    <br /><font face="Courier New" size="2">         参考网站：</font><a href="http://www.wxwindows.org/"><font face="Courier New" size="2">http://www.wxwindows.org/</font></a></p>
		<p>
				<font face="Courier New" size="2">跨平台的GUI库。因为其类层次极像MFC，所以有文章介绍从MFC到WxWindows的代码移植以实现跨平台的</font>
		</p>
		<p>
				<font face="Courier New" size="2">功能。通过多年的开发也是一个日趋完善的GUI库，支持同样不弱于前面两个库。并且是完全开放源代</font>
		</p>
		<p>
				<font face="Courier New" size="2">码的。新近的C++ Builder X的GUI设计器就是基于这个库的。</font>
		</p>
		<p>
				<font face="Courier New" size="2">4、Fox</font>     <br /><font face="Courier New" size="2">         参考网站：</font><a href="http://www.fox-toolkit.org/"><font face="Courier New" size="2">http://www.fox-toolkit.org/</font></a></p>
		<p>
				<font face="Courier New" size="2">开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发</font>
		</p>
		<p>
				<font face="Courier New" size="2">，从而开始了对这个库的开发。有兴趣的可以尝试一下。</font>
		</p>
		<p>
				<font face="Courier New" size="2">5、WTL</font>
		</p>
		<p>
				<font face="Courier New" size="2">基于ATL的一个库。因为使用了大量ATL的轻量级手法，模板等技术，在代码尺寸，以及速度优化方面做</font>
		</p>
		<p>
				<font face="Courier New" size="2">得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。</font>
		</p>
		<p>
				<font face="Courier New" size="2">6、GTK</font>    <br /><font face="Courier New" size="2">         参考网站：</font><a href="http://gtkmm.sourceforge.net/"><font face="Courier New" size="2">http://gtkmm.sourceforge.net/</font></a></p>
		<p>
				<font face="Courier New" size="2">GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而GTK就是这个库的C++</font>
		</p>
		<p>
				<font face="Courier New" size="2">封装版本。</font>
		</p>
		<p>
				<br />
				<font face="Courier New" color="#006400" size="2">
						<strong>网络通信</strong>
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">ACE</font>       <br /><font face="Courier New" size="2">         参考网站：</font><a href="http://www.cs.wustl.edu/~schmidt/ACE.html"><font face="Courier New" size="2">http://www.cs.wustl.edu/~schmidt/ACE.html</font></a><font face="Courier New" size="2"></font></p>
		<p>
				<font face="Courier New" size="2">C++库的代表，超重量级的网络通信开发框架。ACE自适配通信环境（Adaptive Communication </font>
		</p>
		<p>
				<font face="Courier New" size="2">Environment）是可以自由使用、开放源代码的面向对象框架，在其中实现了许多用于并发通信软件的</font>
		</p>
		<p>
				<font face="Courier New" size="2">核心模式。ACE提供了一组丰富的可复用C++包装外观（Wrapper Facade）和框架组件，可跨越多种平台</font>
		</p>
		<p>
				<font face="Courier New" size="2">完成通用的通信软件任务，其中包括：事件多路分离和事件处理器分派、信号处理、服务初始化、进程</font>
		</p>
		<p>
				<font face="Courier New" size="2">间通信、共享内存管理、消息路由、分布式服务动态（重）配置、并发执行和同步，等等。</font>
		</p>
		<p>
				<font face="Courier New" size="2">StreamModule</font>    <br /><font face="Courier New" size="2">            参考网站：</font><a href="http://www.omnifarious.org/StrMod/"><font face="Courier New" size="2">http://www.omnifarious.org/StrMod/</font></a></p>
		<p>
				<font face="Courier New" size="2">设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易，而不是用同步的外壳</font>
		</p>
		<p>
				<font face="Courier New" size="2">包起异步的本质。</font>
		</p>
		<p>
				<font face="Courier New" size="2">SimpleSocket</font>       <br /><font face="Courier New" size="2">            参考网站：</font><a href="http://home.hetnet.nl/~lcbokkers/simsock.htm"><font face="Courier New" size="2">http://home.hetnet.nl/~lcbokkers/simsock.htm</font></a></p>
		<p>
				<font face="Courier New" size="2">这个类库让编写基于socket的客户/服务器程序更加容易。</font>
		</p>
		<p>
				<font face="Courier New" size="2">A Stream Socket API for C++</font>
		</p>
		<p>
				<font face="Courier New" size="2">            参考网站：</font>    <a href="http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html"><font face="Courier New" size="2">http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html</font></a><font face="Courier New" size="2"></font></p>
		<p>
				<font face="Courier New" size="2">又一个对Socket的封装库。</font>
		</p>
		<p>
				<font color="#006400">
						<strong>
								<font face="Courier New" size="2">XML</font>
						</strong>
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">Xerces</font>   <br />                     <font face="Courier New" size="2">参考网站：</font><a href="http://xml.apache.org/xerces-c/"><font face="Courier New" size="2">http://xml.apache.org/xerces-c/</font></a></p>
		<p>
				<font face="Courier New" size="2">Xerces-C++ 是一个非常健壮的XML解析器，它提供了验证，以及SAX和DOM API。XML验证在文档类型定</font>
		</p>
		<p>
				<font face="Courier New" size="2">义(Document Type Definition，DTD)方面有很好的支持，并且在2001年12月增加了支持W3C XML </font>
		</p>
		<p>
				<font face="Courier New" size="2">Schema 的基本完整的开放标准。</font>
		</p>
		<p>
				<font face="Courier New" size="2">XMLBooster</font>      <br />                     <font face="Courier New" size="2">参考网站：</font><a href="http://www.xmlbooster.com/"><font face="Courier New" size="2">http://www.xmlbooster.com/</font></a></p>
		<p>
				<font face="Courier New" size="2">这个库通过产生特制的parser的办法极大的提高了XML解析的速度，并且能够产生相应的GUI程序来修改</font>
		</p>
		<p>
				<font face="Courier New" size="2">这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。</font>
		</p>
		<p>
				<font face="Courier New" size="2">Pull Parser</font>
		</p>
		<p>
				<font face="Courier New" size="2">          参考网站：</font>
				<a href="http://www.extreme.indiana.edu/xgws/xsoap/ ">
						<font face="Courier New" size="2">http://www.extreme.indiana.edu/xgws/xsoap/</font>
				</a>
				<font face="Courier New" size="2">
				</font>
		</p>
		<p>
				<font face="Courier New" size="2"> 这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser，这个xpp把</font>
		</p>
		<p>
				<font face="Courier New" size="2">这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。</font>
		</p>
		<p>
				<font face="Courier New" size="2">Xalan</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://xml.apache.org/xalan-c/">
						<font face="Courier New" size="2">http://xml.apache.org/xalan-c/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">         Xalan是一个用于把XML文档转换为HTML，纯文本或者其他XML类型文档的XSLT处理器。</font>
		</p>
		<p>
				<font face="Courier New" size="2">CMarkup</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://www.firstobject.com/xml.htm">
						<font face="Courier New" size="2">http://www.firstobject.com/xml.htm</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">         这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在DOM和SAX之外寻</font>
		</p>
		<p>
				<font face="Courier New" size="2">求一点灵感。</font>
		</p>
		<p>
				<font face="Courier New" size="2">libxml++</font>
		</p>
		<p>                  参考网站   <a href="http://libxmlplusplus.sourceforge.net/ "><font face="Courier New" size="2">http://libxmlplusplus.sourceforge.net/</font></a><font face="Courier New" size="2"></font></p>
		<p>
				<font face="Courier New" size="2">libxml++是对著名的libxml XML解析器的C++封装版本</font>
		</p>
		<p>
				<font face="Courier New" size="2">
				</font> </p>
		<p>
				<font face="Courier New" color="#006400" size="2">
						<strong>科学计算</strong>
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">Blitz++</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://www.oonumerics.org/blitz/">
						<font face="Courier New" size="2">http://www.oonumerics.org/blitz/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">Blitz++ 是一个高效率的数值计算函数库，它的设计目的是希望建立一套既具像C++ 一样方便，同时又</font>
		</p>
		<p>
				<font face="Courier New" size="2">比Fortran速度更快的数值计算环境。通常，用C++所写出的数值程序，比 Fortran慢20%左右，因此</font>
		</p>
		<p>
				<font face="Courier New" size="2">Blitz++正是要改掉这个缺点。方法是利用C++的template技术，程序执行甚至可以比Fortran更快。</font>
		</p>
		<p>
				<font face="Courier New" size="2">Blitz++目前仍在发展中，对于常见的SVD，FFTs，QMRES等常见的线性代数方法并不提供，不过使用者</font>
		</p>
		<p>
				<font face="Courier New" size="2">可以很容易地利用Blitz++所提供的函数来构建。</font>
		</p>
		<p>
				<font face="Courier New" size="2">POOMA</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://www.codesourcery.com/pooma/pooma ">
						<font face="Courier New" size="2">http://www.codesourcery.com/pooma/pooma</font>
				</a>
				<font face="Courier New" size="2">
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">POOMA是一个免费的高性能的C++库，用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程</font>
		</p>
		<p>
				<font face="Courier New" size="2">序开发，对并行机器进行了优化以达到最高的效率，方便在工业和研究环境中使用。</font>
		</p>
		<p>
				<font face="Courier New" size="2">MTL</font>      <br />                   <font face="Courier New" size="2">参考网站：</font><a href="http://www.osl.iu.edu/research/mtl/"><font face="Courier New" size="2">http://www.osl.iu.edu/research/mtl/</font></a></p>
		<p>
				<font face="Courier New" size="2">Matrix Template Library(MTL)是一个高性能的泛型组件库，提供了各种格式矩阵的大量线性代数方面</font>
		</p>
		<p>
				<font face="Courier New" size="2">的功能。在某些应用使用高性能编译器的情况下，比如Intel的编译器，从产生的汇编代码可以看出其</font>
		</p>
		<p>
				<font face="Courier New" size="2">与手写几乎没有两样的效能。</font>
		</p>
		<p>
				<font face="Courier New" size="2">CGAL</font>       <br /><font face="Courier New" size="2">         参考网站：</font><a href="http://www.cgal.org/"><font face="Courier New" size="2">www.cgal.org</font></a></p>
		<p>
				<font face="Courier New" size="2">Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和</font>
		</p>
		<p>
				<font face="Courier New" size="2">方法以C++库的形式提供给工业和学术界的用户。</font>
		</p>
		<p>
				<font face="Courier New" size="2">
				</font> </p>
		<p>
				<font face="Courier New" color="#006400" size="2">
						<strong>游戏开发</strong>
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">Audio/Video 3D C++ Programming Library</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://www.galacticasoftware.com/products/av/">
						<font face="Courier New" size="2">http://www.galacticasoftware.com/products/av/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">AV3D是一个跨平台，高性能的C++库。主要的特性是提供3D图形，声效支持（SB,以及S3M），控制接口</font>
		</p>
		<p>
				<font face="Courier New" size="2">（键盘，鼠标和遥感），XMS。</font>
		</p>
		<p>
				<font face="Courier New" size="2">KlayGE</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://home.g365.net/enginedev/">
						<font face="Courier New" size="2">http://home.g365.net/enginedev/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎，并使用</font>
		</p>
		<p>
				<font face="Courier New" size="2">Python作脚本语言。KlayGE在LGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。</font>
		</p>
		<p>
				<font face="Courier New" size="2">OGRE</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://www.ogre3d.org/">
						<font face="Courier New" size="2">http://www.ogre3d.org</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">OGRE（面向对象的图形渲染引擎）是用C++开发的，使用灵活的面向对象3D引擎。它的目的是让开发者</font>
		</p>
		<p>
				<font face="Courier New" size="2">能更方便和直接地开发基于3D硬件设备的应用程序或游戏。引擎中的类库对更底层的系统库（如：</font>
		</p>
		<p>
				<font face="Courier New" size="2">Direct3D和OpenGL）的全部使用细节进行了抽象，并提供了基于现实世界对象的接口和其它类。</font>
		</p>
		<p>
				<font face="Courier New" size="2">
				</font> </p>
		<p>
				<font face="Courier New" color="#006400" size="2">
						<strong>线程</strong>
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">C++ Threads</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://threads.sourceforge.net/">
						<font face="Courier New" size="2">http://threads.sourceforge.net/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">这个库的目标是给程序员提供易于使用的类，这些类被继承以提供在Linux环境中很难看到的大量的线</font>
		</p>
		<p>
				<font face="Courier New" size="2">程方面的功能。</font>
		</p>
		<p>
				<font face="Courier New" size="2">ZThreads</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://zthread.sourceforge.net/">
						<font face="Courier New" size="2">http://zthread.sourceforge.net/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">一个先进的面向对象，跨平台的C++线程和同步库。</font>
		</p>
		<p>
				<font face="Courier New" color="#006400" size="2">
						<strong>序列化</strong>
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">s11n</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://s11n.net/">
						<font face="Courier New" size="2">http://s11n.net/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">一个基于STL的C++库，用于序列化POD，STL容器以及用户定义的类型。</font>
		</p>
		<p>
				<font face="Courier New" size="2">Simple XML Persistence Library</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://sxp.sourceforge.net/">
						<font face="Courier New" size="2">http://sxp.sourceforge.net/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">这是一个把对象序列化为XML的轻量级的C++库。</font>
		</p>
		<p>
				<font face="Courier New" size="2">
				</font> </p>
		<p>
				<font face="Courier New" color="#006400" size="2">
						<strong>字符串</strong>
				</font>
		</p>
		<p>
				<font face="Courier New" size="2">C++ Str Library</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://www.utilitycode.com/str/">
						<font face="Courier New" size="2">http://www.utilitycode.com/str/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">操作字符串和字符的库，支持Windows和支持gcc的多种平台。提供高度优化的代码，并且支持多线程环</font>
		</p>
		<p>
				<font face="Courier New" size="2">境和Unicode，同时还有正则表达式的支持。</font>
		</p>
		<p>
				<font face="Courier New" size="2">Common Text Transformation Library</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://cttl.sourceforge.net/">
						<font face="Courier New" size="2">http://cttl.sourceforge.net/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较，插入，替换以及用EBNF的语法</font>
		</p>
		<p>
				<font face="Courier New" size="2">进行解析。</font>
		</p>
		<p>
				<font face="Courier New" size="2">GRETA</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://research.microsoft.com/projects/greta/">
						<font face="Courier New" size="2">http://research.microsoft.com/projects/greta/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。</font>
		</p>
		<p>
				<font face="Courier New" size="2">综合</font>
		</p>
		<p>
				<font face="Courier New" size="2">P::Classes</font>
		</p>
		<p>
				<font face="Courier New" size="2">         参考网站：</font>
				<a href="http://pclasses.com/">
						<font face="Courier New" size="2">http://pclasses.com/</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制，i/o系统包括基于</font>
		</p>
		<p>
				<font face="Courier New" size="2">插件的网络协议透明的i/o架构，基于插件的应用程序消息日志框架，访问sql数据库的类等等。</font>
		</p>
		<p>
				<font face="Courier New" size="2">ACDK - Artefaktur Component Development Kit</font>
		</p>
<img src ="http://www.cppblog.com/mumutou/aggbug/16843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 16:06 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 C++多态性分析</title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16842.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16842.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16842.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16842.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16842.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">原文出处</font>
		<a href="http://community.csdn.net/Expert/topic/5240/5240218.xml?temp=.6121942">
				<br />
				<font face="Courier New" size="2">http://community.csdn.net/Expert/topic/5240/5240218.xml?temp=.6121942</font>
		</a>
		<br />
		<br />
		<font face="Courier New" size="2">C++多态性是基于抽象类来实现的,什么叫抽象类?<br />抽象类就是不能被实例化的类,主要是因为类中包含一个纯虚函数<br />例如:<br />virtual   void   draw() = 0;<br />抽象类不能实例化,但是其派生类可以<br />派生类重写draw()函数之后就可以实例化对象了,那么n个派生类可以有n种不同的draw()函数<br />举一个例子:<br />例如:                           人[  男人        女人]<br />人可以[劳动]吧,那么我们就把[劳动]这个函数定义为纯虚函数,<br />那么在定义[男人]的时候,我们就可以重写[劳动]函数,让他进行耕地操作<br />在定义[女人]的时候,我们就可以重写[劳动]函数,让她进行织布操作<br />那么在人劳动的时候,具体到男人,那就是耕地,具体到女人,那就是织布<br /><br />以上就是一个最简单的解释<br />那么我们如果出现这个问题,人还分为老年人,中年人,小孩子<br />那么我们在继承人这个类的时候,把老年人,中年人,小孩子,不能重写它的劳动函数,也就是劳动函数还是一个纯虚函数,下面我给出一个图<br /><img src="file:///C:/Documents%20and%20Settings/Administrator/桌面/class.bmp" /><br />[比喻不是很确却,抱歉]<br />下面我给例子:<br />Code Example<br />class Person<br />{<br />   virtual void Do() = 0;<br />};<br />class OldPerson:public Persion<br />{<br />};<br />class OldMan:public OldPerson<br />{<br />   void Do()<br />   {<br />      抽烟,聊天();<br />   }<br />};<br />class OldWoman:public OldPerson<br />{<br />   void Do()<br />   {<br />      洗衣服();<br />   }<br />}<br />class MidPerson:public Person<br />{<br />};<br />class MidMan:public MidPerson<br />{<br />   void Do()<br />   {<br />      耕地();<br />   }<br />};<br />class MidWoman:public MidPerson<br />{<br />   void   Do()<br />   {<br />      织布();<br />   }<br />};<br />......下面小孩子的我就不写了,相信聪明的你一下子就知道怎么写了<br />void   劳动(const Person &amp;person)<br />{<br />   person.Do();<br />}<br />void main()<br />{<br />      MidWoman midwomen;<br />      MidMan  midman;<br />      劳动(midwoman);<br />      劳动(midman);<br />      <br />}<br /></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 15:42 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 C++特性：单继承和多继承的含义</title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16838.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 05:59:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16838.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16838.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16838.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16838.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">原文出处：<br /></font>
		<a href="http://community.csdn.net/Expert/topic/5252/5252647.xml?temp=.1502344">
				<font face="Courier New" size="2">http://community.csdn.net/Expert/topic/5252/5252647.xml?temp=.1502344</font>
		</a>
		<br />
		<font face="Courier New" size="2">在C++中继承分为２种：1.单继承,２.多继承<br /><font color="#0000ff">[单继承解释:]</font><br /><font color="#ff1493">派生类有很多,但是基类只有一个,这个就相当与一个"父亲"和很多个孩子,类似于一部小品&lt;&lt;超生游击队&gt;&gt;,什么上海,哈尔滨,乌鲁木齐啊</font><br /><font color="#0000ff">[多继承解释:]</font><br /><font color="#ff1493">派生类可以继承来自2个以上的基类,A和B生出来的"孩子"有"父亲"的特性也有"母亲"的 特性,这有点类似于基因遗传.</font><br />下面给出例子:<br />Code Example:<br />class A<br />{<br />public:<br />   A(int x,int y)<br />{<br />   data1 = x;<br />   data2 = y;<br />cout &lt;&lt;"A:"&lt;&lt;data1&lt;&lt;data2;<br />}<br />private:<br />   int data1;<br />   int data2;<br />};<br />class B<br />{<br />public:<br />   B(int x,int y)<br />{<br />   data1 = x;<br />   data2 =y;<br />   cout &lt;&lt; "B:"&lt;&lt;data1&lt;&lt;data2;<br />}<br />private:<br />   int data1;<br />   int data2;<br />};<br />class C:public A,public B<br />{<br />   public:<br />   C(int x,int y,int x1,int y1):A(x,y),B(x1,y1)<br />   {<br />   }<br />};<br />void main()<br />{<br />   C c(1,2,3,4);<br />}</font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 13:59 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 C++测试题目</title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16836.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 05:42:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16836.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16836.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16836.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16836.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16836.html</trackback:ping><description><![CDATA[
		<font face="Courier New">下面这段代码的输出是多少(在32位机上).<br />    char *p;<br />    char *q[20];<br />    char *m[20][20];<br />    int (*n)[10];<br />    struct MyStruct<br />    { <br />      char dda; <br />      double dda1; <br />      int type ;<br />    }； <br />    MyStruct k;<br />    printf("%d %d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));<br /></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 13:42 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 之 关于C++友元函数问题</title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16834.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16834.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16834.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16834.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16834.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16834.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New">原文出处：</font>
				<a href="http://community.csdn.net/Expert/topic/5253/5253345.xml?temp=.6615412">
						<br />
						<font face="Courier New">http://community.csdn.net/Expert/topic/5253/5253345.xml?temp=.6615412</font>
				</a>
				<br />
				<font face="Courier New">友元函数可以定义在类的内部，也可以定义在类的外部，但是即使它定义在类内，它也是“全局函数”。<br />通常在类函数名前面声明friend <br />那么就可以对类内部的private变量进行操作了<br />vc6.0对友元函数的支持本人认为还可以，并不是他们所说的那么差．<br />下面给出例子：<br />Code Example:<br /><br />#include &lt;iostream&gt;<br />#include &lt;string&gt;<br />using namespace std;<br />class A<br />{<br />private:<br />    string name;<br />public:<br />    friend void outdata(A &amp;s) ;<br />    A(){};<br />    virtual ~A){};<br />    Astring &amp;s);<br />};<br />A:student(string &amp;s)<br />{<br /> name=s;<br />}</font>
		</p>
		<p>
				<font face="Courier New">void outdata(A &amp;s)<br />{<br /> cout&lt;&lt;"out data:"&lt;&lt;s.name&lt;&lt;endl;<br />}</font>
		</p>
		<p>
				<font face="Courier New">void main()<br />{<br /> string t="tim";<br /> A s1(t);<br /> outdata(s1);<br />}<br /></font>
		</p>
<img src ="http://www.cppblog.com/mumutou/aggbug/16834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 13:36 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++随笔 之 C++ Sizeof()函数</title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16830.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 05:13:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16830.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16830.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16830.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16830.html</trackback:ping><description><![CDATA[
		<font face="Courier New">原文出处:<br /></font>
		<a href="http://community.csdn.net/Expert/topic/5253/5253878.xml?temp=.5134088">
				<font face="Courier New">http://community.csdn.net/Expert/topic/5253/5253878.xml?temp=.5134088 </font>
		</a>
		<br />
		<font face="Courier New">A ====char *p[10];int *a[10];<br />针对这个问题<br />首先我给出另一个例子<br />B ====char (*p)[10];int (*a)[10];<br />A和B是不一样的<br />A解释：char *p[10]定义了10个32位的指向char的指针p[0],p[1],p[2]......p[9],<br />      int *a[10]定义了10个32位的指向int的指针a[0],a[1],a[2]......a[9],<br />Get:10 * 32 /8 = 40,OK<br />B解释：char (*p)[10]定义了一个指向10个char的32位指针p<br />      int (*a)[10]定义了一个指向10个int的32位指针a<br />Get:32/ 8 = 4, OK<br />               <br />Code Example:<br />void main()<br />{<br /> char *p[10];<br /> int  *a[10];<br /> char (*p1)[10];<br /> int  (*a1)[10];<br /> int x1 = sizeof(p);<br /> int x2 = sizeof(a);<br /> int x3 = sizeof(p1);<br /> int x4 = sizeof(a1);<br /> cout &lt;&lt;x1&lt;&lt;"\n"&lt;&lt;x2&lt;&lt;"\n"&lt;&lt;x3&lt;&lt;"\n"&lt;&lt;x4&lt;&lt;"\n";<br />}<br /></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 13:13 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++随笔 之 继承类的构造,析构函数会隐式调用基类的构造,析构函数</title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16824.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 04:58:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16824.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16824.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16824.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16824.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16824.html</trackback:ping><description><![CDATA[
		<font face="Courier New">首先声明:成员函数不会,即使是虚函数也不会.<br />下面是我给出的example:<br />#include &lt;iostream.h&gt;<br />int num = 0;<br />int num1 = 0;<br />class A<br />{<br />public:<br /> A()<br /> {<br />  cout &lt;&lt; num++;<br /> }<br /> ~A()<br /> {<br />  cout &lt;&lt; num --;<br /> }<br />};<br />class B:public A<br />{<br />public:<br /> B()<br /> {<br />  cout &lt;&lt; num ++;<br /> }<br /> ~B()<br /> {<br />  cout &lt;&lt; num--;<br /> }<br />};<br />void main()<br />{<br /> A a;<br /> B b;<br />}<br /></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 12:58 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++随笔 之 一个有趣的C循环问题</title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16822.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 04:41:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16822.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16822.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16822.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16822.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16822.html</trackback:ping><description><![CDATA[
		<font face="Courier New">void main()<br />{<br /> int i;<br /> int a[10];<br /> for(i = 0;i &lt;=10;i ++)<br />  a[i] = 0;<br />}<br />大家看,很简单的一个问题,但是为什么会一直执行呢?<br />明显,聪明的你看出问题出现for(i = 0;i &lt;= 10;i ++)   a[i] = 0;<br />总共定义了10个int,明显循环超出了范围,<br />下面我们就来看看其汇编如何运行,大家就都明白了.<br />00401031   mov         eax,dword ptr [ebp-4]<br />00401034   add         eax,1<br />00401037   mov         dword ptr [ebp-4],eax<br />0040103A   cmp         dword ptr [ebp-4],0Ah<br />0040103E   jg          main+3Dh (0040104d)<br />00401040   mov         ecx,dword ptr [ebp-4]<br />00401043   mov         dword ptr [ebp+ecx*4-2Ch],0<br />0040104B   jmp         main+21h (00401031)<br />程序一直在00401031-0040104B之间运行,问题出在00401043上面,<br />i变量在dwort ptr[ebp-4]<br />那么当执行到i =10<br />dword ptr[ebp + ecx*4-2cH]= dword ptr[ebp+dword ptr[ebp-4]*4-2ch]<br />=dword ptr[ebp + 10*4-44] = dword ptr[ebp-4]<br />哈哈,i变成了0<br /></font>
<img src ="http://www.cppblog.com/mumutou/aggbug/16822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 12:41 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++随笔 之C++拷贝构造函数作用</title><link>http://www.cppblog.com/mumutou/archive/2006/12/25/16819.html</link><dc:creator>木木头</dc:creator><author>木木头</author><pubDate>Mon, 25 Dec 2006 03:34:00 GMT</pubDate><guid>http://www.cppblog.com/mumutou/archive/2006/12/25/16819.html</guid><wfw:comment>http://www.cppblog.com/mumutou/comments/16819.html</wfw:comment><comments>http://www.cppblog.com/mumutou/archive/2006/12/25/16819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mumutou/comments/commentRss/16819.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mumutou/services/trackbacks/16819.html</trackback:ping><description><![CDATA[
		<a href="/mumutou/articles/16816.html">
				<font face="Courier New">http://www.cppblog.com/mumutou/articles/16816.html</font>
		</a>
<img src ="http://www.cppblog.com/mumutou/aggbug/16819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mumutou/" target="_blank">木木头</a> 2006-12-25 11:34 <a href="http://www.cppblog.com/mumutou/archive/2006/12/25/16819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>