﻿<?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++ Programmer's Cookbook</title><link>http://www.cppblog.com/mzty/</link><description>&lt;a href = "http://www.cppblog.com/mzty/archive/2007/03/02/19109.html"&gt;&lt;font size = 3 &gt;{C++ 基础}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/08/13/29922.html"&gt;&lt;font size = 3 &gt;{C++ 高级}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/04/16/22064.html"&gt;&lt;font size = 3 &gt;{C#界面，C++核心算法}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/03/04/19163.html"&gt;&lt;font size = 3 &gt;{设计模式}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "
http://www.cppblog.com/mzty/archive/2007/03/04/19167.html"&gt;&lt;font size = 3 &gt;{C#基础}&lt;font/&gt;&lt;/a&gt;





</description><language>zh-cn</language><lastBuildDate>Thu, 16 Apr 2026 10:01:01 GMT</lastBuildDate><pubDate>Thu, 16 Apr 2026 10:01:01 GMT</pubDate><ttl>60</ttl><item><title>动态链接库dll 静态链接库lib 动态导入库lib</title><link>http://www.cppblog.com/mzty/archive/2013/07/15/201811.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 15 Jul 2013 05:38:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2013/07/15/201811.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/201811.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2013/07/15/201811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/201811.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/201811.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br />转自：<a href="http://blog.csdn.net/uniqueren/article/details/4163662">http://blog.csdn.net/uniqueren/article/details/4163662</a><br /><br />目前以lib后缀的库有两种，一种为<span style="color: #ff0000;">静态链接库(Static Libary，以下简称&#8220;静态库&#8221;)</span>&nbsp;，另一种为<span style="color: #ff0000;">动态连接库(DLL，以下简称&#8220;动态库&#8221;)</span>&nbsp;的<span style="color: #ff0000;">导入库(Import Libary，以下简称&#8220;导入库&#8221;)</span>&nbsp;。&nbsp;<br />静态库是一个或者多个obj文件的打包，所以有人干脆把从obj文件生成lib的过程称为Archive，即合并到一起。比如你链接一个静态库，如果其中有错，它会准确的找到是哪个obj有错，即静态lib只是壳子。&nbsp;<br />动态库一般会有对应的导入库，方便程序静态载入动态链接库，否则你可能就需要自己LoadLibary调入DLL文件，然后再手工GetProcAddress获得对应函数了。有了导入库，你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。&nbsp;<br /><span style="color: #ff0000;">导入库和静态库</span>&nbsp;的区别很大，他们实质是不一样的东西。<span style="text-decoration: underline;">静态库本身就包含了实际执行代码、符号表等等</span>&nbsp;，而对于<span style="text-decoration: underline;">导入库而言，其实际的执行代码位于动态库中，导入库只包含了地址符号表等，确保程序找到对应函数的一些基本地址信息</span>&nbsp;。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">这也是实际上很多开源代码发布的惯用方式：</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">1. 预编译的开发包：包含一些.dll文件和一些.lib文件。其中这里的.lib就是导入库，而不要错以为是静态库。但是引入方式和静态库一样，要在链接路 径上添加找到这些.lib的路径。而.dll则最好放到最后产生的应用程序exe执行文件相同的目录。这样运行时，就会自动调入动态链接库。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">2. 用户自己编译： 下载的是源代码，按照readme自己编译。生成很可能也是.dll + .lib(导入库)的库文件</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">3. 如果你只有dll，并且你知道dll中函数的函数原型，那么你可以直接在自己程序中使用LoadLibary调入DLL文件，GetProcAddress</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">DLL：&nbsp;<br />动 态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法，使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中，该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。&nbsp;<br />动态链接与静态链接的不同之处在于它允许可执行模块（.dll 文件或 .exe 文件）仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中，链接器从静态链接库获取所有被引用的函数，并将库同代码一起放到可执行文件中。&nbsp;<br />使用动态链接代替静态链接有若干优点。DLL 节省内存，减少交换操作，节省磁盘空间，更易于升级，提供售后支持，提供扩展 MFC 库类的机制，支持多语言程序，并使国际版本的创建轻松完成。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下，API 由一个或多个提供某种特殊功能的 DLL 组成。&nbsp;<br />DLL 是一个文件，其中包含了在 Microsoft? Windows? 下运行的任何应用程序都可调用的函数。运行时，DLL 中的函数动态地链接到调用它的应用程序中。无论有多少应用程序调用 DLL 中的某个函数，在磁盘上只有一个文件包含该函数，且只在它调入内存时才创建该 DLL。&nbsp;<br />您听到最多的 API 可能是 Windows API，它包括构成 Windows 操作系统的各种 DLL。每个 Windows 应用程序都直接或间接地与 Windows API 互动。Windows API 保证 Windows 下运行的所有应用程序的行为方式一致。&nbsp;<br />注意 随着 Windows 操作系统的发展，现已发布了几个版本的 Windows API。Windows 3.1 使用 Win16 API。Microsoft? Windows NT?、Windows 95 和 Windows 98 平台使用 Microsoft? Win32? API。&nbsp;<br />除 Windows API 外，其他一些 API 也已发布。例如，邮件应用程序编程接口 (MAPI) 是一组可用于编写电子邮件应用程序的 DLL。&nbsp;<br />API 传统上是为开发 Windows 应用程序的 C 和 C++ 程序员编写的，但其他的编程语言（包括VBA）也可以调用 DLL 中的函数。因为大部分 DLL 主要是为 C 和 C++ 程序员编写和整理说明的，所以调用 DLL 函数的方法与调用 VBA 函数会有所不同。在使用 API 时必须了解如何给 DLL 函数传递参数。&nbsp;<br />警告 调用 Windows API 和 其他 DLL 函数可能会给您的应用程序带来不良影响。从自己的代码中直接调用 DLL 函数时，您绕过了 VBA 通常提供的一些安全机制。如果在定义或调用 DLL 函数时出现错误（所有程序员都不可避免），可能会在应用程序中引起应用程序错误（也称为通用性保护错误，或 GPF）。最好的解决办法是在运行代码以前保存该项目，并确保了解 DLL 函数调用的原理。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">LIB 创建标准库、导入库和导出文件，在生成 32 位程序时可将它们与 LINK 一起使用。LIB 从命令提示运行。&nbsp;<br />可在下列几种模式下使用 LIB：&nbsp;<br />生成或修改 COFF 库&nbsp;<br />将成员对象提取到文件中&nbsp;<br />创建导出文件和导入库&nbsp;<br />这些模式是互斥的；每次只能以一种模式使用 LIB。</p><img src ="http://www.cppblog.com/mzty/aggbug/201811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2013-07-15 13:38 <a href="http://www.cppblog.com/mzty/archive/2013/07/15/201811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>csharp中xml引用xslt</title><link>http://www.cppblog.com/mzty/archive/2011/01/12/138409.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 12 Jan 2011 12:58:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2011/01/12/138409.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/138409.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2011/01/12/138409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/138409.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/138409.html</trackback:ping><description><![CDATA[使用xmldocument.createprocessinginstruction()方法。 <br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.IO;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Xml;<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Sample<br>{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Main()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;XmlDocument&nbsp;doc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;XmlDocument();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;a&nbsp;procesing&nbsp;instruction.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;XmlProcessingInstruction&nbsp;newPI;<br>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;PItext&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">type='text/xsl'&nbsp;href='book.xsl'</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;newPI&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;doc.CreateProcessingInstruction(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">xml-stylesheet</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;PItext);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Display&nbsp;the&nbsp;target&nbsp;and&nbsp;data&nbsp;information.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;?{0}&nbsp;{1}?&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;newPI.Target,&nbsp;newPI.Data);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Add&nbsp;the&nbsp;processing&nbsp;instruction&nbsp;node&nbsp;to&nbsp;the&nbsp;document.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;doc.AppendChild(newPI);<br><br>&nbsp;&nbsp;}<br>}</span></div>
<br>完！<img src ="http://www.cppblog.com/mzty/aggbug/138409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2011-01-12 20:58 <a href="http://www.cppblog.com/mzty/archive/2011/01/12/138409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2道C++面试题</title><link>http://www.cppblog.com/mzty/archive/2010/12/21/137134.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 21 Dec 2010 12:59:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2010/12/21/137134.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/137134.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2010/12/21/137134.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/137134.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/137134.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>一 逻辑题</p>
<p><br>在一张东景照片上,人们分别戴着帽子,系着围巾和戴着者手套.只戴帽子的人数与只系围巾和只戴手套的人数相等:只有4人没有戴帽子:戴着帽子和系着围巾,但没有戴手套的有5人:只戴帽子的人数两倍于只系围巾者:未戴手套者8人,未系围巾者7人:三样东西都用上了的人比只戴帽子的人多一个.那么请问:多少人同时用上了帽子,围巾和手套?多少人只戴了手套?多少人只系了围巾?多少人既戴了帽子,又戴了手套,但没系围巾?多少人戴着手套?照片上一共有多少个人?<br><br>如果用纯代数的方法来做，就这样。 <br>设：只戴帽子的人数为A，只围巾B，只手套C，只帽子围巾D，只帽子手套E，只围巾手套F，都带的G 得： <br>A=B+C（只戴帽子人数与只系围巾和只戴手套的人数和相等 ） <br>B+C+F=4 （只有4人没有戴帽子） <br>D=5（戴着帽子和系着围巾，但没有戴手套的有5人） <br>A=2B（只戴帽子的人数两倍于只系着巾） <br>A+B+D=8（未戴着手套者8人） <br>A+C+E=7（未系围巾者7人） <br>G=A+1 （三样东西都用上了的人比只戴帽子的人多一个） <br>从D=5 A=2B A+B+D=8 这3个式子开始解 <br>最后得出A=2 B=1 C=1 D=5 E=4 F=2 G=3&nbsp;<br><br><br><br>二 汉诺塔<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Hanoi(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;A,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;B,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;C);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_112_140_Open_Image onclick="this.style.display='none'; Codehighlighter1_112_140_Open_Text.style.display='none'; Codehighlighter1_112_140_Closed_Image.style.display='inline'; Codehighlighter1_112_140_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_112_140_Closed_Image onclick="this.style.display='none'; Codehighlighter1_112_140_Closed_Text.style.display='none'; Codehighlighter1_112_140_Open_Image.style.display='inline'; Codehighlighter1_112_140_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_112_140_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_112_140_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Hanoi(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Hanoi(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;A,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;B,</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;C)<br><img id=Codehighlighter1_182_400_Open_Image onclick="this.style.display='none'; Codehighlighter1_182_400_Open_Text.style.display='none'; Codehighlighter1_182_400_Closed_Image.style.display='inline'; Codehighlighter1_182_400_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_182_400_Closed_Image onclick="this.style.display='none'; Codehighlighter1_182_400_Closed_Text.style.display='none'; Codehighlighter1_182_400_Open_Image.style.display='inline'; Codehighlighter1_182_400_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_182_400_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_182_400_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Move&nbsp;top&nbsp;disk&nbsp;from&nbsp;peg&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;to&nbsp;peg&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_275_398_Open_Image onclick="this.style.display='none'; Codehighlighter1_275_398_Open_Text.style.display='none'; Codehighlighter1_275_398_Closed_Image.style.display='inline'; Codehighlighter1_275_398_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_275_398_Closed_Image onclick="this.style.display='none'; Codehighlighter1_275_398_Closed_Text.style.display='none'; Codehighlighter1_275_398_Open_Image.style.display='inline'; Codehighlighter1_275_398_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_275_398_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_275_398_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hanoi(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,A,C,B);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Move&nbsp;top&nbsp;disk&nbsp;from&nbsp;peg&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;to&nbsp;peg&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hanoi(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,B,A,C);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<br>完！<img src ="http://www.cppblog.com/mzty/aggbug/137134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2010-12-21 20:59 <a href="http://www.cppblog.com/mzty/archive/2010/12/21/137134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.h头文件 .lib库文件 .dll动态链接库文件关系</title><link>http://www.cppblog.com/mzty/archive/2010/11/28/134901.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Sun, 28 Nov 2010 09:12:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2010/11/28/134901.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/134901.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2010/11/28/134901.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/134901.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/134901.html</trackback:ping><description><![CDATA[<p><br>原帖地址：<a href="http://blog.csdn.net/c395565746c/archive/2010/03/21/5402239.aspx">http://blog.csdn.net/c395565746c/archive/2010/03/21/5402239.aspx</a></p>
<p><br>.h头文件是编译时必须的，lib是链接时需要的，dll是运行时需要的。</p>
<p>附加依赖项的是.lib不是.dll，若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和链接，有头文件和lib就够了。如果也使动态连接的程序运行起来，有dll就够了。在开发和调试阶段，当然最好都有。</p>
<p>.h .lib .dll三者的关系是：</p>
<p>H文件作用是:声明函数接口&nbsp; </p>
<p>DLL文件作用是: 函数可执行代码&nbsp; </p>
<p>当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用: 告诉链接器 调用的函数在哪个DLL中，函数执行代码在DLL中的什么位置 ，这也就是为什么需要附加依赖项 .LIB文件，它起到桥梁的作用。如果生成静态库文件，则没有DLL ，只有lib，这时函数可执行代码部分也在lib文件中</p>
<p>目前以lib后缀的库有两种，一种为静态链接库(Static Libary，以下简称&#8220;静态库&#8221;)，另一种为动态连接库(DLL，以下简称&#8220;动态库&#8221;)的导入库(Import Libary，以下简称&#8220;导入库&#8221;）。静态库是一个或者多个obj文件的打包 ，所以有人干脆把从obj文件生成lib的过程称为Archive，即合并到一起。比如你链接一个静态库，如果其中有错，它会准确的找到是哪个obj有错，即静态lib只是壳子。动态库一般会有对应的导入库，方便程序静态载入动态链接库 ，否则你可能就需要自己LoadLibary调入DLL文件，然后再手工GetProcAddress获得对应函数了。有了导入库，你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。导入库和静态库的区别很大，他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等，而对于导入库而言，其实际的执行代码位于动态库中，导入库只包含了地址符号表等，确保程序找到对应函数的一些基本地址信息。</p>
<p>一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的，而dll文件是运行期才会被调用的。 如果有dll文件，那么对应的lib文件一般是一些索引信息，具体的实现在dll文件中。如果只有lib文件，那么这个lib文件是静态编译出来的，索引和实现都在其中。静态编译的lib文件有好处：给用户安装时就不需要再挂动态库了。但也有缺点，就是导致应用程序比较大，而且失去了动态库的灵活性，在版本升级时，同时要发布新的应用程序才行。在动态库的情况下，有两个文件，而一个是引入库（.LIB）文件，一个是DLL文件，引入库文件包含被DLL导出的函数的名称和位置，DLL包含实际的函数和数据，应用程序使用LIB文件链接到所需要使用的DLL文件，库中的函数和数据并不复制到可执行文件中，因此在应用程序的可执行文件中，存放的不是被调用的函数代码，而是DLL中所要调用的函数的内存地址，这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来，从而节省了内存资源。从上面的说明可以看出，DLL和.LIB文件必须随应用程序一起发行，否则应用程序将会产生错误。</p>
<p>静态库和共享库都是一个obj文件的集合 ，但静态链接后，执行程序中存在自己所需obj的一份拷贝，而动态链接后，执行程序仅仅是包含对共享库的一个引用。共享库相当于一个由多个obj文件组合而成的obj文件，在链接后其所有代码被加载，不管需要的还是不需要的。<br>似乎可以得出一个结论：<br>&nbsp; 静态链接后的程序比动态链接的所用存储空间大，因为执行程序中包含了库中代码拷贝；<br>&nbsp; 而动态链接的程序比静态链接的所用的运行空间大，因为它将不需要的代码也加载到运行空间。</p>
<p><br><span style="COLOR: red">针对上面的知识2 个问题：<br><br>1） DLL和.LIB文件必须随应用程序一起发行，否则应用程序将会产生错误。 <br>我的答案：lib应该不需要吧。<br><br>2）如果是某个程序中调用了一个动态库（通过header文件，lib+dll来调用），则对动态库的某个函数的内容修改了，但接口不改，则调用此动态库的程序需重新编译连接吗？如果是通过loadlibary动态加载，需要重新编译连接吗？<br>我的答案：通过header+lib+dll调用的话需要重新编译连接，但是通过loadlibrary来使用的话，不需要重新编译连接。<br><br>欢迎大家讨论！<br><br>完！</span></p><img src ="http://www.cppblog.com/mzty/aggbug/134901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2010-11-28 17:12 <a href="http://www.cppblog.com/mzty/archive/2010/11/28/134901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++强大的背后</title><link>http://www.cppblog.com/mzty/archive/2010/09/18/126964.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Sat, 18 Sep 2010 02:07:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2010/09/18/126964.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/126964.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2010/09/18/126964.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/126964.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/126964.html</trackback:ping><description><![CDATA[<br>转自：<a href="http://www.cnblogs.com/miloyip/archive/2010/09/17/1828449.html">http://www.cnblogs.com/miloyip/archive/2010/09/17/1828449.html</a><br><br>
<p>在31年前(1979年)，一名刚获得博士学位的研究员，为了开发一个软件项目发明了一门新编程语言，该研究员名为<a href="http://www2.research.att.com/~bs/"><font color=#3d81ee>Bjarne Stroustrup</font></a>，该门语言则命名为——C with classes，四年后改称为C++。C++是一门通用编程语言，支持多种编程范式，包括过程式、面向对象(object-oriented programming, OP)、泛型(generic programming, GP)，后来为泛型而设计的模版，被<a href="http://www.erwin-unruh.de/meta.html"><font color=#3d81ee>发现</font></a>及<a href="http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=AA022F3026015EF910CAEF5156901019?doi=10.1.1.14.3670&amp;rep=rep1&amp;type=pdf"><font color=#3d81ee>证明是图灵完备的</font></a>，因此使C++亦可支持<a href="http://en.wikipedia.org/wiki/Template_metaprogramming"><font color=#3d81ee>模版元编程范式(template metaprogramming, TMP)</font></a>。C++继承了C的特色，既为高级语言，又含低级语言功能，可同时作为系统和应用编程语言。</p>
<p>C++广泛应用在不同领域，使用者<a href="http://www2.research.att.com/~bs/bs_faq.html#number-of-C++-users"><font color=#3d81ee>以数百万计</font></a>。根据<a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"><font color=#3d81ee>近十年的调查</font></a>，C++的流行程度约稳定排行第3位(于C/Java之后)。 C++经历长期的实践和演化，才成为今日的样貌。1998年，C++标准委员会排除万难，使C++成为ISO标准(俗称C++98)，当中含非常强大的<a href="http://www.sgi.com/tech/stl/"><font color=#3d81ee>标准模版库(standard template library, STL)</font></a>。之后委员会在2005年提交了有关标准库的<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf"><font color=#3d81ee>第一个技术报告(简称TR1)</font></a>，并为下一个标准<a href="http://en.wikipedia.org/wiki/C%2B%2B0x"><font color=#3d81ee>C++0x</font></a>而努力。可惜C++0x并不能在200x年完成，各界希望新标准能于2011年内出台。</p>
<p>流行的C++编译器中，微软Visual C++ 2010已实现<a href="http://msdn.microsoft.com/en-us/library/dd465215.aspx"><font color=#3d81ee>部分C++0x语法并加入TR1扩充库</font></a>，而gcc对<a href="http://gcc.gnu.org/projects/cxx0x.html"><font color=#3d81ee>C++0x语法和库的支持</font></a>比VC2010更多。</p>
<h2>应否选择C++</h2>
<h3>哪些程序适宜使用C++?</h3>
<p>C++并非万能丹，我按经验举出一些C++的适用时机。</p>
<ul>
    <li>C++适合构造程序中需求较稳定的部分，需求变化较大的部分可使用脚本语言；</li>
    <li>程序须尽量发挥硬件的最高性能，且性能瓶颈在于CPU和内存；</li>
    <li>程序须频繁地与操作系统或硬件沟通；</li>
    <li>程序必须使用C++框架/库，如大部分游戏引擎(如Unreal/Source)及中间件(如Havok/FMOD)，虽然有些C++库提供其他语言的绑定，但通常原生的API性能最好、最新；</li>
    <li>项目中某个目标平台只提供C++编译器的支持。</li>
</ul>
<p>按应用领域来说，C++适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。</p>
<h3>使用C++还是C? </h3>
<p>C++和C的设计哲学并不一样，两者取舍不同，所以不同的程序员和软件项目会有不同选择，难以一概而论。与C++相比，C具备编译速度快、容易学习、显式描述程序细节、较少更新标准(后两者也可同时视为缺点)等优点。在语言层面上，C++包含绝大部分C语言的功能(例外之一，C++没有C99的<a href="http://en.wikipedia.org/wiki/Variable-length_array"><font color=#3d81ee>变长数组VLA</font></a>)，且提供OOP和GP的特性。但其实用C也可实现OOP思想，亦可利用宏去实现某程度的GP，只不过C++的语法能较简洁、自动地实现OOP/GP。C++的<a href="http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization"><font color=#3d81ee>RAII</font></a>(resource acquisition is initialization，资源获取就是初始化)特性比较独特，C/C#/Java没有相应功能。回顾历史，Stroustrup开发的早期C++编译器Cpre/<a href="http://en.wikipedia.org/wiki/Cfront"><font color=#3d81ee>Cfront</font></a>是把C++源代码翻译为C，再用C编译器编译的。由此可知，C++编写的程序，都能用等效的C程序代替，但C++在语言层面上提供了OOP/GP语法、更严格的类型检查系统、大量额外的语言特性(如异常、<a href="http://en.wikipedia.org/wiki/RTTI"><font color=#3d81ee>RTTI</font></a>等)，并且C++标准库也较丰富。有时候C++的语法可使程序更简洁，如运算符重载、隐式转换。但另一方面，C语言的API通常比C++简洁，能较容易供其他语言程序调用。因此，一些C++库会提供C的API封装，同时也可供C程序调用。相反，有时候也会把C的API封装成C++形式，以支持RAII和其他C++库整合等。 </p>
<h3>为何C++性能可优于其他语言?</h3>
<p>相对运行于虚拟机语言(如C#/Java)，C/C++直接以静态形式把源程序编译为目标平台的机器码。一般而言，C/C++程序在编译及链接时可进行的优化最丰富，启动时的速度最快，运行时的额外内存开销最少。而C/C++相对动态语言(如Python/Lua)也减少了运行时的动态类型检测。此外，C/C++的运行行为是确定的，且不会有额外行为(例如C#/Java必然会初始化变量)，也不会有如垃圾收集(GC)而造成的不确定性延迟，而且C/C++的数据结构在内存中的布局也是确定的。有时C++的一些功能会使程序性能优于C，当中以内联和模版最为突出，这两项功能使C++标准库的sort()通常比C标准库的qsort()<a href="http://en.wikipedia.org/wiki/Sort_(C%2B%2B)#Comparison_to_qsort.28.29"><font color=#3d81ee>快多倍</font></a>(C可用宏或人手编码去解决此问题)。另一方面，C/C++能直接映射机器码，之间没有另一层中间语言，因此可以做底层优化，例如使用<a href="http://en.wikipedia.org/wiki/Intrinsic_function"><font color=#3d81ee>内部(intrinsic)函数</font></a>和嵌入汇编语言。然而，许多C++的性能优点并非免费午餐，代价包括较长的编译链接时间和较易出错，因而增加开发时间和成本，这点稍后补充。</p>
<p>我进行了一个简单全局渲染性能测试(512x512像素，每像素10000个采样)，C++ 1小时36分、Java 3小时18分、Python约18天、Ruby约351天。评测方式和其他语言的结果详见<a href="http://www.cnblogs.com/miloyip/archive/2010/07/07/languages_brawl_GI.html"><font color=#3d81ee>博文</font></a>。</p>
<h2>C++常见问题</h2>
<h3>C++源代码跨平台吗?</h3>
<p>C++有不错的跨平台能力，但由于直接映射硬件，因性能优化的关系，跨平台能力不及Java及多数脚本语言。然而，实践跨平台的C++软件还是可行的，但须注意以下问题：</p>
<ul>
    <li>C++标准没有规定原始数据类型(如int)的大小，需要特定大小的类型时，可自订类型(如int32_t)，同时对任何类型使用sizeof()而不假设其大小；</li>
    <li>字节序(byte order)按CPU有所不同，特别要注意二进制输入输出、reinterpret_cast法；</li>
    <li>原始数据和结构类型的地址对齐有差异；</li>
    <li>编译器提供的一些编译器或平台专用扩充指令；</li>
    <li>避免作<a href="http://en.wikipedia.org/wiki/Application_binary_interface"><font color=#3d81ee>应用二进制接口(application binary interface, ABI)</font></a>的假设，例如调用函数时参数的取值顺序在C/C++中没定义，在C++中也不可随便假设RTTI/虚表等实现方式。</li>
</ul>
<p>总括而言，跨平台C++软件可在头文件中用宏检测编译器和平台，再用宏、typedef、自定平台相关实现等方法去实践跨平台，C++标准不会提供这类帮助。</p>
<h3>C++程序容易崩溃?</h3>
<p>和许多语言相比，C/C++提供不安全的功能以最优化性能，有可能造成崩溃。但要注意，很多运行时错误，如向空指针/引用解引用、数组越界、堆栈溢出等，其他语言也会报错或抛出异常，这些都是程序问题，而不是语言本身的问题。有些意见认为，出现这类运行时错误，应该尽量写入日志并立即崩溃，不该让程序继续运行，以免造成更大的影响(例如程序继续把内存中错误的数据覆写文件)。若要容错，可按业务把程序分割为多进程，像<a href="http://dev.chromium.org/developers/design-documents/multi-process-architecture"><font color=#3d81ee>Chrome</font></a>或使用fork()的形式。然而，C++有许多机制可以减少错误，例如以<a href="http://en.wikipedia.org/wiki/String_(C%2B%2B)"><font color=#3d81ee>string</font></a>代替C字符串；以<a href="http://en.wikipedia.org/wiki/Vector_(C%2B%2B)"><font color=#3d81ee>vector</font></a>或<a href="http://en.wikipedia.org/wiki/Array_(C%2B%2B)"><font color=#3d81ee>array(TR1)</font></a>代替原始数组(有些实现可在调试模式检测越界)；使用智能指针也能减少一些原始指针的问题。另外，我最常遇到的Bug，就是没有初始化成员变量，有时会导致崩溃，而且调试版和发行版的行为可能不同。</p>
<h3>C++要手动做内存管理?</h3>
<p>C++同时提供在堆栈上的自动局部变量，以及从自由存储(free store)分配的对象。对于后者，程序员需手动释放，或使用不同的容器和智能指针。 C++程序员经常进一步优化内存，自定义内存分配策略以提升效能，例如使用对象池、自定义的单向/双向堆栈区等。虽然C++0x还没加入GC功能，但也可以自行编写或使用现成库。此外，C/C++也可以直接使用操作系统提供的内存相关功能，例如内存映射文件、共享内存等。</p>
<h3>使用C++常要重造轮子?</h3>
<p>我曾参与的C++项目，都会重造不少标准库已提供的功能，此情况在其他语言中较少出现。我试图分析个中原因。首先，C++标准库相对很多语言来说是贫乏的，各开发者便会重复地制造自订库。从另一个角度看，C++标准库是用C++编写的(很多其他语言不用自身而是用C/C++去编写库)，在能力和性能上，自订库和标准库并无本质差别；另外，标准库为通用而设，对不同平台及多种使用需求作取舍，性能上有所影响，例如EA公司就曾发表自制的EASTL规格，描述游戏开发方面对STL的性能及功能需求的特点；此外，多个C++库一起使用，经常会因规范不同而引起冲突，又或功能重叠，所以项目可能须自行开发，或引入其他库的概念或实现(如<a href="http://www.boost.org/"><font color=#3d81ee>Boost</font></a>/<a href="http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1"><font color=#3d81ee>TR1</font></a>/<a href="http://loki-lib.sourceforge.net/"><font color=#3d81ee>Loki</font></a>)，改写以符合项目规范。</p>
<h3>C++编译速度很慢?</h3>
<p>错，是非常慢。我认为C++可能是实用程序语言中编译速度最慢的。此问题涉及C++沿用C的编译链接方式，又加入了复杂的类/泛型声明和内联机制，使编译时间倍增。在C++对编译方法改革之前(如<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2073.pdf"><font color=#3d81ee>module提案</font></a>)，可使用以下技巧改善：第一，使用<a href="http://en.wikipedia.org/wiki/Opaque_pointer"><font color=#3d81ee>pimpl手法</font></a>，因性能损耗应用于调用次数不多的类；第二，仅包含必要头文件，并尽量使用及提供前置声明版本的头文件(如iosfwd)；第三采用基于接口的设计，但须注意虚函数调用成本；第四，采用<a href="http://buffered.io/2007/12/10/the-magic-of-unity-builds/"><font color=#3d81ee>unity build</font></a>，即把多个cpp文件结合在一个编译单元进行编译；第五，采用分布式生成系统如<a href="http://www.xoreax.com/"><font color=#3d81ee>IncrediBuild</font></a>。</p>
<h3>C++缺乏什么功能?</h3>
<p>虽然C++已经非常复杂，但仍缺少很多常见功能。 C++0x作出了不少改善，例如语言方面加入Lambda函数、闭包、类型推导声明等，而库方面则加入正则表达式、采用哈希表的unordered_set/unordered_map、引用计数智能指针shared_ptr/weak_ptr等。但最值得留意的是C++0x引入多线程的语法和库功能，这是C++演进的一大步。然而，模组、GC、反射机制等功能虽有提案，却未加进C++0x。</p>
<h2>C++使用建议</h2>
<h3>为应用挑选特性集</h3>
<p>我同意Stroustrup关于使用C++各种技术的回应：&#8220;你可以做，不意味着你必须这么做。(Just because you can do it, doesn't mean that you have to.)&#8221; C++充满丰富的特性，但同时带来不同问题，例如过分复杂、编译及运行性能的损耗。一般可考虑是否使用多重继承、异常、RTTI，并调节使用模版及模版元编程的程度。使用过分复杂的设计和功能，可能会令部分团队成员更难理解和维护。</p>
<h3>为团队建立编程规范</h3>
<p>C++的编码自由度很高，容易编写风格迥异的代码，C++本身也没有定义一些标准规范。而且，C++的源文件物理构成，较许多语言复杂。因此，除了决定特性集，每个团队应建立一套编程规范，包括源文件格式(可使用文件模版)、花括号风格。</p>
<h3>尽量使用C++风格而非C风格</h3>
<p>由于C++有对C兼容的包袱，一些功能可以使用C风格实现，但最好使用C++提供的新功能。最基本的是尽量以具名常量、内联函数和泛型取代宏，只把宏用在条件式编译及特殊情况。旧式的C要求局部变量声明在作用域开端，C++则无此限制，应把变量声明尽量置于邻近其使用的地方，for()的循环变量声明可置于for的括号内。 C++中能加强类型安全的功能应尽量使用，例如避免&#8220;万能&#8221;指针void *，而使用个别或泛型类型；用bool而非int表示布尔值；选用4种C++ cast关键字代替简单的强制转换。</p>
<h3>结合其他语言</h3>
<p>如前文所述，C++并非适合所有应用情境，有时可以混合其他语言使用，包括用C++扩展其他语言，或在C++程序中嵌入脚本语言引擎。对于后者，除了使用各种脚本语言的专门API，还可使用<a href="http://www.boost.org/doc/libs/1_42_0/libs/python/doc/index.html"><font color=#3d81ee>Boost</font></a>或<a href="http://www.swig.org/"><font color=#3d81ee>SWIG</font></a>作整合。</p>
<h2>C++学习建议</h2>
<p>C++缺点之一，是相对许多语言复杂，而且难学难精。许多人说学习C语言只需一本K&amp;R<a href="http://book.douban.com/subject/1139336/"><font color=#3d81ee>《C程序设计语言》</font></a>即可，但C++书籍却是多不胜数。我是从C进入C++，皆是靠阅读自学。在此分享一点学习心得。个人认为，学习C++可分为4个层次：</p>
<ul>
    <li>第一层次，C++基础：挑选一本入门书籍，如<a href="http://book.douban.com/subject/4262575/"><font color=#3d81ee>《C++ Primer》</font></a>、<a href="http://book.douban.com/subject/2030264/"><font color=#3d81ee>《C++大学教程》</font></a>、或Stroustrup撰写的经典<a href="http://book.douban.com/subject/1099889/"><font color=#3d81ee>《C++程序设计语言》</font></a>或他一年半前的新作<a href="http://book.douban.com/subject/4875599/"><font color=#3d81ee>《C++程序设计原理与实践》</font></a>，而一般C++课程也止于此，另外<a href="http://book.douban.com/subject/1110941/"><font color=#3d81ee>《C++ 标准程序库》</font></a>及<a href="http://book.douban.com/subject/1868179/"><font color=#3d81ee>《The C++ Standard Library Extensions》</font></a>可供参考；</li>
    <li>第二层次，正确高效地使用C++：此层次开始必须自修，阅读过《(<a href="http://book.douban.com/subject/1241385/"><font color=#3d81ee>More</font></a>)<a href="http://book.douban.com/subject/1842426/"><font color=#3d81ee>Effective C++</font></a>》、《(<a href="http://book.douban.com/subject/1244943/"><font color=#3d81ee>More</font></a>)<a href="http://book.douban.com/subject/1967356/"><font color=#3d81ee>Exceptional C++</font></a>》、<a href="http://book.douban.com/subject/1792179/"><font color=#3d81ee>《Effective STL》</font></a>及<a href="http://book.douban.com/subject/1480481/"><font color=#3d81ee>《C++编程规范》</font></a>等，才适宜踏入专业C++开发之路；</li>
    <li>第三层次，深入了解C++：关于全局问题可读<a href="http://book.douban.com/subject/1091086/"><font color=#3d81ee>《深入探索C++对象模型》</font></a>、<a href="http://book.douban.com/subject/1470838/"><font color=#3d81ee>《Imperfect C++》</font></a>、<a href="http://book.douban.com/subject/2970056/"><font color=#3d81ee>《C++沉思录》</font></a>、<a href="http://book.douban.com/subject/1110934/"><font color=#3d81ee>《STL源码剖析》</font></a>，要挑战智商，可看关于模版及模版元编程的书籍如<a href="http://book.douban.com/subject/2378124/"><font color=#3d81ee>《C++ Templates》</font></a>、<a href="http://book.douban.com/subject/1119904/"><font color=#3d81ee>《C++设计新思维》</font></a>、<a href="http://book.douban.com/subject/4136223/"><font color=#3d81ee>《C++模版元编程》</font></a>；</li>
    <li>第四层次，研究C++：阅读<a href="http://book.douban.com/subject/1096216/"><font color=#3d81ee>《C++语言的设计和演化》</font></a>、<a href="http://book.douban.com/subject/4722718/"><font color=#3d81ee>《编程的本质》</font></a>(含STL设计背后的数学根基)、C++标准文件<a href="http://openassist.googlecode.com/files/C%2B%2B%20Standard%20-%20ANSI%20ISO%20IEC%2014882%202003.pdf"><font color=#3d81ee>《ISO/IEC 14882:2003》</font></a>、<a href="http://www.open-std.org/JTC1/SC22/WG21/"><font color=#3d81ee>C++标准委员会</font></a>的提案书和报告书</a>、关于C++的学术文献。</li>
</ul>
<p>由于我主要是应用C++，大约只停留于第二、三个层次。然而，C++只是软件开发的一环而已，单凭语言并不能应付业务和工程上的问题。建议读者不要强求几年内&#8220;彻底学会C++的知识&#8221;，到达第二层左右便从工作实战中汲取经验，有兴趣才慢慢继续学习更高层次的知识。虽然学习C++有难度，但也是相当有趣且有满足感的。</p>
<p>数十年来，C++虽有起伏，但她依靠其使用者而不断得到顽强的生命力，相信在我退休之前都不会与她分离，也希望更进一步了解她，与她走进未来。</p>
<hr>
<p>本文原于<a href="http://www.programmer.com.cn/"><font color=#3d81ee>《程序员》</font></a>2010年8月刊揭载。</p><img src ="http://www.cppblog.com/mzty/aggbug/126964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2010-09-18 10:07 <a href="http://www.cppblog.com/mzty/archive/2010/09/18/126964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lnuix/Unix上C++开发使用啥工具</title><link>http://www.cppblog.com/mzty/archive/2010/04/15/112686.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 15 Apr 2010 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2010/04/15/112686.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/112686.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2010/04/15/112686.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/112686.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/112686.html</trackback:ping><description><![CDATA[<br><br><br>你在liunx/Unix使用啥工具来开发C++呢？（我是新手望多指教） <br><br><br>调查如下：<a href="http://www.askform.cn/68163-74318.aspx">http://www.askform.cn/68163-74318.aspx</a><br><br>结果：<br><img border=0 alt="" src="http://images.cnblogs.com/cnblogs_com/itech/246265/r_cide.png" width=504 height=408><br><br><br>2天后撤下首页！谢谢支持！ <br><br>完！<img src ="http://www.cppblog.com/mzty/aggbug/112686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2010-04-15 17:08 <a href="http://www.cppblog.com/mzty/archive/2010/04/15/112686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++对象模型</title><link>http://www.cppblog.com/mzty/archive/2009/03/03/75456.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 03 Mar 2009 12:55:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2009/03/03/75456.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/75456.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2009/03/03/75456.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/75456.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/75456.html</trackback:ping><description><![CDATA[<p>C++对象模型系列，探索C++对象的内存布局。具体看: <a target="_blank"  href="http://www.cnblogs.com/itech/archive/2009/02/19/1394268.html">http://www.cnblogs.com/itech/archive/2009/02/19/1394268.html</a></p>
<p><br></p><img src ="http://www.cppblog.com/mzty/aggbug/75456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2009-03-03 20:55 <a href="http://www.cppblog.com/mzty/archive/2009/03/03/75456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>本博客转移到 ：http://www.cnblogs.com/itech/</title><link>http://www.cppblog.com/mzty/archive/2009/02/20/74378.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 20 Feb 2009 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2009/02/20/74378.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/74378.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2009/02/20/74378.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/74378.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/74378.html</trackback:ping><description><![CDATA[<br><br>本博客转移到 ：<a title="http://www.cnblogs.com/itech/"  href="http://www.cnblogs.com/itech/">http://www.cnblogs.com/itech/</a>
，谢谢继续捧场哦!<br><br><img src ="http://www.cppblog.com/mzty/aggbug/74378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2009-02-20 10:58 <a href="http://www.cppblog.com/mzty/archive/2009/02/20/74378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的异常[转载]</title><link>http://www.cppblog.com/mzty/archive/2009/01/13/71848.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 13 Jan 2009 01:42:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2009/01/13/71848.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/71848.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2009/01/13/71848.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/71848.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/71848.html</trackback:ping><description><![CDATA[<p>转自：http://www.cnblogs.com/CUCmehp/archive/2009/01/12/1374320.html<br></p>
<p><br></p>
C++函数后面后加到关键字throw(something)限制，是对这个函数的异常安全性作出限制。<br><br>void f() throw()&nbsp; 表示f不允许抛出任何异常，即f是异常安全的。<br><br>void f() throw(...) 表示f可以抛出任何形式的异常。<br><br>void f() throw(exceptionType); 表示f只能抛出exceptionType类型的异常。<br><br>引别人的一个笑话：<br><br>throw() 大概会说：&#8220;噢，不管你抛什么，就是不准抛。。&#8221;<br>throw(...) 呵呵一笑，满脸慈祥：&#8220;抛吧抛吧，尽情地抛吧。。。&#8221;<br>throw(type) 一听急了：&#8220;那可不行，要抛也只能抛我的香烟头，否则要是不小心把俺祖传的金戒指抛掉就太亏了。。。&#8221;<br><br>关于C++的异常传递有三种方法：<br><br>1.传值(by value)<br><br>传值的过程中会产生临时对象的拷贝，不能解决多态的问题，如下：myexception继承exception，但是但确无法被正确的调用myexception的方法，造成对异常对象的切割。<br><br>class myexception:public exception{<br>
public:<br>
&nbsp;&nbsp;&nbsp; virtual const char* what() throw();<br>
};<br>
const char* myexception::what(){<br>
&nbsp;&nbsp;&nbsp; return "myException";<br>
}<br>
class A{<br>
public:<br>
&nbsp;&nbsp;&nbsp; A(){}<br>
&nbsp;&nbsp;&nbsp; void f() throw(){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw myexception();<br>
&nbsp;&nbsp;&nbsp; }<br>
};<br>
int main(){<br>
&nbsp;&nbsp;&nbsp; A a;<br>
&nbsp;&nbsp;&nbsp; try{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.f();<br>
&nbsp;&nbsp;&nbsp; }catch(exception exc){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;exc.what();<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br><br>运行结果：UnKnown exceptions<br><br>程序执行是会调用exception的what方法，而不是myexception的what方法。<br><br>2.传指针(by pointer)<br><br>指针可以实现多态，但往往会将临时对象的地址作为指针传出去，出现悬挂指针错误。如果在堆上分配内存空间，又往往不知道何时删除对象，出现to be or not to be的错误。<br><br>&nbsp; 结果显示：myException<br>Code<br>class myexception:public exception{<br>public:<br>&nbsp;&nbsp;&nbsp; virtual const char * what() const;<br>};<br>const char* myexception::what() const{<br>&nbsp;&nbsp;&nbsp; return "myException";<br>}<br>class A{<br>public:<br>&nbsp;&nbsp;&nbsp; A(){}<br>&nbsp;&nbsp;&nbsp; void f() throw(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new myexception();<br>&nbsp;&nbsp;&nbsp; }<br>};<br>int main(){<br>&nbsp;&nbsp;&nbsp; A a;<br>&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.f();<br>&nbsp;&nbsp;&nbsp; }catch(exception* pexc){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;pexc-&gt;what();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete pexc;<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>&nbsp;<br><br>3.传引用(by reference)<br><br>传引用是最好的方法，可以克服前面的两个问题。<br><br>程序结果显示:myException<br><br>Code<br>class myexception:public exception{<br>public:<br>&nbsp;&nbsp;&nbsp; virtual const char * what() const;<br>};<br>const char* myexception::what() const{<br>&nbsp;&nbsp;&nbsp; return "myException";<br>}<br>class A{<br>public:<br>&nbsp;&nbsp;&nbsp; A(){}<br>&nbsp;&nbsp;&nbsp; void f() throw(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw myexception();<br>&nbsp;&nbsp;&nbsp; }<br>};<br>int main(){<br>&nbsp;&nbsp;&nbsp; A a;<br>&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.f();<br>&nbsp;&nbsp;&nbsp; }catch(exception&amp; exc){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;exc.what();<br>&nbsp;&nbsp;&nbsp; }<br>}<img src ="http://www.cppblog.com/mzty/aggbug/71848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2009-01-13 09:42 <a href="http://www.cppblog.com/mzty/archive/2009/01/13/71848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google Chrome Source Code 源码下载（转载）</title><link>http://www.cppblog.com/mzty/archive/2008/09/16/62004.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 16 Sep 2008 13:00:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/09/16/62004.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/62004.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/09/16/62004.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/62004.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/62004.html</trackback:ping><description><![CDATA[<br>转载来自：<a  href="http://www.xiaohui.com/">http://www.XiaoHui.com</a><br><br>Goolgle 于 2008.09.02 <a  href="http://www.xiaohui.com/dev/server/20080903-google-chrome.htm">发布了浏览器 Google Chrome</a>。Google Chrome 使用的<strong>内核源码</strong>来自<a  href="http://www.xiaohui.com/dev/server/20080903-webkit-opensource-project.htm">开源浏览器引擎 WebKit Open Source Project</a>。Google Chrome 的源码，同样亦是开源的。在 <a  href="http://googlechinablog.com/2008/09/chromium.html" target="_blank" class="external">Google 的中文官方 Blog － Google 黑板报</a>中，提到：
<p>QUOTE: <em>我们对很多开发开源项目的人心存感激，我们承诺会沿着前人的路继续前行。 我们借鉴了一些源自 Apple WebKit
和 Mozilla Firefox 的技术，怀着同样开源的精神，谷歌浏览器所有的代码全部开源。我们希望能与整个业界合作从而促进互联网的健康发展。</em></p>
<p>　　目前 <strong>Google Chrome 源码</strong>已经公布了，有兴趣的<strong>软件开发者</strong>、<strong>程序员</strong>可以从 chromium.org 服务器使用 SVN checkout <strong>Google Chrome Source Code</strong>，自定义自己的浏览器。 </p>
<h2>Google Chrome 源码下载地址 (Google Chrome Source Code Download)</h2>
<p>　　地址： <a  href="http://www.xiaohui.com/dev/vccool/internet/google-chrome-source-code-download.htm">http://www.xiaohui.com/dev/vccool/internet/google-chrome-source-code-download.htm</a></p>
<p>　　1. <strong>Google Chrome 源码 SVN 地址</strong>：<a  href="http://src.chromium.org/svn" target="_blank" class="external">http://src.chromium.org/svn</a>。包含有 Chrome、Gears、Webkit、GCC 等源码以及编译依赖工具。Chrome 浏览器项目的源码，位于目录 <a  href="http://src.chromium.org/svn/trunk/src/chrome/" target="_blank" class="exnternal">http://src.chromium.org/svn/trunk/src/chrome/</a></p>
<p>　　2. <strong>Google Chrome 源码 Web 浏览地址</strong>：<a  href="http://src.chromium.org/viewvc/" target="_blank" class="external">http://src.chromium.org/viewvc/</a></p>
<p>　　3. <strong>Google Chrome 所使用的 JavaScript V8 的源码下载地址</strong>：<a  href="http://code.google.com/p/v8/" target="_blank" class="external">http://code.google.com/p/v8/</a></p>
<h2>Google Chrome 源码下载相关资源</h2>
<ul>
    <li>站内文章：<a  href="http://www.xiaohui.com/dev/server/20080903-webkit-opensource-project.htm">Google Chrome 的内核引擎 WebKit 介绍</a> - WebKit Open Source Project</li>
    <li>站内文章：<a  href="http://www.xiaohui.com/dev/server/20080903-google-chrome.htm">Google 浏览器 Google Chrome 最新试用手记</a> - 第一时间试用 Google Chrome 的感受</li>
    <li>外部连接：<a  href="http://webkit.org/" target="_blank" class="external">WebKit.org</a> - WebKit Open Source Project</li>
    <li>外部连接：<a  href="http://www.osxcn.com/apple/installing-and-running-webkit-in-linux.html" target="_blank" class="external">在 Linux 上使用 WebKit 引擎浏览器</a> - 来自 Nicky's Blog 的文章</li>
    <li>外部链接：<a  href="http://googlechinablog.com/2008/09/chromium.html" target="_blank" class="external">Google 官方 Blog 的文章</a> - 谷歌浏览器（Google Chrome）, Chromium 以及竞争</li>
    <li>外部链接：<a  href="http://googlechinablog.com/2008/09/blog-post_02.html" target="_blank" class="external">Google 官方 Blog 的文章</a> - 浏览器的新视角</li>
    <li>外部链接：<a  href="http://www.chromefans.org/chrome-themes/" target="_blank" class="external" title="Free download the google themes to enhance your chrome browser">Google Chrome Themes</a> - 下载 Google Chrome Themes </li>
</ul>
<br><br><img src ="http://www.cppblog.com/mzty/aggbug/62004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-09-16 21:00 <a href="http://www.cppblog.com/mzty/archive/2008/09/16/62004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《windows via C++》之windows线程同步</title><link>http://www.cppblog.com/mzty/archive/2008/07/29/57470.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 29 Jul 2008 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/07/29/57470.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/57470.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/07/29/57470.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/57470.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/57470.html</trackback:ping><description><![CDATA[<p><br>来自：梦在天涯C++博客(<a href="http://www.cppblog.com/mzty/">http://www.cppblog.com/mzty/</a>)</p>
<p>一 线程</p>
<p>1）如果你正在编写C/C++代码，决不应该调用CreateThread。相反，应该使用VisualC++运行期库函数_beginthreadex，退出也应该使用_endthreadex。如果不使用Microsoft的VisualC++编译器，你的编译器供应商有它自己的CreateThred替代函数。不管这个替代函数是什么，你都必须使用。</p>
<p><br>2）因为_beginthreadex和_endthreadex是CRT线程函数，所以必须注意编译选项runtimelibaray的选择，使用MT或MTD。</p>
<p>3) _beginthreadex函数的参数列表与CreateThread函数的参数列表是相同的，但是参数名和类型并不完全相同。这是因为Microsoft的C/C++运行期库的开发小组认为，C/C++运行期函数不应该对Windows数据类型有任何依赖。_beginthreadex函数也像CreateThread那样，返回新创建的线程的句柄。</p>
<p>4）下面是关于_beginthreadex的一些要点：</p>
<p>&#8226;每个线程均获得由C/C++运行期库的堆栈分配的自己的tiddata内存结构。（tiddata结构位于Mtdll.h文件中的VisualC++源代码中）。</p>
<p>&#8226;传递给_beginthreadex的线程函数的地址保存在tiddata内存块中。传递给该函数的参数也保存在该数据块中。</p>
<p>&#8226;_beginthreadex确实从内部调用CreateThread，因为这是操作系统了解如何创建新线程的唯一方法。</p>
<p>&#8226;当调用CreatetThread时，它被告知通过调用_threadstartex而不是pfnStartAddr来启动执行新线程。还有，传递给线程函数的参数是tiddata结构而不是pvParam的地址。</p>
<p>&#8226;如果一切顺利，就会像CreateThread那样返回线程句柄。如果任何操作失败了，便返回NULL。</p>
<p>5) _endthreadex的一些要点：</p>
<p>&#8226;C运行期库的_getptd函数内部调用操作系统的TlsGetValue函数，该函数负责检索调用线程的tiddata内存块的地址。</p>
<p>&#8226;然后该数据块被释放，而操作系统的ExitThread函数被调用，以便真正撤消该线程。当然，退出代码要正确地设置和传递。</p>
<p>6) 虽然也提供了简化版的的_beginthread和_endthread，但是可控制性太差，所以一般不使用。</p>
<p>6）线程handle因为是内核对象，所以需要在最后close handle。</p>
<p>7）C++主线程的终止，同时也会终止所有主线程创建的子线程，不管子线程有没有执行完毕。</p>
<p>8）如果某线程挂起，然后有调用WaitForSingleObject等待该线程，就会导致死锁。</p>
<p>二 线程同步之Critical Sections</p>
<p>1） 因为Critical Sections不是内核对象，所以只能用来同一进程内线程间的同步，不能用来多个不同进程间的线程的同步。</p>
<p>2） 如果在Critical Sections中间突然程序crash或是exit而没有调用LeaveCriticalSection，则结果是该线程所对应的内核不能被释放，该线程成为死线程。</p>
<p>3） 要比其他的内核对象的速度要快。</p>
<p>4）很好的封装：</p>
<p>class CritSect<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; friend class Lock;<br>&nbsp;&nbsp;&nbsp; CritSect() { InitializeCriticalSection(&amp;_critSection); }<br>&nbsp;&nbsp;&nbsp; ~CritSect() { DeleteCriticalSection(&amp;_critSection); }<br>private:<br>&nbsp;&nbsp;&nbsp; void Acquire(){EnterCriticalSection(&amp;_critSection);}<br>&nbsp;&nbsp;&nbsp; void Release(){LeaveCriticalSection(&amp;_critSection);}</p>
<p>&nbsp;&nbsp;&nbsp; CRITICAL_SECTION _critSection;<br>};</p>
<p>class Lock<br>{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp; Lock(CritSect&amp; critSect):_critSect(critSect) {&nbsp;&nbsp;&nbsp; _critSect.Acquire(); }<br>&nbsp;&nbsp;&nbsp;&nbsp; ~Lock(){_critSect.Release();}<br>private:<br>&nbsp;&nbsp;&nbsp; CritSect&amp; _critSect;<br>};<br>调用：CritSect sect;Lock lock(sect);</p>
<p>三 线程同步之Mutex<br>&nbsp;&nbsp;&nbsp; <br>1）互斥对象（mutex）内核对象能够确保线程拥有对单个资源的互斥访问权。实际上互斥对象是因此而得名的。互斥对象包含一个使用数量，一个线程ID和一个递归计数器。<br>&nbsp;2） 互斥对象的行为特性与关键代码段相同，但是互斥对象属于内核对象，而关键代码段则属于用户方式对象。这意味着互斥对象的运行速度比关键代码段要慢。但是这也意味着不同进程中的多个线程能够访问单个互斥对象，并且这意味着线程在等待访问资源时可以设定一个超时值。</p>
<p>&nbsp;3） ID用于标识系统中的哪个线程当前拥有互斥对象，递归计数器用于指明该线程拥有互斥对象的次数。</p>
<p>&nbsp;4） 互斥对象有许多用途，属于最常用的内核对象之一。通常来说，它们用于保护由多个线程访问的内存块。如果多个线程要同时访问内存块，内存块中的数据就可能遭到破坏。互斥对象能够保证访问内存块的任何线程拥有对该内存块的独占访问权，这样就能够保证数据的完整性。</p>
<p>5）互斥对象的使用规则如下：</p>
<p>&#8226; 如果线程ID是0（这是个无效ID），互斥对象不被任何线程所拥有，并且发出该互斥对象的通知信号。</p>
<p>&#8226; 如果ID是个非0数字，那么一个线程就拥有互斥对象，并且不发出该互斥对象的通知信号。</p>
<p>&#8226; 与所有其他内核对象不同， 互斥对象在操作系统中拥有特殊的代码，允许它们违反正常的规则。</p>
<p><br>四 线程同步之Event</p>
<p>1）在所有的内核对象中，事件内核对象是个最基本的对象。它们包含一个使用计数（与所有内核对象一样），一个用于指明该事件是个自动重置的事件还是一个人工重置的事件的布尔值，另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。 </p>
<p>2）事件能够通知一个操作已经完成。有两种不同类型的事件对象。一种是人工重置的事件，另一种是自动重置的事件。当人工重置的事件得到通知时，等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时，等待该事件的线程中只有一个线程变为可调度线程。 </p>
<p>3）当一个线程执行初始化操作，然后通知另一个线程执行剩余的操作时，事件使用得最多。事件初始化为未通知状态，然后，当该线程完成它的初始化操作后，它就将事件设置为已通知状态。这时，一直在等待该事件的另一个线程发现该事件已经得到通知，因此它就变成可调度线程。</p>
<p>&nbsp;4）Microsoft为自动重置的事件定义了应该成功等待的副作用规则，即当线程成功地等待到该对象时，自动重置的事件就会自动重置到未通知状态。这就是自动重置的事件如何获得它们的名字的方法。通常没有必要为自动重置的事件调用ResetEvent函数，因为系统会自动对事件进行重置。但是，Microsoft没有为人工重置的事件定义成功等待的副作用，所以需要调用ResetEvent()。<br><br></p>
<p>五 线程同步之信号量（Semaphore）<br></p>
<p>信号量（Semaphore）内核对象对线程的同步方式与前面几种方法不同，它允许多个线程在同一时刻访问同一资源，但是需要限制在同一时刻访问此资源的最大线程数目。在用 CreateSemaphore（）创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数，每增加一个线程对共享资源的访问，当前可用资源计数就会减1，只要当前可用资源计数是大于0的，就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目，不能在允许其他线程的进入，此时的信号量信号将无法发出。线程在处理完共享资源后，应在离开的同时通过 ReleaseSemaphore（）函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。</p>
<p>使用信号量内核对象进行线程同步主要会用到CreateSemaphore（）、OpenSemaphore（）、ReleaseSemaphore（）、 WaitForSingleObject（）和WaitForMultipleObjects（）等函数。<br><br>六 线程同步之其他</p>
<p>1）线程局部存储 （TLS），同一进程中的所有线程共享相同的虚拟地址空间。不同的线程中的局部变量有不同的副本，但是static和globl变量是同一进程中的所有线程共享的。使用TLS技术可以为static和globl的变量，根据当前进程的线程数量创建一个array，每个线程可以通过array的index来访问对应的变量，这样也就保证了static和global的变量为每一个线程都创建不同的副本。</p>
<p>2）互锁函数的家族十分的庞大，例如InterlockedExchangeAdd（）。。。，使用互锁函数的优点是：他的速度要比其他的CriticalSection,Mutex,Event,Semaphore快很多。</p>
<p>3）等待函数，例如WaitForSingleObject 函数用来检测 hHandle 事件的信号状态，当函数的执行时间超过 dwMilliseconds 就返回，但如果参数 dwMilliseconds 为 INFINITE 时函数将直到相应时间事件变成有信号状态才返回，否则就一直等待下去，直到 WaitForSingleObject 有返回直才执行后面的代码。</p>
<p>六 《Windows核心编程（英文版&#183;第5版）》<br>最好的windows多线程编程参考，更多更详细请看原书。</p><img src ="http://www.cppblog.com/mzty/aggbug/57470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-07-29 22:54 <a href="http://www.cppblog.com/mzty/archive/2008/07/29/57470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超越 C++ 下一代 C++ — C++/CLI简介（转载）</title><link>http://www.cppblog.com/mzty/archive/2008/07/18/56536.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 18 Jul 2008 14:28:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/07/18/56536.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/56536.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/07/18/56536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/56536.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/56536.html</trackback:ping><description><![CDATA[<span class=a14c id=zoom>&nbsp;<br>
<p><strong>一、绪论</strong>
<p>当微软推出VS.NET7实现了可扩展的托管C++后，C++程序员们反映不一。尽管大部分的程序员对于能够继续使用C++感到很欣慰，但几乎所有的人对于托管C++提供的晦涩语法感到很痛苦。微软明显从反馈中感觉到托管C++不是那么成功。
<p>2003年10月6日，ECMA（欧洲计算机制造商协会）宣布成立专家组，负责结合ISO标准C++与通用语言，开发一个可扩展语言的标准，这个新的可扩展语言被称为C++/CLI标准。这个标准将被VS.NET2005的C++编译器支持。
<p><strong>二、老语法存在的问题</strong>
<p>1、晦涩繁琐的语法和文法--这两个"双重底线"问题加重了阅读的负担。
<p>2、二流的CLI支持--相对与C#与VB.NET，MC++使用不方便的工作区来提供CLI支持，例如，它没有一个一一对应的结构来列举.NET的集合。
<p>3、C++与.NET粗陋地结合--对于CLI类型，你不能使用C++的特色，例如模板；同样，对于C++类型，你不能使用CLI的特色，例如碎片帐集。
<p>4、令人混淆的指针--非托管的C++的指针及托管的引用指针都使用*语法，这非常令人混淆，因为-gc指针与托管指针在本质和行为上完全不同。
<p>5、MFC编译器不能产生可校验的代码。
<p><strong>三、C++/CLI给我们提供了什么？</strong>
<p>1、优雅流畅的语法和文法--C++/CLI为C++开发人员书写托管代码提供了一种非常自然的感觉，并且它提供了非托管代码到托管代码的平滑过度。以前所谓的"双重底线"问题现在已经荡然无存。
<p>2、一流的CLI支持--CLI特色，例如属性、碎片集合和属类得到了直接支持，此外，C++/CLI还准许将这些特色用于本地非托管的类。
<p>3、一流的C++类支持--C++特色，例如模板和析构函数对于拖管和非拖管类继续有效。实际上，C++/CLI是你可以"表面上"在栈或C++本地堆上声明一个.NET类型唯一的.NET语言。
<p>4、在.NET与C++之间的沟壑上架起了一座桥梁--C++开发人员在抨击BCL时不再象离开水的鱼。
<p>5、C++/CLI编译器产生的可执行文件完全是可校验的。
<p><strong>四、"Hello World"小程序</strong>
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>using namespace System;
            void _tmain()
            {
            Console::WriteLine("Hello World");
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>上述代码除了不需要引用mscorlib.dll库外，与老的语法没有太大的区别，因为无论你什么时候使用/clr进行编辑，编译器都可以暗中进行引用（现在默认的是/clr:newSyntax）。
<p><strong>五、句柄</strong>
<p>与老的语法主要的混淆是我们习惯于使用*符号来声明拖管引用或非拖管指针，在C++/CLI里微软引入了句柄的概念。
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>void _tmain()
            {
            //The ^ punctuator represents a handle
            String^ str = "Hello World";
            Console::WriteLine(str);
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>^符号代表一个托管对象（声明时看上去象个帽子），按照CLI的规定，句柄代表一个拖管对象的引用。句柄在CLI中是新的语法，相当于C++中的-gc指针。句柄与指针不再混淆，在本质上两者完全不同。
<p><strong>六、句柄与指针是怎样区分开来的？</strong>
<p>1、指针声明时使用*符号，而句柄使用^符号。
<p>2、句柄是针对拖管堆上对象的拖管引用，而指针仅仅指向内存中的一个地址。
<p>3、指针很稳定，GC循环不会影响到它；句柄在基于GC或内存紧张的情况下，可以指向不同的内存位置。
<p>4、对于指针，程序开发人员必须"显式"地删除，否则会面临泄露的危险，而对于句柄，是否进行显式删除则完全根据程序人员的爱好了。
<p>5、句柄一定要指向一个具体的类型，即所谓的类型安全性，而指针明显不是这样，你决不可以将一个句柄指向Void^类型。
<p>6、正如new操作符返回一个指针一样，gcnew返回一个句柄。
<p><strong>七、CLR对象示例</strong>
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>void _tmain()
            {
            String^ str = gcnew String("Hello World");
            Object^ o1 = gcnew Object();
            Console::WriteLine(str);
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>关键字gcnew用来实例化一个CLI对象，而且它返回一个指向在CLR堆上的对象的句柄，gcnew的优点在于它可以方便的让我们区分拖管和非拖管的实例对象。
<p>大部分情况下，gcnew关键字和^操作符提供了你用来进行BCL的一切手段，但是很明显你需要创建和声明属于自己的拖管类和接口。
<p><strong>八、声明类型 </strong>
<p>CLR类型有一个形容词前缀用来说明类型的种类，下面是C++/CLI中的类型声明示例：
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>1、 CLR types
            o Reference types
            &#167; ref class RefClass;
            &#167; ref struct RefClass;
            2、 Value types
            &#167; value class ValClass;
            &#167; value struct ValClass;
            o Interfaces
            &#167; interface class IType;
            &#167; interface struct IType;
            o Enumerations
            &#167; enum class Color;
            &#167; enum struct Color;
            3、 Native types
            o class Native;
            o struct Native;
            示例：
            using namespace System;
            interface class IDog
            {
            void Bark();
            };
            ref class Dog : IDog
            {
            public:
            void Bark()
            {
            Console::WriteLine("Bow wow wow");
            }
            };
            void _tmain()
            {
            Dog^ d = gcnew Dog();
            d-&gt;Bark();
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>上述程序中的代码与老的C++语言相比看上去非常简洁，在以往的C++代码中，至少要用到-gc和-interface这两个关键词。
<p><strong>九、装箱/拆箱操作</strong>
<p>在C++/CLI中，加箱是隐含的，而且类型是安全的，一个二进制的拷贝被执行并在CLR堆上形成一个对象，去箱是显式的，仅仅需要使用reinterpret_cast操作符来解除引用。
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>void _tmain()
            {
            int z = 44;
            Object^ o = z; //implicit boxing
            int y = *reinterpret_cast&lt;int^&gt;(o); //unboxing
            Console::WriteLine("  ",o,z,y);
            z = 66;
            Console::WriteLine("  ",o,z,y);
            }
            // 输出结果如下：
            // 44 44 44
            // 44 66 44</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>在上述代码中，"o"对象是一个加箱的拷贝，从第二个语句Console::WriteLine.的输出可以很明显地看到，它并没有涉及到int类型的整数值。
<p>当你对一种数值类型进行加箱操作时，返回的对象记住了最初的数值类型。
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>void _tmain()
            {
            int z = 44;
            float f = 33.567;
            Object^ o1 = z;
            Object^ o2 = f;
            Console::WriteLine(o1-&gt;GetType());
            Console::WriteLine(o2-&gt;GetType());
            }
            // Output
            // System.Int32
            // System.Single</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>因此不能对不同类型的对象进行去箱操作。
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>void _tmain()
            {
            int z = 44;
            float f = 33.567;
            Object^ o1 = z;
            Object^ o2 = f;
            int y = *reinterpret_cast&lt;int^&gt;(o2);//System.InvalidCastException
            float g = *reinterpret_cast&lt;float^&gt;(o1);//System.InvalidCastException
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>如果你非尝试这么做，那么你将得到一个System.InvalidCastException。让我们来探讨一下完美的类型安全性，如果你要看内部代码，你将看到微软的内部箱在实际中的运用。例如：
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>void Box2()
            {
            float y=45;
            Object^ o1 = y;
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>编译后的代码是：
<p><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>.maxstack 1
            .locals (float32 V_0, object V_1)
            ldnull
            stloc.1
            ldc.r4 45.
            stloc.0
            ldloc.0
            box [mscorlib]System.Single
            stloc.1
            ret</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr>
<p>根据微软的内部文档，箱操作将未加工的类型转换为一个具体类型的实例，这项工作的完成通过创建一个新的对象并将数据拷贝到这个新分配的对象。
<p><strong>十、写在后面的话</strong>
<p>为什么很多人已经可以使用C、C++、.NET来开发程序但还在积极学习C++/CLI呢，我想有四个方面的原因：
<p>1、从编译器直到内层都还在支持C++代码；
<p>2、C++/CLI对于其他标准来说无意是具有毁灭性地；
<p>3、与生俱来的内部支持胜过所有其他CLI语言
<p>4、所有在MFC中出现的下划线都已不再存在。</p>
</span><img src ="http://www.cppblog.com/mzty/aggbug/56536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-07-18 22:28 <a href="http://www.cppblog.com/mzty/archive/2008/07/18/56536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++/CLI：第一流的CLI语言(转载)</title><link>http://www.cppblog.com/mzty/archive/2008/07/18/56531.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 18 Jul 2008 14:12:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/07/18/56531.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/56531.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/07/18/56531.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/56531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/56531.html</trackback:ping><description><![CDATA[<h1 id=artibodyTitle>&nbsp;</h1>
<h1>C++/CLI：第一流的CLI语言 <br>2005-08-25 11:25 作者： 朱先忠编译 出处： 天极网 责任编辑：方舟 </h1>
<p><strong>1. 简介<br><br></strong>　　本文并不是为了奉承C++/CLI的辉煌，也不是为了贬低其它如C#或者VB.NET等语言，相反，这只是一个非官方的、以一个喜欢这种语言的非<a class=bluekey href="http://com.chinabyte.com/microsoft/" target=_blank><u><font color=#0000ff>微软</font></u></a>雇员身份来论证C++/CLI有它的自己的唯一的角色，可作为第一流的.NET编程语言。<br><br>　　一个不断在新闻组和技术论坛上出现的问题是，当象C#和VB.NET这样的语言更适合于这种用途时，为什么要使用C++来开发.NET应用<a class=bluekey href="http://product.yesky.com/software/" target=_blank><u><font color=#0000ff>软件</font></u></a>。通常这样一些问题后面的评论说是，C++语法是怎样的复杂和令人费解，C++现在是怎样一种过时的语言，还有什么VS.NET<a class=bluekey href="http://design.yesky.com/" target=_blank><u><font color=#0000ff>设计</font></u></a>者已不再像支持C#和VB.NET一样继续支持C++。其中一些猜疑是完全荒谬的，但有些说法部分正确。希望本文有助于澄清所有这些围绕C++/CLI语言及其在VS.NET语言层次中的地位的疑惑，神秘和不信任。请记住，本作者既不为微软工作也没有从微软那里取得报酬，只是想从技术上对C++/CLI作一评判。<br><br>　　<strong>2. 快速简洁的本机interop</strong><br><br>　　除了P/Invoke机制可用在另外的象C#或VB.NET这样的语言外，C++提供了一种独有的interop机制，称作C++ interop。C++ interop比P/Invoke直观得多，因为你只是简单地#include需要的头文件，并与需要的库进行链接就能象在本机C++中一样调用任何函数。另外，它比P/Invoke速度快--这是很容易能证明的。现在，可争辩的是在实际应用软件的开发中，经由C++ interop获得的性能好处与花在用户接口交互、数据库存取、<a class=bluekey href="http://product.yesky.com/net/" target=_blank><u><font color=#0000ff>网络</font></u></a>数据转储、复杂数学算法等方面的时间相比可以被忽略，但是事实是在有些情况下，甚至通过每次interop调用节省的几个纳秒也能给全局应用<a class=bluekey href="http://dev.yesky.com/" target=_blank><u><font color=#0000ff>程序</font></u></a>性能/响应造成巨大影响，这是绝对不能被忽视的。下面有两部分代码片断(一个是使用P/Invoke机制的C#程序，一个是使用C++ Interop机制的C++程序)，我分别记录了其各自代码重复执行消耗的时间(毫秒)。不管你如何解释这些数据，不管这会对你的应用程序产生什么影响，全是你的事。我仅打算事实性地指出，C++代码的执行速度要比C#(其中使用了较多的本机interop调用)快。<br><br>　　1) C#程序(使用P/Invoke)<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>[SuppressUnmanagedCodeSecurity] <br>[DllImport("kernel32.dll")]<br>static extern uint GetTickCount();<br>[SuppressUnmanagedCodeSecurity] <br>[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]<br>static extern uint GetWindowsDirectory(<br>[Out] StringBuilder lpBuffer, uint uSize);<br>static void Test(int x)<br>{<br>StringBuilder sb = new StringBuilder(512);<br>for (int i = 0; i &lt; x; i++)<br>GetWindowsDirectory(sb, 511);<br>}<br>static void DoTest(int x)<br>{<br>uint init = GetTickCount();<br>Test(x);<br>uint tot = GetTickCount() - init;<br>Console.WriteLine("Took {0} milli-seconds for {1} iterations",tot, x);<br>}<br>static void Main(string[] args)<br>{<br>DoTest(50000);DoTest(500000);DoTest(1000000);DoTest(5000000);<br>Console.ReadKey(true);<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　2) C++程序(使用C++ Interop)<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>void Test(int x)<br>{<br>TCHAR buff[512];<br>for(int i=0; i&lt;x; i++)<br>GetWindowsDirectory(buff, 511);<br>}<br>void DoTest(int x)<br>{<br>DWORD init = GetTickCount();<br>Test(x);<br>DWORD tot = GetTickCount() - init;<br>Console::WriteLine("Took {0} milli-seconds for {1} iterations",tot, x);<br>}<br>int main(array&lt;System::String ^&gt; ^args)<br>{ <br>DoTest(50000);DoTest(500000);DoTest(1000000);DoTest(5000000);<br>Console::ReadKey(true);<br>return 0;<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　3) 速度比较<br><br>
<table cellSpacing=0 cellPadding=2 width="90%" align=center border=1>
    <tbody>
        <tr>
            <td>重复次数 </td>
            <td>C# 程序</td>
            <td>C++程序</td>
        </tr>
        <tr>
            <td>50,000</td>
            <td>61 </td>
            <td>10</td>
        </tr>
        <tr>
            <td>500,000</td>
            <td>600 </td>
            <td>70</td>
        </tr>
        <tr>
            <td>1,000,000</td>
            <td>1162</td>
            <td>140</td>
        </tr>
        <tr>
            <td>5,000,000</td>
            <td>6369</td>
            <td>721</td>
        </tr>
    </tbody>
</table>
　　 <br>　　其性能差别真是令人惊愕！这的确是说明为什么要使用C++/CLI的一个好理由，如果你在使用本机interop进行开发，那么性能！完全由于性能，我就将被迫借助本机interop来实现并非基于web的.NET应用程序。当然，为什么我想要使用.NET来开发需要大量本机interop技术的应用程序完全是另外一个问题。<br><br>　　如果你仍怀疑这种性能优势，有另外的理由来说明你为什么不得不使用C++/CLI而不是C#或VB.NET——源码膨胀！下面是一个C++函数的例子，它使用了IP帮助者API来枚举一台机器上的网络适配器并且列出与每个适配器相联系的所有IP地址。<br><br>　　4) 枚举n/w适配器的C++代码<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>void ShowAdapInfo()<br>{<br>PIP_ADAPTER_INFO pAdapterInfo = NULL;<br>ULONG OutBufLen = 0;<br>//得到需要的缓冲区大小<br>if(GetAdaptersInfo(NULL,&amp;OutBufLen)==ERROR_BUFFER_OVERFLOW)<br>{<br>int divisor = sizeof IP_ADAPTER_INFO;<br>#if _MSC_VER &gt;= 1400<br>if( sizeof time_t == 8 ) divisor -= 8;<br>#endif<br>pAdapterInfo = new IP_ADAPTER_INFO[OutBufLen/divisor];<br>//取得适配器信息<br>if( GetAdaptersInfo(pAdapterInfo, &amp;OutBufLen) != ERROR_SUCCESS )<br>{//调用失败 }<br>else <br>{<br>int index = 0;<br>while(pAdapterInfo)<br>{<br>Console::WriteLine(gcnew String(pAdapterInfo-&gt;Description));<br>Console::WriteLine("IP Address list : ");<br>PIP_ADDR_STRING pIpStr = &amp;pAdapterInfo-&gt;IpAddressList;<br>while(pIpStr)<br>{<br>Console::WriteLine(gcnew tring(pIpStr-&gt;IpAddress.String));<br>pIpStr = pIpStr-&gt;Next;<br>}<br>pAdapterInfo = pAdapterInfo-&gt;Next;<br>Console::WriteLine();<br>}<br>}<br>delete[] pAdapterInfo;<br>}<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　现在让我们看一个使用P/Invoke的C#版本。<br><br>　　5) 使用P/Invoke技术的C#版本<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>const int MAX_ADAPTER_NAME_LENGTH = 256;<br>const int MAX_ADAPTER_DESCRIPTION_LENGTH = 128;<br>const int MAX_ADAPTER_ADDRESS_LENGTH = 8;<br>const int ERROR_BUFFER_OVERFLOW = 111;<br>const int ERROR_SUCCESS = 0;<br>[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]<br>public struct IP_ADDRESS_STRING<br>{<br>[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]<br>public string Address;<br>}<br>[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]<br>public struct IP_ADDR_STRING<br>{<br>public IntPtr Next;<br>public IP_ADDRESS_STRING IpAddress;<br>public IP_ADDRESS_STRING Mask;<br>public Int32 Context;<br>}<br>[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]<br>public struct IP_ADAPTER_INFO<br>{<br>public IntPtr Next;<br>public Int32 ComboIndex;<br>[MarshalAs(UnmanagedType.ByValTStr, <br>SizeConst = MAX_ADAPTER_NAME_LENGTH + 4)]<br>public string AdapterName;<br>[MarshalAs(UnmanagedType.ByValTStr, <br>SizeConst = MAX_ADAPTER_DESCRIPTION_LENGTH + 4)]<br>public string AdapterDescription;<br>public UInt32 AddressLength;<br>[MarshalAs(UnmanagedType.ByValArray, <br>SizeConst = MAX_ADAPTER_ADDRESS_LENGTH)]<br>public byte[] Address;<br>public Int32 Index;<br>public UInt32 Type;<br>public UInt32 DhcpEnabled;<br>public IntPtr CurrentIpAddress;<br>public IP_ADDR_STRING IpAddressList;<br>public IP_ADDR_STRING GatewayList;<br>public IP_ADDR_STRING DhcpServer;<br>public bool HaveWins;<br>public IP_ADDR_STRING PrimaryWinsServer;<br>public IP_ADDR_STRING SecondaryWinsServer;<br>public Int32 LeaseObtained;<br>public Int32 LeaseExpires;<br>}<br>[DllImport("iphlpapi.dll", CharSet = CharSet.Ansi)]<br>public static extern int GetAdaptersInfo(IntPtr pAdapterInfo, ref int pBufOutLen);<br>static void ShowAdapInfo()<br>{<br>int OutBufLen = 0; <br>//得到需要的缓冲区大小<br>if( GetAdaptersInfo(IntPtr.Zero, ref OutBufLen) == <br>ERROR_BUFFER_OVERFLOW )<br>{<br>IntPtr pAdapterInfo = Marshal.AllocHGlobal(OutBufLen); <br>//取得适配器信息<br>if( GetAdaptersInfo(pAdapterInfo, ref OutBufLen) != ERROR_SUCCESS )<br>{ //调用失败了 }<br>else{<br>while(pAdapterInfo != IntPtr.Zero)<br>{<br>IP_ADAPTER_INFO adapinfo = <br>(IP_ADAPTER_INFO)Marshal.PtrToStructure(<br>pAdapterInfo, typeof(IP_ADAPTER_INFO));<br>Console.WriteLine(adapinfo.AdapterDescription);<br>Console.WriteLine("IP Address list : ");<br>IP_ADDR_STRING pIpStr = adapinfo.IpAddressList;<br>while (true){<br>Console.WriteLine(pIpStr.IpAddress.Address);<br>IntPtr pNext = pIpStr.Next;<br>if (pNext == IntPtr.Zero)<br>break;<br>pIpStr = (IP_ADDR_STRING)Marshal.PtrToStructure(<br>pNext, typeof(IP_ADDR_STRING));<br>}<br>pAdapterInfo = adapinfo.Next;<br>Console.WriteLine(); <br>}<br>}<br>Marshal.FreeHGlobal(pAdapterInfo);<br>}<br>}</td>
        </tr>
    </tbody>
</table>
<br><br>3. 栈语义和确定性的析构<br><br>　　C++经由栈语义模仿给了我们确定性的析构。简言之，栈语义是Dispose模式的良好的语法替代品。但是它在语义上比C# using块语法更直观些。请看下列的C#和C++代码段（都做一样的事情-连接两个文件的内容并把它写到第三个文件中）。<br><br>　　1) C#代码--使用块语义<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>public static void ConcatFilestoFile(String file1, String file2, String outfile)<br>{<br>String str;<br>try{<br>using (StreamReader tr1 = new StreamReader(file1))<br>{<br>using (StreamReader tr2 = new StreamReader(file2))<br>{<br>using (StreamWriter sw = new StreamWriter(outfile))<br>{<br>while ((str = tr1.ReadLine()) != null)<br>sw.WriteLine(str);<br>while ((str = tr2.ReadLine()) != null)<br>sw.WriteLine(str);<br>}<br>}<br>}<br>}<br>catch (Exception e)<br>{ Console.WriteLine(e.Message); }<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　2) C++代码--栈语义<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>static void ConcatFilestoFile(String^ file1, String^ file2, String^ outfile)<br>{<br>String^ str;<br>try{<br>StreamReader tr1(file1);<br>StreamReader tr2(file2);<br>StreamWriter sw(outfile);<br>while(str = tr1.ReadLine())<br>sw.WriteLine(str);<br>while(str = tr2.ReadLine())<br>sw.WriteLine(str);<br>}<br>catch(Exception^ e)<br>{ Console::WriteLine(e-&gt;Message); }<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　C#代码与相等的C++ 代码相比不仅免不了冗长，而且using块语法让程序员自己明确地指定他想在哪儿调用Dispose（using块的结束处），而使用C++/CLI的栈语义，只需让编译器使用常规的范围规则来处理它即可。事实上，这使得在C#中修改代码比在C++中更乏味-作为一实例，让我们修改这些代码以便即使仅存在一个输入文件也能创建输出文件。请看下面修改后的C#和C++代码。<br><br>　　3) 修改后的C#代码<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>public static void ConcatFilestoFile(String file1, String file2, String outfile)<br>{<br>String str;<br>try{<br>using (StreamWriter sw = new StreamWriter(outfile))<br>{<br>try{<br>using (StreamReader tr1 = new StreamReader(file1))<br>{<br>while ((str = tr1.ReadLine()) != null)<br>sw.WriteLine(str);<br>}<br>}<br>catch (Exception) { }<br>using (StreamReader tr2 = new StreamReader(file2))<br>{<br>while ((str = tr2.ReadLine()) != null)<br>sw.WriteLine(str);<br>}<br>}<br>}<br>catch (Exception e){ }<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　把针对StreamWriter的using块放到顶层需要重新调整using块结构--这在上面情况下显然不是个大问题，但是对于实际开发中的修改，这可能是相当模糊的且易导致逻辑错误的。<br><br>　　4) 修改后的C++代码<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>static void ConcatFilestoFile(String^ file1, String^ file2, String^ outfile)<br>{<br>String^ str;<br>try{<br>StreamWriter sw(outfile);<br>try{<br>StreamReader tr1(file1); <br>while(str = tr1.ReadLine())<br>sw.WriteLine(str); <br>}<br>catch(Exception^){} <br>StreamReader tr2(file2); <br>while(str = tr2.ReadLine())<br>sw.WriteLine(str); <br>}<br>catch(Exception^){}<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　这样不是比在C#中的做更容易些吗？我恰好把StreamWriter声明移到了顶部并增加了一个额外的try块，就这些。甚至对于象在我的示例代码片断中的琐碎事情，如果所涉及的复杂性在C++中大大减少，那么，当你工作于更大的工程时你能想象使用栈语义对你的编码效率千万的影响。<br><br>　　还不确信？好，让我们看一下成员对象和它们的析构吧。Imagine CLI GC类R1和R2，二者都实现了Idisposable接口且都有函数F()，还有一个CLI GC类R，它有R1和R2成员和一个函数F()-它内部地调用R1和R2上的F()成员函数。让我们先看C#实现。<br><br>　　5) 一个disposable类继承层次的C#实现<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>class R1 : IDisposable{<br>public void Dispose() { }<br>public void F() { }<br>}<br>class R2 : IDisposable{<br>public void Dispose() { }<br>public void F() { }<br>}<br>class R : IDisposable{<br>R1 m_r1 = new R1();<br>R2 m_r2 = new R2();<br>public void Dispose() <br>{ <br>m_r1.Dispose();<br>m_r2.Dispose();<br>}<br>public void F() <br>{<br>m_r1.F();<br>m_r2.F();<br>}<br>public static void CallR()<br>{<br>using(R r = new R())<br>{r.F();}<br>}<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　这里有几件事情要做：必须为每个disposable 类手工实现IDisposable接口，对于具有成员R1和R2的类R，Dispose方法也需要调用成员类上的Dispose。现在让我们分析上面几个类的C++实现。<br><br>　　6) 等价的C++实现<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>ref class R1<br>{<br>public:<br>~R1(){}<br>void F(){}<br>};<br>ref class R2<br>{<br>public:<br>~R2(){}<br>void F(){}<br>};<br>ref class R<br>{<br>R1 m_r1;<br>R2 m_r2;<br>public:<br>~R(){}<br>void F()<br>{<br>m_r1.F();<br>m_r2.F();<br>}<br>static void CallR()<br>{<br>R r;<br>r.F();<br>}<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　注意，这里不再有手工的Idisposable接口实现(我们的类中仅建立了析构器)而且最好的部分--类R的析构器(Dispose方法)并没有在该类可能含有的可释放的成员上调用Dispose-它没有必要这样做，编译器自动为之生成所有的代码！ <br><br>4. 混合类型<br><br>　　我们知道，C++支持本机类型-总是如此；C++支持CLI类型-本文正是特别强调这一点；它还支持混合类型-具有CLI成员的本机类型和具有本机成员的CLI类型！请尽管考虑所有你能的可能需求。<br><br>　　注意，谈到Whidbey，混合类型实现还不完整；就我从Brandon，Herb和Ronald发表的材料的理解得知，存在这种相当酷的类型--统一模型，它将在Orcas中实现--你能够在本机C++堆上new/delete CLI类型，而且也能够在CLI堆上gcnew/delete本机类型。但既然这是Whidbey以后的东西，本文不讨论统一模型。<br><br>　　在我谈论你何时使用混合类型以前，我想向你说明什么是混合类型。如果你理解混合类型，请跳过下面几段。这里引用Brandon Bray的说法："一种混合类型，或者是本机类ref类（需要有对象成员），或者是通过声明或继承被分配在垃圾回收堆或本机堆上的。"因此如果你有一个托管类型或者有一个有托管成员的本机类型，你就有了一个混合类型。VC++ Whidbey不直接支持混合类型(统一类型模型是一种Whidbey之后的概念)，但是它给我们划定了实现混合类型的条件。让我们开始讨论包含托管成员的本机类型。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>ref class R<br>{<br>public:<br>void F(){}<br>//假定 non-trivial ctor/dtor<br>R(){}<br>~R(){}<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　在我的例子中，设想该托管类型R有一个non-trivial构造器和一个non-trivial析构器。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>class Native<br>{<br>private:<br>gcroot&lt;R^&gt; m_ref; <br>public:<br>Native():<br>m_ref(gcnew R()){} <br>~Native()<br>{ delete m_ref; }<br>void DoF()<br>{ m_ref-&gt;F(); }<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　既然，我不能在我的类中拥有一个R成员，我使用了gcroot模板类(在gcroot.h中声明，但是你要用"#include vcclr.h")，它包装了System::Runtime::InteropServices::GCHandle结构。它是个象类一样的灵敏指针，它重载了运算符-&gt;以返回用作模板参数的托管类型。因此在上面类中，我可以使用m_ref，就好象我已经声明它是R^，而且你能在DoF函数中看到这正在起作用。实际上你可以节省delete，这可以通过使用auto_gcroot(类似于std::auto_ptr，在msclr\auto_gcroot.h文件中声明)代替gcroot来实现。下面是一个更好些的使用auto_gcroot的实现。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>class NativeEx<br>{<br>private:<br>msclr::auto_gcroot&lt;R^&gt; m_ref; <br>public:<br>NativeEx() : m_ref(gcnew R()){}<br>void DoF()<br>{ m_ref-&gt;F(); }<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　下面让我们看相反的情形：一个CLI类的本机成员。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>ref class Managed<br>{<br>private:<br>Native* m_nat;<br>public:<br>Managed():m_nat(new Native()){ }<br>~Managed()<br>{ delete m_nat; }<br>!Managed()<br>{ delete m_nat;<br>#ifdef _DEBUG<br>throw gcnew Exception("Oh, finalizer got called!");<br>#endif<br>}<br>void DoF()<br>{ m_nat-&gt;DoF(); }<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　我不能定义一个Native对象来作为一个ref类成员，因此需要使用一个Native*对象来代替。我在构造器中new该Native对象，然后在析构器和finalizer中delete它。如果你运行该工程的调试版，在执行到finalizer时将抛出一个异常- 因此开发者可以马上添加一个对delete的调用或为他的CLI类型使用栈语义技术。奇怪的是，库开发小组没有建立一个gcroot的反向实现-但这不是个大问题，我们可以自己写。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>template&lt;typename T&gt; ref class nativeroot<br>{<br>T* m_t;<br>public:<br>nativeroot():m_t(new T){}<br>nativeroot(T* t):m_t(t){}<br>T* operator-&gt;()<br>{ return m_t; }<br>protected:<br>~nativeroot()<br>{ delete m_t; }<br>!nativeroot()<br>{<br>delete m_t;<br>#ifdef _DEBUG<br>throw gcnew Exception("Uh oh, finalizer got called!");<br>#endif<br>}<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　这仅是个相当简单的灵敏指针实现，就象一个负责本机对象分配/回收的ref类。不管怎样，借助nativeroot模板类，我们可以如下修改托管类：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>ref class ManagedEx<br>{<br>private:<br>nativeroot&lt;Native&gt; m_nat;<br>public:<br>void DoF()<br>{ m_nat-&gt;DoF(); }<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　好，关于混合类型的最大问题是什么呢？你可能问。最大问题是，现在你能混合使用你的MFC、ATL、WTL、STL代码仓库和.NET框架，并用可能的最直接的方式-只需写你的混合模式代码并编译实现!你可以建立在一个DLL库中建立MFC 类，然后建立一个.NET应用程序来调用这个DLL，还需要把.NET类成员添加到你的MFC类（也实现可以相反的情况）。<br><br>　　作为一例，设想你有一MFC对话框--它通过一个多行的编辑框接受来自用户的数据-现在，你有一新的要求-显示一个只读编辑框，它将显示当前在该多行编辑框中文本的md5哈希结果。你的队友正在悲叹他们将必须花费几个小时钻研crypto API，而你的上司在担忧你们可能必须要买一个第三方加密库；那正是你在他们面前树立形象的时候，你宣布你将在15分钟内做完这项任务。下面是解决的办法：<br><br>　　添加一个新的编辑框到你的对话框资源中，并且添加相应的DDX变量。选择/clr编译模式并且添加下列代码到你的对话框的头文件中： <br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>#include &lt;msclr\auto_gcroot.h&gt;<br>using namespace System::Security::Cryptography;</td>
        </tr>
    </tbody>
</table>
<br>　　使用auto_gcroot模板来声明一个MD5CryptoServiceProvider成员：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>protected:<br>msclr::auto_gcroot&lt;MD5CryptoServiceProvider^&gt; md5;</td>
        </tr>
    </tbody>
</table>
<br>　　在OnInitDialog过程中，gcnew MD5CryptoServiceProvider成员。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>md5 = gcnew MD5CryptoServiceProvider();</td>
        </tr>
    </tbody>
</table>
<br>　　并且为多行编辑框添加一个EN_CHANGE处理器：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>void CXxxxxxDlg::OnEnChangeEdit1()<br>{<br>using namespace System;<br>CString str;<br>m_mesgedit.GetWindowText(str);<br>array&lt;Byte&gt;^ data = gcnew array&lt;Byte&gt;(str.GetLength());<br>for(int i=0; i&lt;str.GetLength(); i++)<br>data[i] = static_cast&lt;Byte&gt;(str[i]);<br>array&lt;Byte&gt;^ hash = md5-&gt;ComputeHash(data);<br>CString strhash;<br>for each(Byte b in hash)<br>{<br>str.Format(_T("%2X "),b);<br>strhash += str;<br>}<br>m_md5edit.SetWindowText(strhash);<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　这里使用了混合类型：一个本机Cdialog派生类，该类含有一个MD5CryptoServiceProvider成员(CLI类型)。你可以轻易地试验相反的情况（如早期的代码片断已显示的）——可以建立一个Windows表单应用程序而且可能想利用一个本机类库--这不成问题，使用上面定义的模板nativeroot即可。<br><br>5. 托管模板<br><br>　　也许你对泛型的概念已很清楚了，它帮助你避免进入C++的模板梦魇，它是实现模板的最佳方式，等等。好，假设这些全部正确，C++/CLI支持泛型就象任何其它CLI语言一样-但是它有而其它一些CLI语言还没有的是它还支持托管模板-也就是模板化的ref和value类。如果你以前从未使用过模板，你不能一下欣赏这么多优点，但是如果你有模板使用背景而且你已发现了泛型中存在的可能限制你编码的方式，托管模板将会大大减轻你的负担。你能联合使用泛型和模板- 事实上有可能用一个托管类型的模板参数来实例化一个泛型类型(尽管相反的情形是不可能的，因为运行时刻实例化由泛型所用)。STL.NET (或STL/CLR)以后讨论，请很好地利用泛型和托管模板的混合编程吧。<br><br>　　泛型使用的子类型约束机制将防止你写出下面的代码：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>generic&lt;typename T&gt; T Add(T t1, T t2)<br>{ return t1 + t2; }</td>
        </tr>
    </tbody>
</table>
<br>　　编译错误：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>error C2676: binary &#8217;+&#8217; : &#8217;T&#8217; does not define this operator or a conversion to a type acceptable to the predefined operator</td>
        </tr>
    </tbody>
</table>
<br>　　现在请看相应的模板版本：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>template&lt;typename T&gt; T Add(T t1, T t2)<br>{ return t1 + t2; }</td>
        </tr>
    </tbody>
</table>
<br>　　那么就可以这样做：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>int x1 = 10, x2 = 20;<br>int xsum = Add&lt;int&gt;(x1, x2);</td>
        </tr>
    </tbody>
</table>
<br>　　还可以这样做：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>ref class R<br>{<br>int x; <br>public:<br>R(int n):x(n){}<br>R^ operator+(R^ r)<br>{ return gcnew R(x + r-&gt;x); }<br>};<br>//...<br>R^ r1 = gcnew R(10);<br>R^ r2 = gcnew R(20);<br>R^ rsum = Add&lt;R^&gt;(r1, r2);</td>
        </tr>
    </tbody>
</table>
<br>　　这在一个象int的本机类型以及一个ref类型(只要ref类型有一个+运算符)情况下都能工作良好。这个泛型缺点不是一个调试错误或缺陷-它是设计造成的。泛型的实例化是在运行时通过调用配件集实现的，因此编译器不能确知一特定操作能被施行于一个泛型参数，除非它匹配一个子类型约束，因此编译器在定义泛型时解决这个问题。当你使用泛型时的另外一个妨碍是，它不会允许你使用非类型参数。下列泛型类定义不会编译：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>generic&lt;typename T, int x&gt; ref class G{};</td>
        </tr>
    </tbody>
</table>
<br>　　编译错：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>error C2978: syntax error : expected &#8217;typename&#8217; or &#8217;class&#8217;; found type &#8217;int&#8217;; non-type parameters are not supported in generics</td>
        </tr>
    </tbody>
</table>
<br>　　与托管模板相比较：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>template&lt;typename T, int x = 0&gt; ref class R{};</td>
        </tr>
    </tbody>
</table>
<br>　　如果你开始感激C++向你提供了泛型和托管模板，那么请看下面这一个例子： <br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>template&lt;typename T&gt; ref class R{<br>public:<br>void F()<br>{ Console::WriteLine("hey"); }<br>}; <br>template&lt;&gt; ref class R&lt;int&gt;<br>{<br>public:<br>void F()<br>{ Console::WriteLine("int"); }<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　你不能用泛型这样编码；否则，将产生：<br><br>　　编译错：error C2979: explicit specializations are not supported in generics<br><br>　　但可以在继承链中混合使用模板和泛型：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>generic&lt;typename T&gt; ref class Base<br>{<br>public:<br>void F1(T){}<br>};<br>template&lt;typename T&gt; ref class Derived : Base&lt;T&gt;<br>{<br>public:<br>void F2(T){}<br>};<br>//...<br>Derived&lt;int&gt; d;<br>d.F1(10);<br>d.F2(10);</td>
        </tr>
    </tbody>
</table>
<br>　　最后，你不能从一个泛型参数类型派生一个泛型类。<br><br>　　下列代码不会成功编译：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>generic&lt;typename T&gt; ref class R : T<br>{};</td>
        </tr>
    </tbody>
</table>
<br>　　error C3234: a generic class may not derive from a generic type parameter<br><br>　　模板让你这样做(好像你还不知道这些)：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>ref class Base{<br>public:<br>void F(){}<br>};<br>generic&lt;typename T&gt; ref class R : T<br>{};<br>//...<br>R&lt;Base&gt; r1;<br>r1.F();</td>
        </tr>
    </tbody>
</table>
<br>　　这样，当你下次遇到对泛型的贬谤时，你就知道该怎么做了。<br><br>　　6. STL/CLR<br><br>　　当大量使用STL的C++开发者转向.NET1/1.1时一定感觉非常别扭，他们中的许多可能会放弃并转回到原来的本机编码。从技术上讲，你能结合.NET类型(using gcroot)使用本机STL，但是产生的结果代码可能相当低效，更不用说是丑陋了：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>std::vector&lt; gcroot&lt;IntPtr&gt; &gt;* m_vec_hglobal;<br>//...<br>for each(gcroot&lt;IntPtr&gt; ptr in *m_vec_hglobal)<br>{ Marshal::FreeHGlobal(ptr);}</td>
        </tr>
    </tbody>
</table>
<br>　　大概VC++小组考虑到了这些并决定在Whidbey以后，他们会提供STL.NET（或STL/CLR）并可以单独从网上下载。<br><br>　　你可能问为什么？Stan Lippman，在他的MSDN文章(STL.NET Primer)中给出了3条原因：<br><br>　　&#183;可扩展性--STL设计把算法和容器隔离到自己的应用空间-也就是你可以有一组容器和一组算法，并且你能在任何一个容器上使用这些算法；同时你能在任何一个算法中使用这些容器。因此，如果你添加一种新的算法，你能在任何一种容器中使用它；同样，一个新的容器也可以与现有算法配合使用。<br><br>　　&#183;统一性--所有核心C++开发者集中在一起，汇集起他们精妙的STL专长，再使用他们的专长则轻车熟路。要较好地使用STL需要花费时间-然而一旦你掌握了它，你就有了在.NET世界中使用你的技巧的明显优势。不是吗？<br><br>　　&#183;性能--STL.NET通过使用实现泛型接口的托管模板实现。并且既然它的核心已用C++和托管模板编码，可以期盼它比在BCL上使用的泛型容器更具有性能优势。<br><br>　　使用过STL的人不需要任何示范，所以下面代码有益于以前没有使用过STL的人。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>vector&lt;String^&gt; vecstr;<br>vecstr.push_back("wally");<br>vecstr.push_back("nish");<br>vecstr.push_back("smitha");<br>vecstr.push_back("nivi");<br>deque&lt;String^&gt; deqstr;<br>deqstr.push_back("wally");<br>deqstr.push_back("nish");<br>deqstr.push_back("smitha");<br>deqstr.push_back("nivi");</td>
        </tr>
    </tbody>
</table>
<br>　　我使用了两个STL.NET容器-vector和deque，并装满两个容器，使其看起来相同(在两个容器中都使用了push_back)。现在，我将在两个容器上使用replace算法-我们再次看到，这些代码是很相同的。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>replace(vecstr.begin(), vecstr.end(),<br>gcnew String("nish"), gcnew String("jambo"));<br>replace(deqstr.begin(), deqstr.end(),<br>gcnew String("nish"), gcnew String("chris")); </td>
        </tr>
    </tbody>
</table>
<br>　　这里特别要注意的是我使用了"同样"的算法--replace并在两个不同STL容器上使用相同的函数调用。这是当Stan谈及"可扩展性"时的意思。下面我用一个简单函数来证明：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>template&lt;typename ForwardIterator&gt; void Capitalize(<br>ForwardIterator first，ForwardIterator end)<br>{<br>for(ForwardIterator it = first; it &lt; end; it++) <br>*it = (*it)-&gt;ToUpper(); <br>}</td>
        </tr>
    </tbody>
</table>
<br>　　它遍历一个System::String^容器并把其中的每个字符串转化为大写。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>Capitalize(vecstr.begin(), vecstr.end());<br>Capitalize(deqstr.begin(), deqstr.end());<br>for(vector&lt;String^&gt;::iterator it = vecstr.begin(); <br>it &lt; vecstr.end(); it++)<br>Console::WriteLine(*it);<br>Console::WriteLine();<br>for(deque&lt;String^&gt;::iterator it = deqstr.begin(); <br>it &lt; deqstr.end(); it++)<br>Console::WriteLine(*it);</td>
        </tr>
    </tbody>
</table>
<br>　　上面我的算法能够与vector和deque容器工作良好。至此，不再细谈；否则，guru站上的STL爱好者们会对我群起攻击，而非STL人可能感到厌烦。如果你还没使用过STL，可以参考有关资料。<br><br>7. 熟悉的语法<br><br>　　开发者经常迷恋他们所用的编程语言，而很少是出于实用的目的。还记得当微软宣布不再为VB6提供官方支持时，VB6人的反抗吗？非VB6人对此可能非常震惊，而老道的VB6人早已为他们的语言作好葬礼准备了。事实上，如果VB.NET从来没被发明，多数VB6人将会离开.NET，因为C#将会对他们非常陌生，而它的祖先就是C++。如今，许多VB.NET人可能已经转向了C#，但是他们不会从VB6直接转向C#；VB.NET起到一个桥梁作用让他们的思想脱离开原来VB6思想。相应地，如果微软仅发行VB.NET(而没有C#)，那么.NET可能成为了新的面向对象VB，且带有一个更大的类库-C++社团的人可能对此嗤之以鼻-他们甚至不会麻烦地检验.NET基础类库。为什么任何使用一种特定语言的开发者会对另外一个团体的使用另外开发语言的开发者嗤之以鼻？这不是我要回答的问题。--要回答该问题也许要先回答为什么有的人喜欢威士忌，有的人喜欢可口可乐，而还有人喜欢牛奶。所有我要说的是，对开发者来说，语法家族是个大问题。<br><br>　　你认为对于一个具有C++背景的人，下面的代码具有怎样的直觉性？<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>char[] arr =new char[128];</td>
        </tr>
    </tbody>
</table>
<br>　　他/她可能回答的第一件事是，方括号放错了位置。下面这句又如何？<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>int y=arr.Length;</td>
        </tr>
    </tbody>
</table>
<br>　　"呀!"-最可能的反映。现在把下面与前面相比较：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>char natarr[128];<br>array&lt;char&gt;^ refarr=gcnew array&lt;char&gt;(128);<br>int y=refarr-&gt;Length;</td>
        </tr>
    </tbody>
</table>
<br>　　请注意声明一个本机数组和一个托管数组时的语法区别。这里不同的模板形式的语法可视化地告诫开发者这一事实--refarr并不是典型的C++数组而且它可能是某种CLI类的派生物(事实上确是如此)，所以极有可能可以把方法和属性应用于它。<br><br>　　C#的finalizer语法最有可能引起转向C#的C++程序员的混淆。请看见下列C#代码：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>class R<br>{ ~R(){} }</td>
        </tr>
    </tbody>
</table>
<br>　　好，这样~R看起来象一个析构器但实际是个finalizer。为什么？请与下面的C++代码比较：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>ref class R<br>{<br>~R(){ }<br>!R(){ }<br>};</td>
        </tr>
    </tbody>
</table>
<br>　　这里~R是析构器（实际上等价于一个析构器的Dispose模式-但对C++人员来说，这它的行为象个析构器）而新的!R语法是为finalizer建立的-这样就不再有混淆而且语法看上去也与本机C++相匹配。<br><br>　　请看一下C#泛型语法：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>class R&lt;T&gt;{};</td>
        </tr>
    </tbody>
</table>
<br>　　再请看一下C++的语法：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>generic&lt;typename T&gt; ref class R{};</td>
        </tr>
    </tbody>
</table>
<br>　　曾经使用过模板的人马上就看出这种C++语法，而C#语法不能保证其没有混淆性且也不直观。我的观点是，如果你以前具有C++背景，C++/CLI语法将最贴近于你以前所用。C#(以及J#)看上去象C++，但是还有相当多的极为使人烦火的奇怪语义差别而且如果你没有完全放弃C++，语法差别将永远不停地带给你混乱和挫折。从这种意义上说，我认为VB.NET更好些，至少它有自己唯一的语法，所以那些共用C++和VB.NET的人不会产生语法混乱。<br><br>　　8. 结论<br><br>　　最后，至于你用什么语言编程，这可能依赖许多因素——如：你在学校学习的是什么语言，你是用什么语言开发的现有代码仓库，是否你的客户对你有具体的语言要求等。本文的主要目的是帮助你确定使用C++/CLI的几个明确的场所--这里，它比另外CLI语言更具有明显优势。如果你开发的应用程序有90%的使用时间是涉及本机interop，为何还要考虑使用另外的而不是C++？如果你想开发一个通用集合，为什么仅把你自己限制在泛型上，而不是结合泛型和模板的优势呢？如果你已经用C++工作，为什么还要学习一种新的语言?我常觉得象C#和VB.NET这样的语言总是尽量向开发者隐藏CLR，而C++不仅让你品味CLR，甚至可以让你去亲吻CLR!&nbsp;<br></p><img src ="http://www.cppblog.com/mzty/aggbug/56531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-07-18 22:12 <a href="http://www.cppblog.com/mzty/archive/2008/07/18/56531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Windwos via C++》之精华</title><link>http://www.cppblog.com/mzty/archive/2008/07/13/56001.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Sun, 13 Jul 2008 02:37:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/07/13/56001.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/56001.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/07/13/56001.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/56001.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/56001.html</trackback:ping><description><![CDATA[<p>&nbsp; 来自：梦在天涯C++博客(<a href="http://www.cppblog.com/mzty/">http://www.cppblog.com/mzty/</a>)</p>
<p><span>一</span><span> </span><span>引言</span></p>
<p><span>作为一名</span><span>windows</span><span>系统上图形软件开发者已经有</span><span>3</span><span>个多年头了，在此过程中有不少的经历和经验，非常高兴与大家分享，今天主要是《</span><span>windows via C++</span><span>》一书的阅读心得，所以主要谈到的是</span><span>windows</span><span>上</span><span>C++</span><span>的开发。</span></p>
<p>&nbsp;</p>
<p><span>二</span><span> C++</span><span>语言</span></p>
<p><span>我们知道</span><span>C++</span><span>是一门</span><span>ISO</span><span>的面向对象的语言，下面我介绍他的三个方面，也正是这三个主要方面决定了他被广泛的使用。第一，</span><span>C++</span><span>是一个功能强大的语言。比如</span><span>C++</span><span>语言本身提供的基于</span><span>C</span><span>语言的内嵌类型，数组，结构体和指针等，</span><span>C++</span><span>比</span><span>C</span><span>新加入的面向对象的</span><span>Class</span><span>，继承，多态和模板等，还有</span><span>C++</span><span>标准模板库（</span><span>STL</span><span>）提供的实际开发当中常用的数据结构和算法的实现；第二，大量的开源和第三方库，如果在</span><span>windows</span><span>上使用</span><span>C++</span><span>开发，我们还可以借助</span><span>microsoft</span><span>对</span><span>C++</span><span>提供的强有力的支持，首先的</span><span>VS</span><span>编译器，还有</span><span>UI</span><span>库</span><span>MFC</span><span>，还有</span><span>ATL</span><span>等；除此之外我们还可以看到其他的许多非</span><span>microsoft</span><span>的开源的和第三方的支持，比如说</span><span>Boost</span><span>很大程度的扩充了</span><span>STL</span><span>，提供了更多更高级的功能，还有</span><span>Loki</span><span>把</span><span>C++</span><span>与设计模式结合起来，还有很多的第三方的</span><span>UI</span><span>库，比如</span><span>QT</span><span>，</span><span>WxWindows</span><span>，</span><span>WTL</span><span>，</span><span>GTK</span><span>等，第三方的网络通信库，比如</span><span>ACE</span><span>，</span><span>StreamModule</span><span>等，第三那的</span><span>XML</span><span>库，比如</span><span>Xerces</span><span>，</span><span>CMarkup</span><span>，</span><span>tinyxml</span><span>等，第三方的科学计算库，比如</span><span>Blitz++</span><span>，</span><span>MTL</span><span>等，第三方的游戏开发库，比如</span><span>OGRE</span><span>，</span><span>KlayGE</span><span>等，第三方的线程库，比如</span><span>C++ Threads</span><span>，</span><span>ZThreads</span><span>等，还有其他的很多。第三，</span><span>C++</span><span>的高性能。这个也是毋庸质疑的，我们知道的大部分的操作系统，嵌入式开发，游戏，图像软件离不开</span><span>C++</span><span>，这都是跟</span><span>C++</span><span>的高性能有很大的关系。但从这一点来看，这就是很多现代的其他的高级语言没有的，所以</span><span>C++</span><span>以后仍然有很长的路要走。</span></p>
<p>&nbsp;</p>
<p><span>三</span><span> </span><span>《</span><span>Windows via c++</span><span>》之经典</span></p>
<p><span>上面说了</span><span>C++</span><span>语言本身，这里具体到</span><span>windows</span><span>系统上</span><span>C++</span><span>的开发，我们要基于</span><span>windows</span><span>系统开发软件，就难免的要和</span><span>windows</span><span>系统打交道，比如系统本身对字符编码的支持，系统的异常处理机制，线程的创建管理，进程的创建管理，内存和虚拟内存的使用，堆栈的操作，</span><span>DLL</span><span>的使用等。上面提到的这些都不是</span><span>C++</span><span>语言本身的职责，是需要操作系统提供的支持，而所有这些内容正是《</span><span>windows via C++</span><span>》所覆盖的内容，也正是本书很好的把</span><span>C++</span><span>和</span><span>Windows</span><span>连接起来，引领</span><span>C++</span><span>程序员走向</span><span>windows</span><span>的底层，这也正是本书的经典之处</span><span>!</span><span>再次感谢作者</span><span>Jeffrey Richter</span><span>的伟大贡献！</span></p>
<p>&nbsp;</p>
<p><span>1</span><span>）字符编码：字符编码作为字符串的基础，自然而然就成了我们软件开发必不可缺少的基石，那么什么是字符编码那？字符编码就是字符在计算机内部的表示形式，我们都知道在计算机内部，所有的信息最终都表示为一个二进制的字符串。每一个二进制位（</span><span>bit</span><span>）有</span><span>0</span><span>和</span><span>1</span><span>两种状态，因此八个二进制位就可以组合出</span><span>256</span><span>种状态，这被称为一个字节（</span><span>byte</span><span>）。上个世纪</span><span>60</span><span>年代，美国制定了一套字符编码，对英语字符与二进制位之间的关系，做了统一规定。这被称为</span><span>ASCII</span><span>码，一直沿用至今。</span><span>ASCII</span><span>码一共规定了</span><span>128</span><span>个字符的编码，因为他只占用了一个字节的后面</span><span>7</span><span>位，最前面的</span><span>1</span><span>位统一规定为</span><span>0</span><span>。英语用</span><span>128</span><span>个符号编码就够了，但是用来表示其他语言，</span><span>128</span><span>个符号是不够的。所以后来就各国有了各国的编码，比如日文中的汉字远远大于</span><span>256</span><span>个，所以日文使用如果第一个字符在</span><span>0 x 8 1 </span><span>与</span><span>0 x 9 F </span><span>之间，或者在</span><span>0 x E 0 </span><span>与</span><span>0 x F C </span><span>之间，那么就必须观察下一个字节，才能确定字符串中的这个完整的字符。这样他就使用一个或两个字节来表示一个字符，这种编码被称为双字节字符集（</span><span>D B C S </span><span>）。由于世界上存在着多种编码方式，这使得同一个二进制数字可以被解释成不同的符号。因此，要想打开一个文本文件，就必须知道它的编码方式，否则用错误的编码方式解读，就会出现乱码。这个时候</span><span>Unicode</span><span>就出现了他将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码，那么乱码问题就会消失。但是</span><span>unicode</span><span>也有不同的实现，主要的有三种：</span><span>UTF-16</span><span>：其本身就是标准的</span><span>Unicode</span><span>编码方案，又称为</span><span>UCS-2</span><span>，它固定使用</span><span>16 bits(</span><span>两个字节</span><span>)</span><span>整数来表示一个字符。</span><span>UTF-32</span><span>：又称为</span><span>UCS-4</span><span>，它固定使用</span><span>32 bits(</span><span>四个字节</span><span>)</span><span>整数来表示一个字符。</span><span>UTF -8</span><span>：最广泛的使用的</span><span>UTF</span><span>方案，</span><span>UTF-8</span><span>使用可变长度字节来储存</span><span>Unicode</span><span>字符，例如</span><span>ASCII</span><span>字母继续使用</span><span>1</span><span>字节储存，重音文字、希腊字母或西里尔字母等使用</span><span>2</span><span>字节来储存，而常用的汉字就要使用</span><span>3</span><span>字节。辅助平面字符则使用</span><span>4</span><span>字节。</span><span>UTF-8</span><span>更便于在使用</span><span>Unicode</span><span>的系统与现存的单字节的系统进行数据传输和交换。与前两个方案不同：</span><span>UTF-8</span><span>以字节为编码单元，没有字节序的问题。但是不管是哪种</span><span>unicode</span><span>的实现都可以包含世界所有的字符，解决软件本地化的难题。</span></p>
<p>&nbsp;</p>
<p><span>Windows</span><span>在</span><span>2000</span><span>以前使用</span><span>ASCII</span><span>，</span><span>2000</span><span>及以后的系统都使用</span><span>unicode</span><span>来编码，但是需要注意的是</span><span>Windows2000</span><span>既支持</span><span>Unicode</span><span>，也支持</span><span>ANSI</span><span>，因此可以为任意一种开发应用程序</span><span>.</span><span>如果调用任何一个</span><span>Windows</span><span>函数并给它传递一个</span><span>ANSI</span><span>字符串，那么系统首先要将字符串转换成</span><span>Unicode</span><span>，然后将</span><span>Unicode</span><span>字符串传递给操作系统。如果希望函数返回</span><span>ANSI</span><span>字符串，系统就会首先将</span><span>Unicode</span><span>字符串转换成</span><span>ANSI</span><span>字符串，然后将结果返回给你的应用程序。所有这些转换操作都是在你看不见的情况下发生的。当然，进行这些字符串的转换需要占用系统的时间和内存。比如同一个函数</span><span>CreateWindowEx()</span><span>，在内部其实是当</span><span>ASCII</span><span>是调用</span><span>CreateWindowExA()</span><span>，而当</span><span>unicode</span><span>时调用</span><span>CreateWindowExW()</span><span>。同时</span><span>windows</span><span>系统还给我们提供了</span><span>ASCII</span><span>和</span><span>unicode</span><span>间的转化函数</span><span>MultiByteToWideChar(</span><span>）和</span><span>WideCharToMultiByte()</span><span>。</span></p>
<p>&nbsp;</p>
<p><span>2</span><span>）进程和线程：进程通常被定义为一个正在运行的程序的实例，它由两个部分组成，第一，</span><span> </span><span>一个是操作系统用来管理进程的内核对象，内核对象也是系统用来存放关于进程的统计信息的地方；第二，是地址空间，它包含所有可执行模块或</span><span> D L L </span><span>模块的代码和数据，它还包含动态内存分配的空间，如线程堆栈和堆分配空间。线程是应用程序执行时的最小单位，同样线程也是由两个部分组成的：第一，</span><span> </span><span>一个是线程的内核对象，操作系统用它来对线程实施管理，内核对象也是系统用来存放线程统计信息的地方；第二，线程堆栈，它用于维护线程在执行代码时需要的所有函数参数和局部变量。</span></p>
<p>&nbsp;</p>
<p><span>进程是不活泼的，从来不执行任何东西，它只是线程的容器，若要使进程完成某项操作，它必须拥有一个在它的环境中运行的线程，该线程负责执行包含在进程的地址空间中的代码，当创建一个进程时，系统会自动创建它的第一个线程，称为主线程，然后，该线程可以创建其他的线程，而这些线程又能创建更多的线程。如果在单进程环境中，你有两个或多个线程正在运行，那么这两个线程将共享单个地址空间。这些线程能够执行相同的代码，对相同的数据进行操作。这些线程还能共享内核对象句柄，因为句柄表依赖于每个进程而不是每个线程存在。</span></p>
<p><span>windows</span><span>提供和很多函数来创建和管理线程和进程，比如</span><span>CreateThread</span><span>（），</span><span>ExitThread</span><span>（），</span><span>TerminateThread</span><span>（），</span><span>GetCurrentThread()</span><span>，</span><span>CreateProcess</span><span>（），</span><span>ExitProcess</span><span>（），</span><span>TerminateProcess </span><span>（），</span><span>GetCurrentProcess</span><span>（）等。</span></p>
<p>&nbsp;</p>
<p><span>3</span><span>）线程同步和线程局部存储：由于同一进程的所有线程共享进程的虚拟地址空间，并且线程的中断是汇编语言级的，所以可能会发生两个线程同时访问同一个对象（包括全局变量、共享资源、</span><span>API</span><span>函数和</span><span>MFC</span><span>对象等）的情况，这有可能导致程序错误。属于不同进程的线程在同时访问同一内存区域或共享资源时，也会存在同样的问题。因此，在多线程应用程序中，常常需要采取一些措施来同步线程的执行。</span></p>
<p>&nbsp;</p>
<p><span>windows</span><span>提供了</span><span>3</span><span>中同步机制，分别是信号量</span><span>Semaphore</span><span>，互斥量</span><span>Mutex</span><span>，关键代码段</span><span>CriticalSection</span><span>。其中信号量</span><span>Semaphore</span><span>，是一个可以限制对指定的临界段进行访问的线程的数目的数据结构。互斥量</span><span>Mutex</span><span>和关键代码段</span><span>CriticalSection</span><span>，他们的作用是相同的，都是用来保证某时刻只有一个线程能够访问全局或静态的资源。区别是：</span><span>Mutex</span><span>是内核对象，可以设置等待超时时间，可以在不同的进程的线程中使用，但是所消耗的时间也比较多。</span><span>CriticalSection</span><span>与</span><span>Mutex</span><span>相反。</span></p>
<p>&nbsp;</p>
<p><span>线程局部存储（</span><span>TLS</span><span>），可以为全局或静态变量对不同的线程有不同的拷贝。</span></p>
<p>&nbsp;</p>
<p><span>4</span><span>）线程池：可以实现在程序中根据需要动态的创建线程，比如在</span><span>server</span><span>端，根据访问的用户的多少来创建线程的多少。在</span><span>windows2000</span><span>以后增加了创建线程池的</span><span>API</span><span>，比如</span><span> QueueUserWorkItem</span><span>（）。</span></p>
<p>&nbsp;</p>
<p><span>5)&nbsp;</span><span>纤程：用户级的线程机制，比线程小的单位，开发人员负责管理纤程的调度，同时负责确定纤程何时在线程时间片上下文中运行，一般不会带来性能的提高，主要的目的是为开发人员调度多个不需要并行执行的任务提供一个便捷的机制。单线程可以包含一个或多个纤程。就内核而言，线程是抢占调度的，是正在执行的代码。然而，线程每次执行一个纤程的代码，你决定究竟执行哪个纤程，你可以调用</span><span>ConvertThreadToFiber</span><span>（）</span><span>将已有的线程转化位纤程，当对纤程的执行环境进行分配和初始化后，就可以将执行环境的地址与线程关联起来，该线程被转换成一个纤程，而纤程则在该线程上运行。现在，如果你的纤程（线程）返回或调用</span><span>ExitThread</span><span>函数，那么纤程和线程都会终止运行。除非打算创建更多的纤程以便在同一个线程上运行，否则没有理由将线程转换成纤程。若要创建另一个纤程，该线程（当前正在运行纤程的线程）可以调用</span><span>CreateFiber</span><span>函数。但是调用</span><span>CreateFilber</span><span>创建的纤程并不执行，直到调用</span><span>SwitchToFiber</span><span>函数。若要撤消纤程，可以调用</span><span>DeleteFiber</span><span>函数。</span></p>
<p>&nbsp;</p>
<p><span>6)&nbsp;</span><span>作业：作业可以看作是一组进程的容器</span><span>,</span><span>把这些进程当作一个整体</span><span>,</span><span>对这个整体整个加入更多的限制</span><span>. </span><span>因为</span><span>Windows</span><span>并不维护进程之间的父</span><span>/</span><span>子关系。即使父进程已经终止运行，子进程仍然会继续运行。</span><span>Microsoft Windoss 2000</span><span>提供了一个新的作业内核对象，使你能够将进程组合在一起，并且创建一个&#8220;沙框&#8221;，以便限制进程能够进行的操作。最好将作业对象视为一个进程的容器。但是，创建包含单个进程的作业是有用的，因为这样一来，就可以对该进程加上通常情况下不能加的限制。创建一个新作业内核对象可以调用</span><span>CreateJobObject</span><span>（），另一个进程要访问作业，可以通过</span><span>OpenJobObject</span><span>（），应该知道，关闭作业对象并不会迫使作业中的所有进程终止运行。该作业对象实际上做上了删除标记，只有当作业中的所有进程全部终止运行之后，该作业对象才被自动撤消。注意，关闭作业的句柄后，尽管该作业仍然存在，但是该作业将无法被所有进程访问。通过调用</span><span>SetInformationJobObject()</span><span>可以给作业加上各种限制</span><span>.</span><span>查询限制</span><span>QueryInformationJobObject</span><span>（），将进程放入作业</span><span>AssignProcessToJobObject</span><span>（），若要撤销作业中的进程调用</span><span>TerminateJobObject</span><span>（）。</span></p>
<p>&nbsp;</p>
<p><span>7)&nbsp;</span><span>虚拟内存，内存映射文件和堆栈：每个进程都被赋予它自己的虚拟地址空间。对于</span><span>3 2</span><span>位进程来说，这个地址空间是</span><span>4 G B,</span><span>其中默认有</span><span>2G</span><span>是用户可以使用的。由于每个进程可以接收它自己的私有的地址空间，因此当进程中的一个线程正在运行时，该线程可以访问只属于它的进程的内存。属于所有其他进程的内存则隐藏着，并且不能被正在运行的线程访问。注意在</span><span>Windows 2000</span><span>中，属于操作系统本身的内存也是隐藏的，正在运行的线程无法访问。这意味着线程常常不能访问操作系统的数据。</span></p>
<p>&nbsp;</p>
<p><span>Windows</span><span>提供了</span><span>3</span><span>种进行内存管理的方法，它们是第一，</span><span> </span><span>虚拟内存，最适合用来管理大型对象或结构数组。</span><span> </span><span>第二，内存映射文件，最适合用来管理大型数据流（通常来自文件）以及在单个计算机上运行的多个进程之间共享数据。第三，</span><span> </span><span>内存堆栈，最适合用来管理大量的小对象。</span></p>
<p>&nbsp;</p>
<p><span>在较老的操作系统中，物理存储器被视为计算机拥有的</span><span>R A M</span><span>的容量。换句话说，如果计算机拥有</span><span>1 6 M B</span><span>的</span><span>R A M</span><span>，那么加载和运行的应用程序最多可以使用</span><span>1 6 M B</span><span>的</span><span>R A M</span><span>。今天的操作系统能够使得磁盘空间看上去就像内存一样。磁盘上的文件通常称为页文件，它包含了可供所有进程使用的虚拟内存。</span></p>
<p>&nbsp;</p>
<p><span>内存映射文件与虚拟内存一样，内存映射文件可以用来保留一个地址空间的区域，并将物理存储器提交给该区域。它们之间的差别是，物理存储器来自一个已经位于磁盘上的文件，而不是系统的页文件。一旦该文件被映射，就可以访问它，就像整个文件已经加载内存一样。</span></p>
<p>&nbsp;</p>
<p><span>堆栈可以用来分配许多较小的数据块。例如，若要对链接表和链接树进行管理，最好的方法是使用堆栈，堆栈的优点是，可以不考虑分配粒度和页面边界之类的问题，集中精力处理手头的任务。堆栈的缺点是，分配和释放内存块的速度比其他机制要慢，并且无法直接控制物理存储器的提交和回收。进程和线程都有自己的堆栈，而且大小可以更改。</span></p>
<p>&nbsp;</p>
<p><span>8)&nbsp;DLL</span><span>使用：</span><span>windows</span><span>中广泛的使用</span><span>dll</span><span>来实现模块化，</span><span>dll</span><span>的使用一般有静态和动态加载，静态加载一般通过编译器的设置来实现，动态加载通过使用</span><span>loadlibrary</span><span>（）和</span><span>freelibrary</span><span>（）来实现。</span></p>
<p>&nbsp;</p>
<p><span>9</span><span>）结构化异常处理（</span><span>SEH</span><span>）：</span><span>SEH </span><span>是</span><span> Windows </span><span>系统提供的异常处理功能，跟开发工具无关。</span><span>windows</span><span>上其他程序中的异常处理一般底层都是转化为</span><span>SEH</span><span>来实现。实际上，当你写一条</span><span>C++ throw</span><span>语句时，编译器就生成一个对</span><span>Windows</span><span>的</span><span>RaiseException</span><span>函数的调用。用于</span><span>throw</span><span>语句的变量传递给</span><span>RaiseException</span><span>作为附加的参数。</span></p>
<p>&nbsp;</p>
<p><span>四</span><span> </span><span>《</span><span>Windows via c++</span><span>》之新增</span></p>
<p>&nbsp;</p>
<p><span>1</span><span>）</span><span>64</span><span>位支持：最新的系统有</span><span>64</span><span>的版本，这样的话进程就不再有最大</span><span>4G</span><span>的内存限制，但是由于</span><span>64</span><span>位系统与以前的</span><span>32</span><span>位系统其实是一个</span><span>codebase</span><span>，所以基本有所的接口都与以前</span><span>32</span><span>位保持椅子，这样的话我们以前的所有的</span><span>32</span><span>位的程序只需要从新编译就可以运行在</span><span>64</span><span>系统上，需要特别注意的是指针和句柄的从</span><span>32</span><span>位到</span><span>64</span><span>位的转变。</span></p>
<p>&nbsp;</p>
<p><span>2</span><span>）</span><span>windows vista/2008</span><span>特有：提供了更加安全的</span><span>stirng</span><span>函数，一些内核对象的改变等。</span></p>
<p>&nbsp;</p>
<p><span>3</span><span>）可重复使用的代码：大量可在我们日常开发中重复使用的代码和让我们更好的理解进程的源代码</span><span>processInfo</span><span>，</span><span>LockCop</span><span>等。</span></p>
<p>&nbsp;</p>
<p><span>五</span><span> </span><span>总结</span></p>
<p><span>总之，通过阅读《</span><span>Windows via C++</span><span>》使我们更好的了解</span><span>windows</span><span>系统，更好的在</span><span>windows</span><span>进行</span><span>C++</span><span>开发！推荐</span><span>windows</span><span>上</span><span>C++</span><span>开发人员可以一读！</span></p><img src ="http://www.cppblog.com/mzty/aggbug/56001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-07-13 10:37 <a href="http://www.cppblog.com/mzty/archive/2008/07/13/56001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows开发经典图书推荐</title><link>http://www.cppblog.com/mzty/archive/2008/07/10/55775.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 10 Jul 2008 01:19:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/07/10/55775.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/55775.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/07/10/55775.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/55775.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/55775.html</trackback:ping><description><![CDATA[不能不说是经典啊！我觉的是非常的经典啊！感谢图灵！借首页一用哦！<br><br><img height=534 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/7317/o_yitiantulong.JPG" width=993 border=0><br><br>参考：<a href="http://www.cnblogs.com/turingbooks/archive/2008/07/04/1235964.html">http://www.cnblogs.com/turingbooks/archive/2008/07/04/1235964.html</a><br>更多图灵图书可以看：<a href="http://www.cnblogs.com/turingbooks/">http://www.cnblogs.com/turingbooks/</a> <br><br>购买：<a href="http://www.china-pub.com/static/zt_mb/zt_huodong_0808.asp?filename=jsj_tlms_080702">http://www.china-pub.com/static/zt_mb/zt_huodong_0808.asp?filename=jsj_tlms_080702</a><img src ="http://www.cppblog.com/mzty/aggbug/55775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-07-10 09:19 <a href="http://www.cppblog.com/mzty/archive/2008/07/10/55775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D CAD软件及核心</title><link>http://www.cppblog.com/mzty/archive/2008/06/19/54040.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 19 Jun 2008 10:15:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/19/54040.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/54040.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/19/54040.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/54040.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/54040.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>3D CAD软件及核心</p>
<p>一 3D CAD软件</p>
<p>1）CATIA （达索Dassault Aviation）（高端）（）</p>
<p>CATIA是英文 Computer Aided Tri-Dimensional Interface Application 的缩写。是世界上一种主流的CAD/CAE/CAM一体化软件。在70年代Dassault Aviation 成为了第一个用户，CATIA 也应运而生。从1982年到1988年，CATIA 相继发布了1版本、2版本、3版本，并于1993年发布了功能强大的4版本，现在的CATIA 软件分为V4版本和 V5版本两个系列。V4版本应用于UNIX 平台，V5版本应用于UNIX和Windows 两种平台。V5版本的开发开始于1994年。为了使软件能够易学易用，Dassault System 于94年开始重新开发全新的CATIA V5版本，新的V5版本界面更加友好，功能也日趋强大，并且开创了CAD/CAE/CAM 软件的一种全新风格。<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 法国 Dassault Aviation 是世界著名的航空航天企业。其产品以幻影2000和阵风战斗机最为著名。CATIA的产品开发商Dassault System 成立于1981年。而如今其在CAD/CAE/CAM 以及PDM 领域内的领导地位，已得到世界范围内的承认。其销售利润从最开始的一百万美圆增长到现在的近二十亿美圆。雇员人数由20人发展到2，000多人。<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; CATIA是法国Dassault System公司的CAD/CAE/CAM一体化软件，居世界CAD/CAE/CAM领域的领导地位，广泛应用于航空航天、汽车制造、造船、机械制造、电子\电器、消费品行业，它的集成解决方案覆盖所有的产品设计与制造领域，其特有的DMU电子样机模块功能及混合建模技术更是推动着企业竞争力和生产力的提高。CATIA 提供方便的解决方案，迎合所有工业领域的大、中、小型企业需要。包括:从大型的波音747飞机、火箭发动机到化妆品的包装盒，几乎涵盖了所有的制造业产品。在世界上有超过13,000的用户选择了CATIA。CATIA 源于航空航天业，但其强大的功能以得到各行业的认可，在欧洲汽车业，已成为事实上的标准。CATIA 的著名用户包括波音、克莱斯勒、宝马、奔驰等一大批知名企业。其用户群体在世界制造业中具有举足轻重的地位。波音飞机公司使用CATIA完成了整个波音 777的电子装配，创造了业界的一个奇迹，从而也确定了CATIA 在CAD/CAE/CAM 行业内的领先地位。</p>
<p><br>2）UG （UGS现被西门子收购）（高端）（Parasolid几何造型核心为基础，采用基于约束的特征建模技术和传统的几何建模为一体的复合建模技术）</p>
<p>Unigraphics Solutions公司(简称UGS)是全球著名的MCAD供应商,主要为汽车与交通、航空航天、日用消费品、通用机械以及电子工业等领域通过其虚拟产品开发(VPD)的理念提供多级化的、集成的、企业级的包括软件产品与服务在内的完整的 MCAD解决方案。其主要的CAD产品是UG。<br>UG公司的产品主要有为机械制造企业提供包括从设计、分析到制造应用的Unigraphics软件、基于Windows的设计与制图产品Solid Edge、集团级产品数据管理系统iMAN、产品可视化技术ProductVision以及被业界广泛使用的高精度边界表示的实体建模核心 Parasolid在内的全线产品。<br>UG在航空航天、汽车、通用机械、工业设备、医疗器械以及其它高科技应用领域的机械设计和模具加工自动化的市场上得到了广泛的应用。多年来，UGS一直在支持美国通用汽车公司实施目前全球最大的虚拟产品开发项目，同时Unigraphics也是日本著名汽车零部件制造商DENSO公司的计算机应用标准，并在全球汽车行业得到了很大的应用，如Navistar、底特律柴油机厂、Winnebago和Robert Bosch AG 等。<br>另外，UGS公司在航空领域也有很好的的表现：在美国的航空业，安装了超过10,000套UG软件；在俄罗斯航空业，UG软件具有90%以上的市场；在北美汽轮机市场，UG软件占80%。UGS在喷气发动机行业也占有领先地位，拥有如Pratt &amp; Whitney和GE 喷气发动机公司这样的知名客户。航空业的其它客户还有：B/E航空公司、波音公司、 以色列飞机公司、英国航空公司、Northrop Grumman、伊尔飞机和Antonov。<br>UGS公司的产品同时还遍布通用机械、医疗器械、电子、高技术以及日用消费品等行业，如：3M、Will-Pemco、Biomet、Zimmer、飞利浦公司、吉列公司、Timex、 Eureka 和Arctic Cat等。</p>
<p><br>3）Pro/ENGINEER（PTC）（中端）(PROE是参数化造型的开创者，以其参数化、基于特征、全相关等概念闻名于CAD界)</p>
<p>1985年，PTC公司成立于美国波士顿，开始参数化建模软件的研究。1988年，V1.0的Pro/ENGINEER诞生了。经过10余年的发展，Pro/ENGINEER已经成为三维建模软件的领头羊。目前已经发布了Pro/ENGINEER2000i2。PTC的系列软件包括了在工业设计和机械设计等方面的多项功能，还包括对大型装配体的管理、功能仿真、制造、产品数据管理等等。Pro/ENGINEER还提供了目前所能达到的最全面、集成最紧密的产品开发环境。PRO/E的最新版本为PRO/E2000i，它可运行于Windows/NT和UNIX平台上，共有六大主模块，下面我把它们逐一介绍给大家。</p>
<p>PRO/E概述<br>PRO/ENGINEER软件包的产品开发环境在支持并行工作，它通过一系列完全相关的模块表述产品的外形、装配及其他功能。PRO/E能够让多个部门同时致力于单一的产品模型。包括对大型项目的装配体管理、功能仿真、制造、数据管理等。其中PRO/E V2000I更增加了行为建模技术使其成为把梦想变为现实的杰出工具。</p>
<p>4）solidworks（SolidWorks被达索收购）（低端）（Parasolid几何造型核心为基础，采用基于约束的特征建模技术和传统的几何建模为一体的复合建模技术）</p>
<p>SolidWorks公司成立于1993年，由PTC公司的技术副总裁与CV公司的副总裁发起，总部位于马萨诸塞州的康克尔郡（Concord,Massachusetts）内，当初所赋予的任务是希望在每一个工程师的桌面上提供一套具有生产力的实体模型设计系统。从1995年推出第一套SolidWorks三维机械设计软件至今，它已经拥有位于全球的办事处，并经由300家经销商在全球140个国家进行销售与分销该产品。　SolidWorks软件是世界上第一个基于Windows开发的三维CAD系统，由于技术创新符合CAD技术的发展潮流和趋势，SolidWorks 公司于两年间成为CAD/CAM产业中获利最高的公司。良好的财务状况和用户支持使得SolidWorks每年都有数十乃至数百项的技术创新，公司也获得了很多荣誉。该系统在1995-1999年获得全球微机平台CAD系统评比第一名；从1995年至今，已经累计获得十七项国际大奖，其中仅从1999年起，美国权威的CAD专业杂志CADENCE连续4年授予SolidWorks最佳编辑奖，以表彰SolidWorks的创新、活力和简明。至此，SolidWorks所遵循的易用、稳定和创新三大原则得到了全面的落实和证明，使用它，设计师大大缩短了设计时间，产品快速、高效地投向了市场。<br>&nbsp;&nbsp;&nbsp; 由于SolidWorks出色的技术和市场表现，不仅成为CAD行业的一颗耀眼的明星，也成为华尔街青睐的对象。终于在1997年由法国达索公司以三亿一千万美元的高额市值将SolidWorks全资并购。公司原来的风险投资商和股东，以一千三百万美元的风险投资，获得了高额的回报，创造了CAD行业的世界纪录。并购后的SolidWorks以原来的品牌和管理技术队伍继续独立运作，成为CAD行业一家高素质的专业化公司，SolidWorks三维机械设计软件也成为达索企业中最具竞争力的CAD产品。</p>
<p>5) autodesk inventor(autodesk)(低端)（）<br>Autodesk Inventor 2008产品线提供了一套全面、集成的设计工具，可用于三维设计和建档、创建布线系统和验证设计。 Inventor产品线中的所有产品包均包括强大的数据管理软件和面向二维制图和详细设计的 AutoCAD Mechanical软件。</p>
<p>6)solidege(UGS现被西门子收购)(低端)</p>
<p>二 3D CAD软件核心</p>
<p>1）ACIS是用C＋＋语言编写的，由于没有基于ACIS的高中端CAD软件开发出来，ACIS的维护和提供实时的技术支持看起来要比Parasolid差点。总言之，ACIS的稳定性较差，但容易上手，适用于学校里的研究工作或做个DEMO版演示软件；</p>
<p>2）OpenCasCade是个免费包，适用于市场份额不大的软件开发。比如CMM测量软件，CMM软件一年销售几千套已经是非常好的业绩了。OpenCasCade用于学习研究还是不错的，算法都看得到，不过这是需要良好的数学（比如：高等几何）功底的。</p>
<p>3）Parasolid包里的复杂的曲面造型功能看起来UGS公司有所保留，不过，UGS最近被西门子收购，纯粹的软件行业看起来比较脆弱，前几年的网络泡沫，现在看起来软件泡沫也不远了。</p>
<p>4）ACIS和Parasolid价格差不多，如果是商业开发的话，还是选择Parasolid稳妥点。</p>
<p>三 3D CAD软件选择</p>
<p>几种三维软件的特点结合我的经验对比：<br>1）Solidworks：用法简单，对于非复杂曲面实体建模能力还可以；<br>2）UG：功能强大，操作一般，作模具较好；<br>3）CATIA：功能强大，是当今一流的三维软件，但是操作复杂，一般公司不用，像波音等大公司使用，在中国汽车行业常用；<br>4) PRO/E：功能强大，操作简单，曲面能力强，适用于产品外观模型的建立与结构的设计，制作模具能力较差。<br>至于3DMAX之流，根本不是三维CAD软件，不值一提。 </p><img src ="http://www.cppblog.com/mzty/aggbug/54040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-19 18:15 <a href="http://www.cppblog.com/mzty/archive/2008/06/19/54040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖茨53年人生大事记</title><link>http://www.cppblog.com/mzty/archive/2008/06/18/53911.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 18 Jun 2008 09:35:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/18/53911.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/53911.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/18/53911.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/53911.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/53911.html</trackback:ping><description><![CDATA[<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;《连线》杂志近日撰文称，微软创始人兼董事会主席比尔&#183;盖茨(Bill Gates)将于7月正式退出微软的日常运营，全身心投入慈善事业。盖茨的离去将令很多人依依不舍，不仅因为他白手起家的传奇经历激励着人们矢志前进，而且，在盖茨的财富背后，还隐藏着一种更为根本的东西，值得我们去探究。在盖茨与我们告别之际，让我们来回顾一下他走过的50多年的难忘瞬间。
<p>　　<strong>20世纪50年代</strong></p>
<p>　　1955年10月28日 </p>
<p>　　威廉-亨利&#183;盖茨三世出生于西雅图。祖母奥黛丽给他起了一个外号——&#8220;特利&#8221;(Trey)，Trey在英语中的意思是三点的牌、骰子或骨牌。盖茨后来也确实成了一名扑克牌高手。</p>
<p><strong>　　20世纪60年代</strong></p>
<p>　　1967年</p>
<p>　　盖茨上六年级，学习成绩不佳，他充满困惑地问妈妈，&#8220;您曾尝试思考吗？&#8221;</p>
<p>　　1967年秋 </p>
<p>　　盖茨的父母把他送进了湖边学校(Lakeside School)，这是西雅图一所男子学校。他是班里最矮的学生。</p>
<p>　　1968年</p>
<p>　　盖茨和湖边学校同班同学保罗&#183;艾伦(Paul Allen)从手册中学会了Basic语言。几周后，这两个小家伙便将学校用于支付PDP-10电脑使用时间的3000美元年度预算花得一干二净。他们俩不久即与电脑中心公司签了一份合约，向其报告PDP-10电脑中存在的软件缺陷，而报酬是免费使用电脑。</p>
<p><strong>　　20世纪70年代</strong></p>
<p>　　1971年</p>
<p>　　盖茨为湖边学校编写程序，包括一个设计班级课程表的程序。</p>
<p>　　1973年9月</p>
<p>　　盖茨考入哈佛大学。他的学习成绩很不稳定。他有很多坏习惯，经常旷课去编程、玩牌，不爱洗澡，喜欢比萨饼和碳酸饮料。他与住在同一个宿舍的史蒂夫&#183;鲍尔默(Steve Ballmer)结为好友。</p>
<p>　　1975年1月</p>
<p>　　艾伦无意中看到了《大众电子》的封面，上面是Altair 8800电脑的照片和&#8220;全球第一台对抗商业模式的微型电脑装置&#8221;的大字标题。艾伦买了一本，并冲进盖茨的房间。几天后，盖茨给Altair电脑制造商 MITS打去电话，告诉该公司他和艾伦能为8800电脑开发出Basic语言。</p>
<p>　　1975年2月1日</p>
<p>　　盖茨和艾伦完成Basic开发，将其以3000美元外加最高达18万美元的版税卖给MITS公司。</p>
<p>　　1976年11月26日</p>
<p>　　盖茨和艾伦注册了微软(Microsoft)商标。他们一度考虑以艾伦与盖茨(Allen &amp; Gates)作为公司名称，后提出Micro-Soft，但他们决定将中间的连字符去掉，于是微软就此诞生。当时艾伦23岁，盖茨21岁。</p>
<p>　　1977年1月</p>
<p>　　盖茨从哈佛大学休学，在新墨西哥州阿尔伯克基创建了微软，MITS总部也设在此地。</p>
<p>　　1977年</p>
<p>　　盖茨的秘书多次在微软办公大楼内发现盖茨躺在地板上呼呼大睡。他仍喜欢吃比萨饼，同时对属下要求严格，经常与同事争辩。盖茨经常说的一句话是：&#8220;这是我有史以来听说的最愚蠢的事情。&#8221;</p>
<p>　　1977年底</p>
<p>　　盖茨多次因驾驶保时捷911超速而被警方逮捕，还有一次则是无照驾驶。这可害苦了艾伦，他保释盖茨的经历至少有一次。</p>
<p>　　1978年12月</p>
<p>　　微软年终销售额超过100万美元。</p>
<p>　　1979年1月1日</p>
<p>　　微软将公司总部迁至华盛顿州贝尔维尤市。</p>
<p><strong>　　20世纪80年代</strong></p>
<p>　　1980年8月28日</p>
<p>　　盖茨与IBM签署合同，同意为这家PC制造商开发软件。后来，他以5万美元买了一套名为QDOS的操作系统，稍加改进并更名为DOS，便授权IBM使用。</p>
<p>　　1981年8月12日</p>
<p>　　IBM开始销售具有MS-DOS 1.0的PC。</p>
<p>　　1982年</p>
<p>　　在上市销售的第一年，MS-DOS被授权于50个硬件制造商使用。</p>
<p>　　1983年2月18日</p>
<p>　　艾伦因身患霍奇金氏病被迫辞去微软副总裁一职。他买了一个<a class=akey href="http://sports.sina.com.cn/basketball/" target=_blank><span style="COLOR: #0066cc">篮球</span></a>队，创建了一个音乐博物馆，拥有世界上第三大游艇。</p>
<p>　　1983年11月10日</p>
<p>　　Windows揭开神秘面纱。Windows是MS-DOS的延伸，可提供图形用户界面。</p>
<p>　　1984年1月24日</p>
<p>　　盖茨出席了Macintosh的上市宣传活动——微软是第一批为苹果电脑开发软件的公司之一。</p>
<p>　　1985年</p>
<p>　　有报道称盖茨粗暴辱骂一位女高管，后者要求调离岗位。</p>
<p>　　1985年8月12日</p>
<p>　　经过10年的奋斗，微软产品的销售额达到1.4亿美元。</p>
<p>　　1986年3月13日</p>
<p>　　微软以每股21美元公开发售股票。当天微软股价报收于28美元，为公司筹集到6100万美元。</p>
<p>　　1987年</p>
<p>　　盖茨在曼哈顿召开的微软新闻发布会上邂逅梅琳达&#183;弗朗奇(Melinda French)。</p>
<p>　　1989年8月1日</p>
<p>　　微软推出Office办公软件。</p>
<p><strong>　　20世纪90年代</strong></p>
<p>　　1990年5月13日</p>
<p>　　盖茨在母亲节这一天提出微软公司高层退休时间表。</p>
<p>　　1990年6月</p>
<p>　　美国联邦贸易委员会对微软和IBM在PC软件市场可能存在的勾结行为展开调查。</p>
<p>　　1993年4月11日</p>
<p>　　在从佛罗里达州飞往西雅图的包机上，盖茨向梅琳达求婚。盖茨还安排飞机在奥马哈降落，带着梅琳达同好友沃伦&#183;巴菲特(Warren Buffett)一同出去购物。</p>
<p>　　1993年8月20日</p>
<p>　　美国司法部从联邦贸易委员会接管对微软的调查。</p>
<p>　　1994年1月1日</p>
<p>　　盖茨和梅琳达在夏威夷拉奈小岛上举行了小型婚礼。为给新婚妻子一个惊喜，盖茨特意安排梅琳达最喜欢的歌手威利&#183;尼尔森(Willie Nelson)在婚礼上表演。</p>
<p>　　1994年4月</p>
<p>　　好消息：盖茨首次登上了《连线》杂志封面。坏消息：美国政府对微软展开了反垄断调查。</p>
<p>　　1994年7月</p>
<p>　　微软同意接受美国政府签署的法令，承诺放弃极端的反竞争商业行为(例如，要求硬件制造商为其所生产的配置特定微处理器的所有电脑支付MS-DOS授权费，即使该电脑没有安装这一操作系统)。</p>
<p>　　1994年11月11日</p>
<p>　　盖茨以3080万美元购得达&#183;芬奇的《哈默手稿》(Codex Hammer)——达&#183;芬奇亲笔写下的72页科学手稿。他同意将《哈默手稿》公开展示。</p>
<p>　　1995年</p>
<p>　　盖茨出现在可口可乐(据报道他喜欢喝健怡可乐)的商业广告中：这位亿万富翁搜遍全身口袋，寻找购买饮料的零钱。</p>
<p>　　1995年7月17日</p>
<p>　　39岁的盖茨以129亿美元的个人财富成为世界首富。微软在1995年的收入达到59亿美元，拥有17,801名员工。</p>
<p>　　1995年8月24日</p>
<p>　　微软推出网络浏览器Internet Explorer。</p>
<p>　　1996年6月</p>
<p>　　盖茨第二次登上《连线》杂志封面，这次是用Photoshop软件处理过的他裹着浴袍的照片。</p>
<p>　　1996年12月</p>
<p>　　微软股价创下新高——同比上涨88%。从理论上讲，那一年，盖茨每天的收入高达3000万美元。</p>
<p>　　1997年10月20日</p>
<p>　　因违反1994年签署的协议，美国法院对微软处以每天100万美元的罚款。美国司法部称，微软要求硬件制造商申请Windows 95授权时，必须在其硬件产品中绑定Internet Explorer，由此违反了这一协议。</p>
<p>　　1998年2月4日</p>
<p>　　盖茨在比利时布鲁塞尔会见比利时政府官员和企业家时，遭到奶油蛋糕的袭击。事后，盖茨开玩笑说，&#8220;这块蛋糕可不怎么好吃&#8221;。</p>
<p>　　1998年5月18日</p>
<p>　　美国司法部和20个州的总检察官认为微软将网络浏览器绑定到其操作系统，违反了相关规定，由此对微软提出起诉。</p>
<p>　　1998年11月9日</p>
<p>　　在一段作证录像中，当盖茨表示自己从未蓄意将竞争对手赶出软件市场时，他的身子微微颤抖。医生据此认为盖茨可能患有亚斯伯格症候群(Asperger's syndrome)。</p>
<p>　　1999年</p>
<p>　　盖茨和妻子将威廉&#183;盖茨基金会更名为比尔与梅琳达&#183;盖茨基金会，并提出了减少世界上不公平现象的目标。</p>
<p><strong>　　21世纪初</strong></p>
<p>　　2000年1月13日</p>
<p>　　盖茨辞去微软CEO一职，成为公司首席软件工程师，将大权交给鲍尔默。</p>
<p>　　2000年6月7日</p>
<p>　　美国联邦地区法院法官托马斯&#183;潘菲尔德&#183;杰克逊(Thomas Penfield Jackson)裁定微软应一分为二。</p>
<p>　　2000年11月</p>
<p>　　盖茨第三次登上《连线》杂志封面，这次是为了揭开微软反垄断案后鲜为人知的故事。</p>
<p>　　2001年6月28日</p>
<p>　　美国哥伦比亚地区上诉法院推翻杰克逊法官的裁决。</p>
<p>　　2002年 </p>
<p>　　据针对中国内地和香港年轻人的调查显示，盖茨取代了毛泽东在他们心中的偶像地位。</p>
<p>　　2005年3月2日</p>
<p>　　盖茨在白金汉宫接受英国女王授予的骑士勋章，此前，鲁迪&#183;朱利安尼和斯蒂文&#183;斯皮尔伯格都曾获得这一殊荣。盖茨此后有资格在名字后面加上字母&#8220;KBE&#8221;(英帝国爵级勋章)。</p>
<p>　　2005年12月</p>
<p>　　盖茨夫妇和爱尔兰U2乐队主唱波诺当选为美国《时代》周刊2005年度人物。</p>
<p>　　2006年6月15日</p>
<p>　　盖茨宣布，他将在两年内逐步退出公司的日常事务管理。</p>
<p>　　2006年6月26日</p>
<p>　　在得到巴菲特300多亿美元捐款后，比尔与梅琳达&#183;盖茨基金会规模壮大一倍，成为世界最大的慈善基金会。</p>
<p>　　2008年3月</p>
<p>　　《福布斯》发布08年全球富豪排行榜，蝉联13年首富桂冠的盖茨以580亿美元的资产总值下滑至第三的位置。而盖茨的牌友、&#8220;股神&#8221;巴菲特则取代他问鼎冠军宝座。(杨琳)</p><img src ="http://www.cppblog.com/mzty/aggbug/53911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-18 17:35 <a href="http://www.cppblog.com/mzty/archive/2008/06/18/53911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#入门代码 </title><link>http://www.cppblog.com/mzty/archive/2008/06/18/53835.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 18 Jun 2008 04:08:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/18/53835.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/53835.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/18/53835.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/53835.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/53835.html</trackback:ping><description><![CDATA[<div class=postbody>
<p>转自：<a href="http://www.cnblogs.com/lyj/archive/2007/01/09/616053.html">http://www.cnblogs.com/lyj/archive/2007/01/09/616053.html</a><br><strong><br>一、从控制台读取东西代码片断：</strong><br>using System;</p>
<p>class TestReadConsole<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write(Enter your name:);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strName = Console.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine( Hi + strName);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>二、读文件代码片断：</strong><br>using System; <br>using System.IO; </p>
<p>public class TestReadFile <br>{ <br>&nbsp;&nbsp;&nbsp; public static void Main(String[] args) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Read text file C:\temp\test.txt <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream fs = new FileStream(@c:\temp\test.txt , FileMode.Open, FileAccess.Read); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamReader sr = new StreamReader(fs);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line=sr.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (line!=null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(line);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line=sr.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sr.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Close();<br>&nbsp;&nbsp;&nbsp; } <br>} <br><strong>三、写文件代码：<br></strong>using System; <br>using System.IO; </p>
<p>public class TestWriteFile <br>{ <br>&nbsp;&nbsp;&nbsp; public static void Main(String[] args) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a text file C:\temp\test.txt <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream fs = new FileStream(@c:\temp\test.txt , FileMode.OpenOrCreate, FileAccess.Write); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamWriter sw = new StreamWriter(fs); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Write to the file using StreamWriter class <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.BaseStream.Seek(0, SeekOrigin.End); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.WriteLine( First Line ); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.WriteLine( Second Line); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sw.Flush(); <br>&nbsp;&nbsp;&nbsp; } <br>} <br><strong>四、拷贝文件：</strong><br>using System;<br>using System.IO;</p>
<p>class TestCopyFile<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File.Copy(c:\\temp\\source.txt, C:\\temp\\dest.txt );&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>五、移动文件：<br></strong>using System;<br>using System.IO;</p>
<p>class TestMoveFile<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File.Move(c:\\temp\\abc.txt, C:\\temp\\def.txt );&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>六、使用计时器：</strong><br>using System;<br>using System.Timers;</p>
<p>class TestTimer<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer timer = new Timer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.Elapsed += new ElapsedEventHandler( DisplayTimeEvent );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.Interval = 1000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.Start();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.Enabled = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( Console.Read() != 'q' )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //-------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public static void DisplayTimeEvent( object source, ElapsedEventArgs e )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write(\r{0}, DateTime.Now);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>七、调用外部程序：</strong><br>class Test <br>{ <br>&nbsp;&nbsp;&nbsp; static void Main(string[] args) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Diagnostics.Process.Start(notepad.exe); <br>&nbsp;&nbsp;&nbsp; } <br>}</p>
<p><span style="COLOR: red">ADO.NET方面的：</span><br><strong>八、连接Access数据库：</strong><br>using System;<br>using System.Data;<br>using System.Data.OleDb;</p>
<p>class TestADO<br>{<br>&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strDSN = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\test.mdb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSQL = SELECT * FROM employees ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbConnection conn = new OleDbConnection(strDSN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbCommand cmd = new OleDbCommand( strSQL, conn );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbDataReader reader = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader = cmd.ExecuteReader();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (reader.Read() )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(First Name:{0}, Last Name:{1}, reader[FirstName], reader[LastName]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(e.Message);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>} <br><strong>九、连接SQL Server数据库：</strong><br>using System;<br>using System.Data.SqlClient;</p>
<p>public class TestADO<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection conn = new SqlConnection(Data Source=localhost; Integrated Security=SSPI; Initial Catalog=pubs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand&nbsp; cmd = new SqlCommand(SELECT * FROM employees, conn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader reader = cmd.ExecuteReader();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (reader.Read())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(First Name: {0}, Last Name: {1}, reader.GetString(0), reader.GetString(1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Exception Occured --&gt;&gt; {0},e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>十、从SQL内读数据到XML：<br></strong>using System;<br>using System.Data;<br>using System.Xml;<br>using System.Data.SqlClient; <br>using System.IO; </p>
<p>public class TestWriteXML<br>{ <br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strFileName=c:/temp/output.xml;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection conn = new SqlConnection(server=localhost;uid=sa;pwd=;database=db);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strSql = SELECT FirstName, LastName FROM employees; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataAdapter adapter = new SqlDataAdapter(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.SelectCommand = new SqlCommand(strSql,conn);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Build the DataSet<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds = new DataSet();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter.Fill(ds, employees);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get a FileStream object<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream fs = new FileStream(strFileName,FileMode.OpenOrCreate,FileAccess.Write);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Apply the WriteXml method to write an XML document<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds.WriteXml(fs);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Close();</p>
<p>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>十一、用ADO添加数据到数据库中：<br></strong>using System;<br>using System.Data;&nbsp;&nbsp; <br>using System.Data.OleDb;&nbsp;&nbsp; </p>
<p>class TestADO<br>{&nbsp; <br>&nbsp;&nbsp;&nbsp; static void Main(string[] args)&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strDSN = Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\test.mdb;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSQL = INSERT INTO Employee(FirstName, LastName) VALUES('FirstName', 'LastName') ;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create Objects of ADOConnection and ADOCommand&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbConnection conn = new OleDbConnection(strDSN);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbCommand cmd = new OleDbCommand( strSQL, conn );&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.ExecuteNonQuery();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Oooops. I did it again:\n{0}, e.Message);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; } <br>}&nbsp; <br><strong>十二、使用OLEConn连接数据库：</strong><br>using System;<br>using System.Data;&nbsp;&nbsp; <br>using System.Data.OleDb;&nbsp;&nbsp; </p>
<p>class TestADO<br>{&nbsp; <br>&nbsp;&nbsp;&nbsp; static void Main(string[] args)&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strDSN = Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\test.mdb;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSQL = SELECT * FROM employee ;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbConnection conn = new OleDbConnection(strDSN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbDataAdapter cmd = new OleDbDataAdapter( strSQL, conn ); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds = new DataSet();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Fill( ds, employee );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTable dt = ds.Tables[0];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach( DataRow dr in dt.Rows )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(First name: + dr[FirstName].ToString() + Last name: + dr[LastName].ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();&nbsp; <br>&nbsp;&nbsp;&nbsp; } <br>}&nbsp; <br><strong>十三、读取表的属性：</strong><br>using System;<br>using System.Data;&nbsp;&nbsp; <br>using System.Data.OleDb;&nbsp;&nbsp; </p>
<p>class TestADO<br>{&nbsp; <br>&nbsp;&nbsp;&nbsp; static void Main(string[] args)&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strDSN = Provider=Microsoft.Jet.OLEDB.4.0;DataSource=c:\test.mdb;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strSQL = SELECT * FROM employee ;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbConnection conn = new OleDbConnection(strDSN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OleDbDataAdapter cmd = new OleDbDataAdapter( strSQL, conn ); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds = new DataSet();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Fill( ds, employee );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTable dt = ds.Tables[0];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Field Name DataType Unique AutoIncrement AllowNull);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(==================================================================);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach( DataColumn dc in dt.Columns )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(dc.ColumnName+ , +dc.DataType + ,+dc.Unique + ,+dc.AutoIncrement+ ,+dc.AllowDBNull );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.Close();&nbsp; <br>&nbsp;&nbsp;&nbsp; } <br>} </p>
<p><span style="COLOR: red">ASP.NET方面的</span><br><strong>十四、一个ASP.NET程序：</strong><br>&lt;%@ Page Language=C# %&gt;<br>&lt;script runat=server&gt;<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; void Button1_Click(Object sender, EventArgs e) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label1.Text=TextBox1.Text;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&lt;/script&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;form runat=server&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enter your name: &lt;asp:TextBox id=TextBox1 runat=server&gt;&lt;/asp:TextBox&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;&lt;asp:Label id=Label1 runat=server Width=247px&gt;&lt;/asp:Label&gt;&lt;/b&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button id=Button1 onclick=Button1_Click runat=server Text=Submit&gt;&lt;/asp:Button&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</p>
<p><span style="COLOR: red">WinForm开发：<br></span><strong>十五、一个简单的WinForm程序：</strong><br>using System;<br>using System.Drawing;<br>using System.Collections;<br>using System.ComponentModel;<br>using System.Windows.Forms;<br>using System.Data;</p>
<p><br>public class SimpleForm : System.Windows.Forms.Form<br>{</p>
<p>&nbsp;&nbsp;&nbsp; private System.ComponentModel.Container components = null;<br>&nbsp;&nbsp;&nbsp; private System.Windows.Forms.Button button1;<br>&nbsp;&nbsp;&nbsp; private System.Windows.Forms.TextBox textBox1;<br>&nbsp;&nbsp;&nbsp; public SimpleForm()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; protected override void Dispose( bool disposing )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( disposing )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (components != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; components.Dispose();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Dispose( disposing );<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; #region Windows Form Designer generated code<br>&nbsp;&nbsp;&nbsp; private void InitializeComponent()<br>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.components = new System.ComponentModel.Container();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Size = new System.Drawing.Size(300,300);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Text = Form1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.button1 = new System.Windows.Forms.Button();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.textBox1 = new System.Windows.Forms.TextBox();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.SuspendLayout(); <br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; // button1<br>&nbsp;&nbsp;&nbsp; //</p>
<p>&nbsp;&nbsp;&nbsp; this.button1.Location = new System.Drawing.Point(8, 16);<br>&nbsp;&nbsp;&nbsp; this.button1.Name = button1;<br>&nbsp;&nbsp;&nbsp; this.button1.Size = new System.Drawing.Size(80, 24);<br>&nbsp;&nbsp;&nbsp; this.button1.TabIndex = 0;<br>&nbsp;&nbsp;&nbsp; this.button1.Text = button1;</p>
<p>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; // textBox1<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; this.textBox1.Location = new System.Drawing.Point(112, 16);<br>&nbsp;&nbsp;&nbsp; this.textBox1.Name = textBox1;<br>&nbsp;&nbsp;&nbsp; this.textBox1.Size = new System.Drawing.Size(160, 20);<br>&nbsp;&nbsp;&nbsp; this.textBox1.TabIndex = 1;<br>&nbsp;&nbsp;&nbsp; this.textBox1.Text = textBox1;<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; // Form1<br>&nbsp;&nbsp;&nbsp; //</p>
<p>&nbsp;&nbsp;&nbsp; this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);<br>&nbsp;&nbsp;&nbsp; this.ClientSize = new System.Drawing.Size(292, 273);<br>&nbsp;&nbsp;&nbsp; this.Controls.AddRange(new System.Windows.Forms.Control[] {<br>&nbsp;&nbsp;&nbsp; this.textBox1,<br>&nbsp;&nbsp;&nbsp; this.button1});<br>&nbsp;&nbsp;&nbsp; this.Name = Form1;<br>&nbsp;&nbsp;&nbsp; this.Text = Form1;<br>&nbsp;&nbsp;&nbsp; this.ResumeLayout(false); </p>
<p>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; #endregion</p>
<p>&nbsp;&nbsp;&nbsp; [STAThread]<br>&nbsp;&nbsp;&nbsp; static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application.Run(new SimpleForm());<br>&nbsp;&nbsp;&nbsp; } <br>}<br><strong>十六、运行时显示自己定义的图标：</strong><br>//load icon and set to form<br>System.Drawing.Icon ico = new System.Drawing.Icon(@c:\temp\app.ico);<br>this.Icon = ico;<br><strong>十七、添加组件到ListBox中：</strong><br>private void Form1_Load(object sender, System.EventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp; string str = First item;<br>&nbsp;&nbsp;&nbsp; int i = 23;<br>&nbsp;&nbsp;&nbsp; float flt = 34.98f; <br>&nbsp;&nbsp;&nbsp; listBox1.Items.Add(str);<br>&nbsp;&nbsp;&nbsp; listBox1.Items.Add(i.ToString());<br>&nbsp;&nbsp;&nbsp; listBox1.Items.Add(flt.ToString());<br>&nbsp;&nbsp;&nbsp; listBox1.Items.Add(Last Item in the List Box);<br>} </p>
<p><span style="COLOR: red">网络方面的：</span><br><strong>十八、取得IP地址：</strong><br>using System;<br>using System.Net;</p>
<p>class GetIP<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPHostEntry ipEntry = Dns.GetHostByName (localhost);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPAddress [] IpAddr = ipEntry.AddressList;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; IpAddr.Length; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine (IP Address {0}: {1} , i, IpAddr.ToString ());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>十九、取得机器名称：</strong><br>using System;<br>using System.Net;</p>
<p>class GetIP<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine (Host name : {0}, Dns.GetHostName());<br>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>二十、发送邮件：</strong><br>using System;<br>using System.Web;<br>using System.Web.Mail;</p>
<p>public class TestSendMail<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // <span>Construct a new mail message <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MailMessage message = new MailMessage();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.From = <font color=#000080>from@domain.com</font>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.To&nbsp;&nbsp; =&nbsp; <span style="COLOR: #000000"><font color=#000080>pengyun@cobainsoft.com</font>;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Cc&nbsp;&nbsp; = ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Bcc&nbsp; = ;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Subject = Subject;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Body = Content of message;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //if you want attach file with this mail, add the line below<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.Attachments.Add(new MailAttachment(c:\\attach.txt, MailEncoding.Base64));<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Send the message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SmtpMail.Send(message);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Console.WriteLine(Message has been sent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ex)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Console.WriteLine(ex.Message.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }<br>}<br><strong>二十一、根据IP地址得出机器名称：</strong><br>using System;<br>using System.Net;</p>
<p>class ResolveIP<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPHostEntry ipEntry = Dns.Resolve(172.29.9.9);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine (Host name : {0}, ipEntry.HostName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><span style="COLOR: #ff0000">GDI+方面的：</span><br><strong>二十二、GDI+入门介绍：</strong><br>using System;<br>using System.Drawing;<br>using System.Collections;<br>using System.ComponentModel;<br>using System.Windows.Forms;<br>using System.Data;</p>
<p>public class Form1 : System.Windows.Forms.Form<br>{<br>&nbsp;&nbsp;&nbsp; private System.ComponentModel.Container components = null;</p>
<p>&nbsp;&nbsp;&nbsp; public Form1()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; protected override void Dispose( bool disposing )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( disposing )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (components != null) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; components.Dispose();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Dispose( disposing );<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; #region Windows Form Designer generated code<br>&nbsp;&nbsp;&nbsp; private void InitializeComponent()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ClientSize = new System.Drawing.Size(292, 273);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Name = Form1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Text = Form1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; #endregion</p>
<p>&nbsp;&nbsp;&nbsp; [STAThread]<br>&nbsp;&nbsp;&nbsp; static void Main() <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application.Run(new Form1());<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics g=e.Graphics;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.DrawLine(new Pen(Color.Blue),10,10,210,110);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.DrawRectangle(new Pen(Color.Red),10,10,200,100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.DrawEllipse(new Pen(Color.Yellow),10,150,200,100);<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><span style="COLOR: #ff0000">XML方面的：<br></span><strong>二十三、读取XML文件：</strong><br>using System;<br>using System.Xml;&nbsp; </p>
<p>class TestReadXML<br>{<br>&nbsp;&nbsp;&nbsp; public static void Main()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlTextReader reader&nbsp; = new XmlTextReader(C:\\test.xml);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.Read();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (reader.Read())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.MoveToElement();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(XmlTextReader Properties Test);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(===================);&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Read this properties of element and display them on console<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Name: + reader.Name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Base URI: + reader.BaseURI);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Local Name: + reader.LocalName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Attribute Count: + reader.AttributeCount.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Depth: + reader.Depth.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Line Number: + reader.LineNumber.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Node Type: + reader.NodeType.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Attribute Count: + reader.Value.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>} <br><strong>二十四、写XML文件：</strong><br>using System; <br>using System.Xml; </p>
<p>public class TestWriteXMLFile <br>{ <br>&nbsp;&nbsp;&nbsp; public static int Main(string[] args) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Creates an XML file is not exist <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlTextWriter writer = new XmlTextWriter(C:\\temp\\xmltest.xml, null); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Starts a new document <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartDocument(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Write comments <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteComment(Commentss: XmlWriter Test Program); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteProcessingInstruction(Instruction,Person Record); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add elements to the file <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(p, person, urn:person); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(LastName,); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteString(Chand); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndElement(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteStartElement(FirstName,); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteString(Mahesh); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndElement(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteElementInt16(age,, 25); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Ends the document <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.WriteEndDocument(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine (Exception: {0}, e.ToString()); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; <br>&nbsp;&nbsp;&nbsp; } <br>} </p>
<p><span style="COLOR: #ff0000">Web Service方面的：</span><br><strong>二十五、一个Web Service的小例子：<br></strong>&lt;% @WebService Language=C# Class=TestWS %&gt;</p>
<p>using System.Web.Services;</p>
<p>public class TestWS : System.Web.Services.WebService<br>{<br>&nbsp;&nbsp;&nbsp; [WebMethod()]<br>&nbsp;&nbsp;&nbsp; public string StringFromWebService()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return This is a string from web service.;<br>&nbsp;&nbsp;&nbsp; }<br>} </p>
</div><img src ="http://www.cppblog.com/mzty/aggbug/53835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-18 12:08 <a href="http://www.cppblog.com/mzty/archive/2008/06/18/53835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用ACIS + Hoops + InterOp实现CAD软件</title><link>http://www.cppblog.com/mzty/archive/2008/06/17/53702.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 17 Jun 2008 06:42:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/17/53702.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/53702.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/17/53702.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/53702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/53702.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">利用ACIS + Hoops + InterOp实现CAD软件<o:p></o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">一 ACIS<br><br><o:p></o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">3D ACIS&#174; Modeler (ACIS)是Spatial公司开发的业界领先的3D造型引擎，在全球有14个行业（包括<br>CAD/CAM/CAE、建筑、动画、造船等）的数百家开发厂商使用这个产品。ACIS为全球一些非常著名的软件开发商和制造商提供了强大的3D造型功能，他们在此基础上创建出了具有创新性和高性能的应用程序。自2000年11月成为（达索）Dassault Syst&#232;mes的全资子公司后，Spatial公司更加贴近用户，新版本的3D ACIS&#174;Modeler在产品性能以及稳定性等方面均有大幅度地提升，得到了越来越多用户的普遍称赞和认可。功能<o:p></o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ACIS采用开放的和面向对象的C++架构，拥有强大的3D造型能力。ACIS集成了线框、曲面和实体造型的功能，支持流形和非流形拓扑，具备非常丰富的几何运算集，因此非常适用于构建具有混合造型功能的3D应用程序。ACIS不仅具备非常完善的3D建模的基本功能，而且具有很强的灵活性，满足了不同应用程序开发的需要。<br><o:p><br></o:p></p>
<table cellSpacing=4 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>为了简化在ACIS上进行开发，Spatial根据开发者的预算确定许可证和收费计划。我们的商业模式允许新用户在开发的第一年，甚至是产品发布之前都无需向Spatial支付任何产品专利费用。因此我们的收入直接与用户产品上市时间和用户的成功挂钩。用户的成功才是我们的成功。<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>ACIS 核心功能<o:p></o:p></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D 造型 <o:p></o:p></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>将2D曲线经拉伸、旋转、扫掠等操作生成复杂的3D曲面或实体 <o:p></o:p></p>
            <ul type=disc>
                <li>高级倒角和圆角操作 <o:p></o:p>
                <li>网格曲面生成 <o:p></o:p>
                <li>阵列操作 <o:p></o:p>
                <li>实体抽壳和曲面加厚 <o:p></o:p>
                <li>曲线、曲面和实体的交互式弯曲、扭曲、延展、变形 <o:p></o:p>
                <li>曲线、曲面、实体的交、并、差运算 <o:p></o:p>
                <li>放样操作 <o:p></o:p>
                <li>模型中拔模面生成、曲面等距和移动<o:p></o:p> </li>
            </ul>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D 模型管理 <o:p></o:p></p>
            <ul type=disc>
                <li>在模型的任何级别关联用户自定义的数据 <o:p></o:p>
                <li>跟踪几何和拓扑改变 <o:p></o:p>
                <li>计算质量和体积 <o:p></o:p>
                <li>使用单元拓扑表示实体模型子域 <o:p></o:p>
                <li>独立于历史流的无穷次的撤销（undo）和恢复（redo）操作<o:p></o:p> </li>
            </ul>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D 模型显示 <o:p></o:p></p>
            <ul type=disc>
                <li>将曲面几何离散成多边形网格表示 <o:p></o:p>
                <li>利用可选可变形造型组件创建高级曲面 <o:p></o:p>
                <li>利用可选PHL V5 组件生成带隐藏线消除的精确2D工程图 <o:p></o:p>
                <li>利用Spatial提供的Tech Soft America的HOOPS/3dAF以及HOOPS/ACIS Bridge等产品搭建图形交互应用程序<o:p></o:p> </li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left><br><br>二HOOPS<br><o:p></o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><br>HOOPS 3D Application Framework (HOOPS/3dAF)是由Tech Soft America公司开发并由Spatial再次销售的产<br>品，该产品为当今世界上领先的3D应用程序提供了核心的图形架构和图形功能，这些3D应用程序涉及CAD/CAM/CAE、<br>工程、可视化和仿真等领域。有了HOOPS/3dAF，用户就站在一个高起点上，能够快速和有效地开发和维护高性能的用户应用程序。用户通过将HOOPS/3dAF集成到相应的软件开发中，可以更好地管理开发成本、优化资源和缩短产品上市时间。<br><o:p></o:p></p>
<h2><br>快速和灵活的开发<o:p></o:p></h2>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">HOOPS/3dAF是一个成熟、健壮的应用程序框架，而且也在不断地进行更新以满足日益变化的软件市场需求。该组件包不仅拥有不寻常的图形功能，而且使用非常灵活，加速了应用程序的开发和产品上市。HOOPS/3dAF是一个可扩展的、模块化和开放的架构，提供了非常全面的应用程序开发接口（API）供用户选用或根据用户特定需求进行定制。另外，HOOPS/3dAF组件包还提供了基于可读源代码的示例应用程序，从而可以帮助用户加快开发速度。 <o:p></o:p></p>
<h3>多种平台支持和开发工具集<o:p></o:p></h3>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">HOOPS/3dAF 工具包可以工作在多种平台上，不仅支持各种32位操作系统上，而且也可以允许在多种64位操作系统上工作。该工具包所支持的主要平台包括Windows、UNIX和Linux。HOOPS/3dAF和公共用户接口工具集可以创建桌面应用程序，或 根据用户要求做成一个ActiveX控件或多平台的网络浏览器的插件。HOOPS/3dAF组件包支持的编程语言包括Python、Java（对选定组件）、C、C++和FORTRAN等。 <o:p></o:p></p>
<h3>性能和高级功能<o:p></o:p></h3>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">HOOPS/3dAF不仅仅可以加快产品上市，它还为应用程序的开发提供了高级的2D和3D图形功能。HOOPS/3dAF提供了对Unicode字体的全面支持、精确的矢量图硬拷贝、完善的选择算法和高级颜色插值能力等。该产品与几何造型引擎紧密集成，能够开发出具有丰富图形功能的3D造型应用程序序。HOOPS/3dAF具备大模型显示的能力，为此，即使对于非常复杂的模型数据，用户也可以实现实时渲染和便捷的人机交互。 <o:p></o:p></p>
<h3>HOOPS/3dAF的集成组件<o:p></o:p></h3>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">HOOPS 3D Graphics System 是一个特色鲜明的场景图应用程序接口，封装了高度优化的数据结构和用于2D和3D图形数据的创建、编辑、存储、操作、查询和渲染的算法。<br><br>HOOPS MVO Class Library 是一系列独立于平台和GUI的C++类，这些类是构造一般3D应用程序功能（如模型的创建、显示、动画和操作等）的基础。<br><br>HOOPS Stream Toolkit 是一系列独立于平台和GUI的C++类，这些类使应用程序可以在基于本地网或Internet创建和流化处理高度压缩的数据文件（这些数据文件可以是2D、3D数据，也可以是用户自定义数据）。HOOPS Stream Toolkit组件既可以和HOOPS/3dAF一起使用，也可以单独使用。<br><br>HOOPS Graphical User Interface 是一系列连接不同GUI工具包的集成模块，可以连接以下GUI： <o:p></o:p></p>
<ul type=disc>
    <li>Microsoft Foundation Classes (MFC) for Windows <o:p></o:p>
    <li>ActiveX and ATL Control Classes for Windows <o:p></o:p>
    <li>Netscape Plug-in Classes for Windows and UNIX <o:p></o:p>
    <li>Motif Toolkit for UNIX <o:p></o:p>
    <li>Qt Toolkit for cross-platform GUI development.<o:p></o:p> </li>
</ul>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">HOOPS Geometric Modeler Bridges 与几何造型引擎（如3D ACIS&#174; Modeler）紧密集成，大大简化了基于实体和基于曲面的应用程序的开发。<br><br>HOOPS Reference Applications 以源代码的方式提供了丰富的例子，详细说明了HOOPS/3dAF的基本架构和使用方法，以及如何使用HOOPS/3dAF成功开发应用程序。<br><br>HOOPS 基本图元和属性支持 包括： <o:p></o:p></p>
<ul type=disc>
    <li>几何：Images, Unicode Text, Points, Lines, Polygons, Polylines, Polycylinders,NURBS curves, NURBS surfaces, Arcs, Ellipses, Circles, Tristrips, Trifans,Indexed Facesets, Cutting Planes, Capping Geometry <o:p></o:p>
    <li>几何属性：Color, Transparency, Textures, Visibility, Patterns (Facet,edge 和 Line), Color Ramps, Lighting Interpolation, Selectability <o:p></o:p>
    <li>渲染属性：Shaded, Analytic Hidden Line, Wireframe,Color Maps, Various Color Ramping Algorithms, Window Background Coloring<o:p></o:p> </li>
</ul>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>三 3D InterOp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作为3D技术的领导者，Spatial意识到实现不同格式数据（包括原始格式数据和非原始格式数据）有效转换的必要性。为此，Spatial开发了3D InterOp数据转换组件，开发者们可以很容易地将我们提供的先进的3D数据转换技术集成到各自的3D软件产品中，这些软件产品可以是CAD/CAM/CAE应用程序、数据管理系统（如PDM、EDM和MES等）、协同系统以及可视化解决方案等<o:p></o:p></p>
<table cellSpacing=4 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top colSpan=4>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>Spatial的InterOp转换器使用户无需大量编程或购买昂贵的用于打开某种格式数据的原始软件。通过使用我们的InterOp 转换器，用户可以将更多的精力放在具有核心竞争力和高附加值技术的开发上，同时又会减少资金的投入，缩短开发周期，降低维护成本，加快产品上市。 <o:p></o:p></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>透明、准确的数据转换<o:p></o:p></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>Spatial全面的InterOp组件包能够透明地实现实体、曲面和线框数据的直接或间接地转换（包括采用中间格式或原始库的方式），可以转换的3D数据格式包括CATIA V5, CATIA V4, IGES, STEP, VDA-FS, Pro/ENGINEER (Pro/E), Parasolid (PS), Unigraphics (UG), SolidWorks, Inventor, 和ACIS&#174;。每一种转换器都经过精细微调，并经常更新，确保3D数据转换的准确。每周，我们的转换器都将经历225,000多个测试，以保证转换质量。 <o:p></o:p></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>最新版本InterOp(R18SP1)支持的格式 <o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>产品名称<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>用途<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读入版本支持<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>写出版本支持<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS CATIA V4 Reader/Writer <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>实现ACIS 文件和CATIA V4 文件之间的双向转换 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>4.1.9～4.2.4 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>4.2.1～4.2.4 <o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS CATIA V5 Reader <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读取CATIA V5 文件到基于ACIS的应用程序中 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>R2～R18<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_1"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS CATIA V5 Manufacturing Option <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读取CATIA V5 文件中的加工信息，PMI数据和孔特征到基于ACIS的应用程序中 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>R2～R18<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_2"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS CATIA V5 Writer <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>将基于ACIS的应用程序生成的模型文件写成CATIA V5文件 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>R6～R18<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_3"><o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS CATIA V5 Reader/Writer <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>实现ACIS 文件和CATIA V5 文件之间的双向转换 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>R2～R18<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_4"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>R6～R18<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_5"><o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS IGES Reader/Writer <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>实现ACIS 文件和IGES 格式文件之间的双向转换 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>～5.3 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>～5.3 <o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS Inventor Reader <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读取Inventor文件到基于ACIS的应用程序中 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>6～12<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_6"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS Parasolid Reader/Writer* <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>实现ACIS 文件和Parasolid 文件之间的双向转换<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>10.0～19.0<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_7"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>12.0～19.0<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_8"><o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS Pro/E Reader <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读取Pro/Engineer 文件到基于ACIS的应用程序中 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>16～Wildfire3<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS Pro/E Manufacturing Option<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读取Pro/Engineer 文件中的加工信息、PMI数据和孔特征到基于ACIS的应用程序中 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>16～Wildfire3<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS SolidWorks Reader*<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读取SolidWorks文件到基于ACIS的应用程序中<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>98～2008<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_9"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS STEP Reader/Writer <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>实现ACIS 文件和STEP 格式文件之间的双向转换 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>AP203, AP214**<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>AP203, AP214**<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS Unigraphics Reader*<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读取 Unigraphics文件到基于ACIS的应用程序中<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>V11～18 NX1.0-5.0 <img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_10"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS Unigraphics Manufacturing Option <img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_11"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>读取UG文件中的加工信息，PMI数据和孔特征到基于ACIS的应用程序中 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>NX2.0,4.0-5.0<img height=13 alt=http://www.spatial.com.cn/images/new.gif src="file:///C:/DOCUME~1/Zhuxia/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.gif" width=31 v:shapes="Picture_x0020_12"><o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>&#215;<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=140>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>3D InterOp ACIS VDA-FS Reader/Writer <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=165>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>实现 ACIS 文件和VDA-FS 文件之间的双向转换 <o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=99>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>～2.0<o:p></o:p></p>
            </td>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top width=96>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>2.0<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top colSpan=4>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>* 　表示该转换接口需要从TSA或其他Parasolid供应商处获得Parasolid的授权<br>**　表示AP214暂时只支持几何数据读写<o:p></o:p></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" vAlign=top colSpan=4>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>出众的CATIA V5读写能力<o:p></o:p></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>CATIA V5 在是工业界发展最快且拥有最大装机量的软件产品之一。现在Spatial提供了读写CATIA V5格式的工具InterOp CATIA V5 Reader和InterOp CATIA V5 Writer，该工具的开发直接采用了由CATIA V5开发商（达索）Dassault Syst&#232;mes提供的原装库，因此在转换精度上首屈一指。 <o:p></o:p></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>随需而定的可扩展架构<o:p></o:p></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>Spatial的3D InterOp Exchange组件和3D InterOp Translators组件合在一起旨在为3D应用程序开发提供易于扩展的数据转换平台。InterOp Translators可以直接加载到可即插即用的3D InterOp Exchange架构中，当用户的需求发生改变时，通过便捷的API来增强数据转换能力。<o:p></o:p></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><o:p>&nbsp;</o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">四 参考<o:p></o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><a href="http://www.techsoft3d.com/">http://www.techsoft3d.com/</a><o:p></o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><a href="http://www.spatial.com/">http://www.spatial.com</a><o:p></o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><a href="http://www.spatial.com.cn/">http://www.spatial.com.cn</a><o:p></o:p></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><o:p>&nbsp;</o:p></p><img src ="http://www.cppblog.com/mzty/aggbug/53702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-17 14:42 <a href="http://www.cppblog.com/mzty/archive/2008/06/17/53702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AutoCAD ObjectARX和RealDWG资料</title><link>http://www.cppblog.com/mzty/archive/2008/06/17/53652.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 17 Jun 2008 01:05:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/17/53652.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/53652.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/17/53652.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/53652.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/53652.html</trackback:ping><description><![CDATA[<br>总结：<br><br>AutoCAD ObjectARX：免费的AutoCAD二次开发SDK（<a href="http://usa.autodesk.com/adsk/servlet/item?siteID=123112&amp;id=785550">http://usa.autodesk.com/adsk/servlet/item?siteID=123112&amp;id=785550</a>）<br>RealDWG： 提供DWG图纸的读写，不需要AutoCAD的安装的支持，收费的！<br><br>blog：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.cadkicks.com/"><u><font color=#810081>http://www.cadkicks.com/</font></u></a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.online-proxy.info/">http://www.online-proxy.info/</a>&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://through-the-interface.typepad.com/">http://through-the-interface.typepad.com/</a><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.online-proxy.info/">http://www.online-proxy.info/</a> + <a href="http://arxdummies.blogspot.com/">http://arxdummies.blogspot.com</a><br><br>website：<a href="http://www.objectarx.net/">http://www.objectarx.net/</a><br><br><br>RealDWG online：<a href="http://download.autodesk.com/media/adn/AdskCompTech.html">http://download.autodesk.com/media/adn/AdskCompTech.html</a><br><br>RealDWG download：<a href="http://download.autodesk.com/media/adn/DevTV-Introduction-to-RealDWG-Programming.zip">http://download.autodesk.com/media/adn/DevTV-Introduction-to-RealDWG-Programming.zip</a><br><br>AutoCAD ObjectARX ：<a href="http://download.autodesk.com/media/adn/DevTV_Introduction_to_AutoCAD_NET_Programming.zip">http://download.autodesk.com/media/adn/DevTV_Introduction_to_AutoCAD_NET_Programming.zip</a> <br><br>my ppts and samples：<br><br>其他：<br><br><br><br><img src ="http://www.cppblog.com/mzty/aggbug/53652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-17 09:05 <a href="http://www.cppblog.com/mzty/archive/2008/06/17/53652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++和CSharp增加AutoCAD的菜单menu</title><link>http://www.cppblog.com/mzty/archive/2008/06/17/53651.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 17 Jun 2008 00:55:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/17/53651.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/53651.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/17/53651.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/53651.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/53651.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 c++ COM接口voidaddMenuThroughCom(){&nbsp;&nbsp;&nbsp;&nbsp;AutoCAD::IAcadApplication&nbsp;*pAcad;&nbsp;&nbsp;&nbsp;&nbsp;AutoCAD::IAcadMenuBar&nbsp;*pMenuBar;&nbsp;&nbsp;&nbsp;&nbsp;AutoCAD::IAcadMe...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2008/06/17/53651.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/53651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-17 08:55 <a href="http://www.cppblog.com/mzty/archive/2008/06/17/53651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CSharp启动AutoCAD</title><link>http://www.cppblog.com/mzty/archive/2008/06/17/53649.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 17 Jun 2008 00:46:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/17/53649.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/53649.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/17/53649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/53649.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/53649.html</trackback:ping><description><![CDATA[<br>一 我们可以通过AutoCAD安装以后提供的COM接口启动AutoCAD。<br><br>COM组件为： <font face=Calibri><font size=7><br>AutoCAD/</font><span style="FONT-SIZE: 30pt; COLOR: black; FONT-FAMILY: Calibri; language: en-US; mso-ascii-font-family: Calibri; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt">ObjectDBX</span></font><span style="FONT-SIZE: 30pt; COLOR: black; FONT-FAMILY: Calibri; language: en-US; mso-ascii-font-family: Calibri; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt"> Common 17.1 Type Library (</span><span style="FONT-SIZE: 30pt; COLOR: red; FONT-FAMILY: Calibri; language: en-US; mso-ascii-font-family: Calibri; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-font-kerning: 12.0pt">Autodesk.AutoCAD.Interop.Common.dll</span><span style="FONT-SIZE: 30pt; COLOR: black; FONT-FAMILY: Calibri; language: en-US; mso-ascii-font-family: Calibri; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt">). <br><span style="FONT-SIZE: 30pt; COLOR: black; FONT-FAMILY: Calibri; language: en-US; mso-ascii-font-family: Calibri; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt">AutoCAD 2009 Type Library (<span style="FONT-SIZE: 30pt; COLOR: red; FONT-FAMILY: Calibri; language: en-US; mso-ascii-font-family: Calibri; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-font-kerning: 12.0pt">Autodesk.AutoCAD.Interop.dll</span><span style="FONT-SIZE: 30pt; COLOR: black; FONT-FAMILY: Calibri; language: en-US; mso-ascii-font-family: Calibri; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt">)</span>&nbsp;</span></span><span style="FONT-SIZE: 30pt; COLOR: black; FONT-FAMILY: Calibri; language: en-US; mso-ascii-font-family: Calibri; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt">&nbsp;&nbsp;&nbsp;</span><br><br>二 方法一<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Way1()<br><img id=Codehighlighter1_42_979_Open_Image onclick="this.style.display='none'; Codehighlighter1_42_979_Open_Text.style.display='none'; Codehighlighter1_42_979_Closed_Image.style.display='inline'; Codehighlighter1_42_979_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_42_979_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_42_979_Closed_Text.style.display='none'; Codehighlighter1_42_979_Open_Image.style.display='inline'; Codehighlighter1_42_979_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_42_979_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_42_979_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;progID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">AutoCAD.Application.17.1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AcadApplication&nbsp;acApp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_177_266_Open_Image onclick="this.style.display='none'; Codehighlighter1_177_266_Open_Text.style.display='none'; Codehighlighter1_177_266_Closed_Image.style.display='inline'; Codehighlighter1_177_266_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_177_266_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_177_266_Closed_Text.style.display='none'; Codehighlighter1_177_266_Open_Image.style.display='inline'; Codehighlighter1_177_266_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_177_266_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_177_266_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acApp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(AcadApplication)Marshal.GetActiveObject(progID);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_298_665_Open_Image onclick="this.style.display='none'; Codehighlighter1_298_665_Open_Text.style.display='none'; Codehighlighter1_298_665_Closed_Image.style.display='inline'; Codehighlighter1_298_665_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_298_665_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_298_665_Closed_Text.style.display='none'; Codehighlighter1_298_665_Open_Image.style.display='inline'; Codehighlighter1_298_665_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_298_665_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_298_665_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_336_504_Open_Image onclick="this.style.display='none'; Codehighlighter1_336_504_Open_Text.style.display='none'; Codehighlighter1_336_504_Closed_Image.style.display='inline'; Codehighlighter1_336_504_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_336_504_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_336_504_Closed_Text.style.display='none'; Codehighlighter1_336_504_Open_Image.style.display='inline'; Codehighlighter1_336_504_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_336_504_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_336_504_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;acType&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Type.GetTypeFromProgID(progID);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acApp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(AcadApplication)Activator.CreateInstance(acType,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_544_651_Open_Image onclick="this.style.display='none'; Codehighlighter1_544_651_Open_Text.style.display='none'; Codehighlighter1_544_651_Closed_Image.style.display='inline'; Codehighlighter1_544_651_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_544_651_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_544_651_Closed_Text.style.display='none'; Codehighlighter1_544_651_Open_Image.style.display='inline'; Codehighlighter1_544_651_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_544_651_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_544_651_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Cannot&nbsp;create&nbsp;object&nbsp;of&nbsp;type&nbsp;\</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">&nbsp;+progID&nbsp;+&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(acApp&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_710_961_Open_Image onclick="this.style.display='none'; Codehighlighter1_710_961_Open_Text.style.display='none'; Codehighlighter1_710_961_Closed_Image.style.display='inline'; Codehighlighter1_710_961_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_710_961_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_710_961_Closed_Text.style.display='none'; Codehighlighter1_710_961_Open_Image.style.display='inline'; Codehighlighter1_710_961_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_710_961_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_710_961_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;By&nbsp;the&nbsp;time&nbsp;this&nbsp;is&nbsp;reached&nbsp;AutoCAD&nbsp;is&nbsp;fully<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;functional&nbsp;and&nbsp;can&nbsp;be&nbsp;interacted&nbsp;with&nbsp;through&nbsp;code</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acApp.Visible&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acApp.ActiveDocument.SendCommand(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_MYCOMMAND&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>三&nbsp;方法二<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Way2()<br><img id=Codehighlighter1_42_2474_Open_Image onclick="this.style.display='none'; Codehighlighter1_42_2474_Open_Text.style.display='none'; Codehighlighter1_42_2474_Closed_Image.style.display='inline'; Codehighlighter1_42_2474_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_42_2474_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_42_2474_Closed_Text.style.display='none'; Codehighlighter1_42_2474_Open_Image.style.display='inline'; Codehighlighter1_42_2474_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_42_2474_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_42_2474_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;progID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">AutoCAD.Application.17.1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;exePath&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">E:\Program&nbsp;Files\Autodesk\ACADM&nbsp;2009\acad.exe</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AcadApplication&nbsp;acApp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Let's&nbsp;first&nbsp;check&nbsp;we&nbsp;don't&nbsp;have&nbsp;AutoCAD&nbsp;already&nbsp;running</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_337_424_Open_Image onclick="this.style.display='none'; Codehighlighter1_337_424_Open_Text.style.display='none'; Codehighlighter1_337_424_Closed_Image.style.display='inline'; Codehighlighter1_337_424_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_337_424_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_337_424_Closed_Text.style.display='none'; Codehighlighter1_337_424_Open_Image.style.display='inline'; Codehighlighter1_337_424_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_337_424_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_337_424_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acApp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(AcadApplication)Marshal.GetActiveObject(progID);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_444_446_Open_Image onclick="this.style.display='none'; Codehighlighter1_444_446_Open_Text.style.display='none'; Codehighlighter1_444_446_Closed_Image.style.display='inline'; Codehighlighter1_444_446_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_444_446_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_444_446_Closed_Text.style.display='none'; Codehighlighter1_444_446_Open_Image.style.display='inline'; Codehighlighter1_444_446_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_444_446_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_444_446_Open_Text><span style="COLOR: #000000">{&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(acApp&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_491_584_Open_Image onclick="this.style.display='none'; Codehighlighter1_491_584_Open_Text.style.display='none'; Codehighlighter1_491_584_Closed_Image.style.display='inline'; Codehighlighter1_491_584_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_491_584_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_491_584_Closed_Text.style.display='none'; Codehighlighter1_491_584_Open_Image.style.display='inline'; Codehighlighter1_491_584_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_491_584_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_491_584_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">An&nbsp;instance&nbsp;of&nbsp;AutoCAD&nbsp;is&nbsp;already&nbsp;running.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_615_2300_Open_Image onclick="this.style.display='none'; Codehighlighter1_615_2300_Open_Text.style.display='none'; Codehighlighter1_615_2300_Closed_Image.style.display='inline'; Codehighlighter1_615_2300_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_615_2300_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_615_2300_Closed_Text.style.display='none'; Codehighlighter1_615_2300_Open_Image.style.display='inline'; Codehighlighter1_615_2300_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_615_2300_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_615_2300_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_653_2116_Open_Image onclick="this.style.display='none'; Codehighlighter1_653_2116_Open_Text.style.display='none'; Codehighlighter1_653_2116_Closed_Image.style.display='inline'; Codehighlighter1_653_2116_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_653_2116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_653_2116_Closed_Text.style.display='none'; Codehighlighter1_653_2116_Open_Image.style.display='inline'; Codehighlighter1_653_2116_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_653_2116_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_653_2116_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Use&nbsp;classes&nbsp;from&nbsp;the&nbsp;System.Diagnostics&nbsp;namespace<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;to&nbsp;launch&nbsp;our&nbsp;AutoCAD&nbsp;process&nbsp;with&nbsp;command-line<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;options</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessStartInfo&nbsp;psi&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ProcessStartInfo(exePath,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/p&nbsp;myprofile</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;psi.WorkingDirectory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">c:\temp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process&nbsp;pr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Process.Start(psi);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Wait&nbsp;for&nbsp;AutoCAD&nbsp;to&nbsp;be&nbsp;ready&nbsp;for&nbsp;input<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;This&nbsp;doesn't&nbsp;wait&nbsp;until&nbsp;AutoCAD&nbsp;is&nbsp;ready<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;to&nbsp;receive&nbsp;COM&nbsp;requests,&nbsp;it&nbsp;seems</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pr.WaitForInputIdle();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Connect&nbsp;to&nbsp;our&nbsp;process&nbsp;using&nbsp;COM<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;We're&nbsp;going&nbsp;to&nbsp;loop&nbsp;infinitely&nbsp;until&nbsp;we&nbsp;get&nbsp;the<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;AutoCAD&nbsp;object.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;A&nbsp;little&nbsp;risky,&nbsp;unless&nbsp;we&nbsp;implement&nbsp;a&nbsp;timeout<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;mechanism&nbsp;or&nbsp;let&nbsp;the&nbsp;user&nbsp;cancel</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(acApp&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_1621_2097_Open_Image onclick="this.style.display='none'; Codehighlighter1_1621_2097_Open_Text.style.display='none'; Codehighlighter1_1621_2097_Closed_Image.style.display='inline'; Codehighlighter1_1621_2097_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1621_2097_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1621_2097_Closed_Text.style.display='none'; Codehighlighter1_1621_2097_Open_Image.style.display='inline'; Codehighlighter1_1621_2097_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1621_2097_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1621_2097_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1675_1787_Open_Image onclick="this.style.display='none'; Codehighlighter1_1675_1787_Open_Text.style.display='none'; Codehighlighter1_1675_1787_Closed_Image.style.display='inline'; Codehighlighter1_1675_1787_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1675_1787_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1675_1787_Closed_Text.style.display='none'; Codehighlighter1_1675_1787_Open_Image.style.display='inline'; Codehighlighter1_1675_1787_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1675_1787_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1675_1787_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acApp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(AcadApplication)Marshal.GetActiveObject(progID);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1843_2074_Open_Image onclick="this.style.display='none'; Codehighlighter1_1843_2074_Open_Text.style.display='none'; Codehighlighter1_1843_2074_Closed_Image.style.display='inline'; Codehighlighter1_1843_2074_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1843_2074_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1843_2074_Closed_Text.style.display='none'; Codehighlighter1_1843_2074_Open_Image.style.display='inline'; Codehighlighter1_1843_2074_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1843_2074_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1843_2074_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Let's&nbsp;let&nbsp;the&nbsp;application&nbsp;check&nbsp;its&nbsp;message<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;loop,&nbsp;in&nbsp;case&nbsp;the&nbsp;user&nbsp;has&nbsp;exited&nbsp;or&nbsp;cancelled</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.DoEvents();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(Exception&nbsp;ex)<br><img id=Codehighlighter1_2172_2286_Open_Image onclick="this.style.display='none'; Codehighlighter1_2172_2286_Open_Text.style.display='none'; Codehighlighter1_2172_2286_Closed_Image.style.display='inline'; Codehighlighter1_2172_2286_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2172_2286_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2172_2286_Closed_Text.style.display='none'; Codehighlighter1_2172_2286_Open_Image.style.display='inline'; Codehighlighter1_2172_2286_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2172_2286_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2172_2286_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Cannot&nbsp;create&nbsp;or&nbsp;attach&nbsp;to&nbsp;AutoCAD&nbsp;object:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ex.Message);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(acApp&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2346_2463_Open_Image onclick="this.style.display='none'; Codehighlighter1_2346_2463_Open_Text.style.display='none'; Codehighlighter1_2346_2463_Closed_Image.style.display='inline'; Codehighlighter1_2346_2463_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2346_2463_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2346_2463_Closed_Text.style.display='none'; Codehighlighter1_2346_2463_Open_Image.style.display='inline'; Codehighlighter1_2346_2463_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2346_2463_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2346_2463_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acApp.Visible&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acApp.ActiveDocument.SendCommand(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_MYCOMMAND&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>四 当然也可以使用C++去调用COM接口。 <br><img src ="http://www.cppblog.com/mzty/aggbug/53649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-17 08:46 <a href="http://www.cppblog.com/mzty/archive/2008/06/17/53649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建可扩展的应用程序</title><link>http://www.cppblog.com/mzty/archive/2008/06/06/52381.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 06 Jun 2008 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/06/52381.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/52381.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/06/52381.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/52381.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/52381.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt"><br></span><span style="FONT-FAMILY: 宋体">一 构建可扩展的应用程序<br><br>什么是可扩展的应用程序？没有标准的定义，一些实例：<br>Eclipse，Firefox，Office，Ogre, AutoCAD, pro/e, other design software...<br><br>二 可扩展应用程序开发过程<br>&nbsp;&nbsp;&nbsp;开发过程我们尽量的使我们的软件能够适应变化，能够很容易的增加或修改功能，不可避免的要使用design pattern，当有新的需求进入的时候，原有的架构不能满足要求，这时要refactoring，其实agile software 他强调的就使软件是一个不断的迭代的过程，要跟着用户的需求不对的变化，总之使我们的应用程序有好的framework，好的architecture！<br><br>三&nbsp;Plug-ins插件模式<br>1) C++ 主要技术：<br>&nbsp;&nbsp;&nbsp;LoadLibrary()/GetProcAddress()/FreeLibrary()&nbsp;<br>&nbsp;&nbsp;&nbsp;C++类图如下：<br><img src="http://www.cppblog.com/images/cppblog_com/mzty/7317/o_CppPluginManager.PNG" border=0><br>&nbsp;&nbsp;&nbsp;samples代码下载：<a href="http://www.cppblog.com/Files/mzty/Plugins.zip">http://www.cppblog.com/Files/mzty/Plugins.zip</a><br><br></span><br>2）C#主要技术：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assembly.Load() / LoadFile() / LoadFrom() （区别：LoadFile只load本dll，LoadFrom会load其他引用到的dll）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type.GetInterface() / IsInterface() / GetMethod() / GetProperty() / / &#8230;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Activator.CreateInstance (Type) / Assembly.CreateInstance(String) / Type.GetConstructor().invoke()&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C#类图如下：<br><img src="http://www.cppblog.com/images/cppblog_com/mzty/7317/o_CsharpPluginManager.PNG" border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sample代码下载：<a href="http://www.cppblog.com/Files/mzty/Plugins.zip">http://www.cppblog.com/Files/mzty/Plugins.zip</a><br><br>3）CLI\C++,Managed C++主要目的：（使应用程序可以同时支持NativeC++和net的plugins）<br><img src="http://www.cppblog.com/images/cppblog_com/mzty/7317/o_CLICPP.PNG" border=0><br><br>4）总之，经过上面的三步，我们可以实现一个应用程序，可以加载C++和C#的plugins（使用CLI\C++封装），能够动态的加载（C#用Appdomain），能够控制只加载需要的dll（配置文件或C++的dll改为其他的名字）。<br><br>四&nbsp;VBA\VSTA集成环境中开发<br><br>VBA和VSTA都是microsoft提过的可以被嵌入的其他的应用程序中的开发工作，VBA是用集成VB的开发IDE，VSTA是集成基于.net的开发IDE。<br>架构如下图：<br><img src="http://www.cppblog.com/images/cppblog_com/mzty/7317/o_VSTA.PNG" border=0><br>其他：<a href="http://msdn.microsoft.com/en-us/isv/bb190538.aspx">http://msdn.microsoft.com/en-us/isv/bb190538.aspx</a>&nbsp;和 <a href="http://www.summsoft.com/">http://www.summsoft.com/</a><br><br>五&nbsp;支持脚本的集成开发<br><br>关于是应用程序支持脚本语言的集成开发，可以查看脚本语言的帮助，一般都有这方面的支持，可以看Python : <a href="http://www.python.org/">www.python.org</a>, 比如python嵌入到AutoCAD的开源项目PyACAD，<a href="http://pyacad.sourceforge.net/">http://pyacad.sourceforge.net/</a>&nbsp;。<br><br>六&nbsp;总结<br>在开发我们自己的应用程序的时候考虑，开放性，可扩展性！<img src ="http://www.cppblog.com/mzty/aggbug/52381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-06 17:26 <a href="http://www.cppblog.com/mzty/archive/2008/06/06/52381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLI与C#比较</title><link>http://www.cppblog.com/mzty/archive/2008/06/02/51878.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 02 Jun 2008 06:17:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/06/02/51878.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/51878.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/06/02/51878.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/51878.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/51878.html</trackback:ping><description><![CDATA[<br>来自：The Most Powerful Language for .NET Framework Programming&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://msdn.microsoft.com/en-us/library/ms379617(VS.80).aspx">http://msdn.microsoft.com/en-us/library/ms379617(VS.80).aspx</a><br><br><br>比较：<br>
<table class=dtTABLE borderColor=#00ccff cellSpacing=0 cellPadding=0 border=5>
    <tbody>
        <tr vAlign=top>
            <th width="25%">Description</th>
            <th width="37%">C++/CLI</th>
            <th width="38%">C#</th>
        </tr>
        <tr vAlign=top>
            <td width="25%">Allocate reference type</td>
            <td width="37%"><strong>ReferenceType^ h = gcnew ReferenceType;</strong></td>
            <td width="38%"><strong>ReferenceType h = new ReferenceType();</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Allocate value type</td>
            <td width="37%"><strong>ValueType v(3, 4);</strong></td>
            <td width="38%"><strong>ValueType v = new ValueType(3, 4);</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Reference type, stack semantics</td>
            <td width="37%"><strong>ReferenceType h;</strong></td>
            <td width="38%">N/A</td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Calling <strong>Dispose</strong> method</td>
            <td width="37%"><strong>ReferenceType^ h = gcnew ReferenceType;</strong>
            <p><strong>delete h;</strong></p>
            </td>
            <td width="38%"><strong>ReferenceType h = new ReferenceType();</strong>
            <p><strong>((IDisposable)h).Dispose();</strong></p>
            </td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Implementing <strong>Dispose</strong> method</td>
            <td width="37%"><strong>~TypeName() {}</strong></td>
            <td width="38%"><strong>void IDisposable.Dispose() {}</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Implementing <strong>Finalize</strong> method</td>
            <td width="37%"><strong>!TypeName() {}</strong></td>
            <td width="38%"><strong>~TypeName() {}</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Boxing</td>
            <td width="37%"><strong>int^ h = 123;</strong></td>
            <td width="38%"><strong>object h = 123;</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Unboxing</td>
            <td width="37%"><strong>int^ hi = 123;</strong>
            <p><strong>int c = *hi;</strong></p>
            </td>
            <td width="38%"><strong>object h = 123;</strong>
            <p><strong>int i = (int) h;</strong></p>
            </td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Reference type definition</td>
            <td width="37%"><strong>ref class ReferenceType {};</strong>
            <p><strong>ref struct ReferenceType {};</strong></p>
            </td>
            <td width="38%"><strong>class ReferenceType {}</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Value type definition</td>
            <td width="37%"><strong>value class ValueType {};</strong>
            <p><strong>value struct ValueType {};</strong></p>
            </td>
            <td width="38%"><strong>struct ValueType {}</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Using properties</td>
            <td width="37%"><strong>h.Prop = 123;</strong>
            <p><strong>int v = h.Prop;</strong></p>
            </td>
            <td width="38%"><strong>h.Prop = 123;</strong>
            <p><strong>int v = h.Prop;</strong></p>
            </td>
        </tr>
        <tr vAlign=top>
            <td width="25%">Property definition</td>
            <td width="37%"><strong>property String^ Name <br>{<br>&nbsp;&nbsp;&nbsp; String^ get()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return m_value;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; void set(String^ value)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_value = value;<br>&nbsp;&nbsp;&nbsp; }<br>}</strong></td>
            <td width="38%"><strong>string Name <br>{<br>&nbsp;&nbsp;&nbsp; get<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return m_name;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; set<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_name = value;<br>&nbsp;&nbsp;&nbsp; }<br>}</strong></td>
        </tr>
    </tbody>
</table>
<br>thanks<img src ="http://www.cppblog.com/mzty/aggbug/51878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-06-02 14:17 <a href="http://www.cppblog.com/mzty/archive/2008/06/02/51878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML类图关系</title><link>http://www.cppblog.com/mzty/archive/2008/04/16/47264.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 16 Apr 2008 09:09:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/04/16/47264.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/47264.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/04/16/47264.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/47264.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/47264.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt">本文随便转载，请保留出处：<a href="http://blog.csdn.net/dylgsy/">http://blog.csdn.net/dylgsy/</a></p>
<p style="FONT-SIZE: 12pt">UML的类图关系分为：&nbsp;关联、聚合/组合、依赖、泛化（继承）。而其中关联又分为双向关联、单向关联、自身关联；下面就让我们一起来看看这些关系究竟是什么，以及它们的区别在哪里。<br><br>1、关联<br><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_11.jpg" width=232 border=0><br><br>双向关联：<br>C1-C2：指双方都知道对方的存在，都可以调用对方的公共属性和方法。<br><br>在GOF的设计模式书上是这样描述的：虽然在分析阶段这种关系是适用的，但我们觉得它对于描述设计模式内的类关系来说显得太抽象了，因为在设计阶段关联关系必须被映射为对象引用或指针。对象引用本身就是有向的，更适合表达我们所讨论的那种关系。所以这种关系在设计的时候比较少用到，关联一般都是有向的。<br><br>使用ROSE 生成的代码是这样的：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C1&nbsp;<br><img id=_10_33_Open_Image onclick="this.style.display='none'; document.getElementById('_10_33_Open_Text').style.display='none'; document.getElementById('_10_33_Closed_Image').style.display='inline'; document.getElementById('_10_33_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_10_33_Closed_Image onclick="this.style.display='none'; document.getElementById('_10_33_Closed_Text').style.display='none'; document.getElementById('_10_33_Open_Image').style.display='inline'; document.getElementById('_10_33_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C2*&nbsp;theC2;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C2&nbsp;<br><img id=_47_70_Open_Image onclick="this.style.display='none'; document.getElementById('_47_70_Open_Text').style.display='none'; document.getElementById('_47_70_Closed_Image').style.display='inline'; document.getElementById('_47_70_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_47_70_Closed_Image onclick="this.style.display='none'; document.getElementById('_47_70_Closed_Text').style.display='none'; document.getElementById('_47_70_Open_Image').style.display='inline'; document.getElementById('_47_70_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C1*&nbsp;theC1;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt">双向关联在代码的表现为双方都拥有对方的一个指针，当然也可以是引用或者是值。<br><br><br><br><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_12.jpg" width=232 border=0><br><br>单向关联:<br>C3-&gt;C4：表示相识关系，指C3知道C4，C3可以调用C4的公共属性和方法。没有生命期的依赖。一般是表示为一种引用。<br><br>生成代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C3&nbsp;<br><img id=_10_33_Open_Image onclick="this.style.display='none'; document.getElementById('_10_33_Open_Text').style.display='none'; document.getElementById('_10_33_Closed_Image').style.display='inline'; document.getElementById('_10_33_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_10_33_Closed_Image onclick="this.style.display='none'; document.getElementById('_10_33_Closed_Text').style.display='none'; document.getElementById('_10_33_Open_Image').style.display='inline'; document.getElementById('_10_33_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C4*&nbsp;theC4;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C4&nbsp;<br><img id=_47_50_Open_Image onclick="this.style.display='none'; document.getElementById('_47_50_Open_Text').style.display='none'; document.getElementById('_47_50_Closed_Image').style.display='inline'; document.getElementById('_47_50_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_47_50_Closed_Image onclick="this.style.display='none'; document.getElementById('_47_50_Closed_Text').style.display='none'; document.getElementById('_47_50_Open_Image').style.display='inline'; document.getElementById('_47_50_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt">单向关联的代码就表现为C3有C4的指针，而C4对C3一无所知。<br><br><br></p>
<p style="FONT-SIZE: 12pt"><img height=120 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_13.jpg" width=136 border=0><br><br>自身关联（反身关联）：<br>自己引用自己，带着一个自己的引用。<br><br>代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C14&nbsp;<br><img id=_11_36_Open_Image onclick="this.style.display='none'; document.getElementById('_11_36_Open_Text').style.display='none'; document.getElementById('_11_36_Closed_Image').style.display='inline'; document.getElementById('_11_36_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_11_36_Closed_Image onclick="this.style.display='none'; document.getElementById('_11_36_Closed_Text').style.display='none'; document.getElementById('_11_36_Open_Image').style.display='inline'; document.getElementById('_11_36_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C14*&nbsp;theC14;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt">就是在自己的内部有着一个自身的引用。<br><br>2、聚合/组合<br><br>当类之间有整体-部分关系的时候，我们就可以使用组合或者聚合。<br><br><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_21.jpg" width=232 border=0><br><br>聚合：表示C9聚合C10，但是C10可以离开C9而独立存在（独立存在的意思是在某个应用的问题域中这个类的存在有意义。这句话怎么解，请看下面组合里的解释）。<br><br>代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C9&nbsp;<br><img id=_10_34_Open_Image onclick="this.style.display='none'; document.getElementById('_10_34_Open_Text').style.display='none'; document.getElementById('_10_34_Closed_Image').style.display='inline'; document.getElementById('_10_34_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_10_34_Closed_Image onclick="this.style.display='none'; document.getElementById('_10_34_Closed_Text').style.display='none'; document.getElementById('_10_34_Open_Image').style.display='inline'; document.getElementById('_10_34_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C10&nbsp;theC10;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C10&nbsp;<br><img id=_49_52_Open_Image onclick="this.style.display='none'; document.getElementById('_49_52_Open_Text').style.display='none'; document.getElementById('_49_52_Closed_Image').style.display='inline'; document.getElementById('_49_52_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_49_52_Closed_Image onclick="this.style.display='none'; document.getElementById('_49_52_Closed_Text').style.display='none'; document.getElementById('_49_52_Open_Image').style.display='inline'; document.getElementById('_49_52_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></div>
</div>
<p style="FONT-SIZE: 12pt">&nbsp;</p>
<p style="FONT-SIZE: 12pt"><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_22.jpg" width=232 border=0><br><br>组合（也有人称为包容）：一般是实心菱形加实线箭头表示，如上图所示，表示的是C8被C7包容，而且C8不能离开C7而独立存在。但这是视问题域而定的，例如在关心汽车的领域里，轮胎是一定要组合在汽车类中的，因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里，就算轮胎离开了汽车，它也是有意义的，这就可以用聚合了。在《敏捷开发》中还说到，A组合B，则A需要知道B的生存周期，即可能A负责生成或者释放B，或者A通过某种途径知道B的生成和释放。<br><br>他们的代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C7&nbsp;<br><img id=_10_32_Open_Image onclick="this.style.display='none'; document.getElementById('_10_32_Open_Text').style.display='none'; document.getElementById('_10_32_Closed_Image').style.display='inline'; document.getElementById('_10_32_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_10_32_Closed_Image onclick="this.style.display='none'; document.getElementById('_10_32_Closed_Text').style.display='none'; document.getElementById('_10_32_Open_Image').style.display='inline'; document.getElementById('_10_32_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C8&nbsp;theC8;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C8&nbsp;<br><img id=_46_48_Open_Image onclick="this.style.display='none'; document.getElementById('_46_48_Open_Text').style.display='none'; document.getElementById('_46_48_Closed_Image').style.display='inline'; document.getElementById('_46_48_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_46_48_Closed_Image onclick="this.style.display='none'; document.getElementById('_46_48_Closed_Text').style.display='none'; document.getElementById('_46_48_Open_Image').style.display='inline'; document.getElementById('_46_48_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt">可以看到，代码和聚合是一样的。具体如何区别，可能就只能用语义来区分了。<br><br>3、依赖<br><br><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_31.jpg" width=232 border=0><br><br>依赖:<br>指C5可能要用到C6的一些方法，也可以这样说，要完成C5里的所有功能，一定要有C6的方法协助才行。C5依赖于C6的定义，一般是在C5类的头文件中包含了C6的头文件。ROSE对依赖关系不产生属性。<br><br>注意，要避免双向依赖。一般来说，不应该存在双向依赖。<br><br>ROSE生成的代码如下：<br></p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>//&nbsp;C5.h<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>#include&nbsp;"C6.h"<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C5&nbsp;<br><img id=_35_38_Open_Image onclick="this.style.display='none'; document.getElementById('_35_38_Open_Text').style.display='none'; document.getElementById('_35_38_Closed_Image').style.display='inline'; document.getElementById('_35_38_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_35_38_Closed_Image onclick="this.style.display='none'; document.getElementById('_35_38_Closed_Text').style.display='none'; document.getElementById('_35_38_Open_Image').style.display='inline'; document.getElementById('_35_38_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>//&nbsp;C6.h<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>#include&nbsp;"C5.h"<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C6<br><img id=_76_79_Open_Image onclick="this.style.display='none'; document.getElementById('_76_79_Open_Text').style.display='none'; document.getElementById('_76_79_Closed_Image').style.display='inline'; document.getElementById('_76_79_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_76_79_Closed_Image onclick="this.style.display='none'; document.getElementById('_76_79_Closed_Text').style.display='none'; document.getElementById('_76_79_Open_Image').style.display='inline'; document.getElementById('_76_79_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></div>
</div>
<p style="FONT-SIZE: 12pt">虽然ROSE不生成属性，但在形式上一般是A中的某个方法把B的对象作为参数使用(假设A依赖于B)。如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>#include&nbsp;"B.h"<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;A<br><img id=_23_52_Open_Image onclick="this.style.display='none'; document.getElementById('_23_52_Open_Text').style.display='none'; document.getElementById('_23_52_Closed_Image').style.display='inline'; document.getElementById('_23_52_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_23_52_Closed_Image onclick="this.style.display='none'; document.getElementById('_23_52_Closed_Text').style.display='none'; document.getElementById('_23_52_Open_Image').style.display='inline'; document.getElementById('_23_52_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;Func(B&nbsp;&amp;b);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</div>
</div>
<p style="FONT-SIZE: 12pt">那依赖和聚合\组合、关联等有什么不同呢？<br><br>关联是类之间的一种关系，例如老师教学生，老公和老婆，水壶装水等就是一种关系。这种关系是非常明显的，在问题领域中通过分析直接就能得出。<br><br>依赖是一种弱关联，只要一个类用到另一个类，但是和另一个类的关系不是太明显的时候（可以说是&#8220;uses&#8221;了那个类），就可以把这种关系看成是依赖，依赖也可说是一种偶然的关系，而不是必然的关系，就是&#8220;我在某个方法中偶然用到了它，但在现实中我和它并没多大关系&#8221;。例如我和锤子，我和锤子本来是没关系的，但在有一次要钉钉子的时候，我用到了它，这就是一种依赖，依赖锤子完成钉钉子这件事情。</p>
<p style="FONT-SIZE: 12pt">组合是一种整体-部分的关系，在问题域中这种关系很明显，直接分析就可以得出的。例如轮胎是车的一部分，树叶是树的一部分，手脚是身体的一部分这种的关系，非常明显的整体-部分关系。<br><br>上述的几种关系（关联、聚合/组合、依赖）在代码中可能以指针、引用、值等的方式在另一个类中出现，不拘于形式，但在逻辑上他们就有以上的区别。<br><br>这里还要说明一下，所谓的这些关系只是在某个问题域才有效，离开了这个问题域，可能这些关系就不成立了，例如可能在某个问题域中，我是一个木匠，需要拿着锤子去干活，可能整个问题的描述就是我拿着锤子怎么钉桌子，钉椅子，钉柜子；既然整个问题就是描述这个，我和锤子就不仅是偶然的依赖关系了，我和锤子的关系变得非常的紧密，可能就上升为组合关系（让我突然想起武侠小说的剑不离身，剑亡人亡...）。这个例子可能有点荒谬，但也是为了说明一个道理，就是关系和类一样，它们都是在一个问题领域中才成立的，离开了这个问题域，他们可能就不复存在了。<br><br><br>4、泛化（继承）<br><br><img height=128 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_41.jpg" width=72 border=0><br><br>泛化关系：如果两个类存在泛化的关系时就使用，例如父和子，动物和老虎，植物和花等。<br>ROSE生成的代码很简单，如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>#include&nbsp;"C11.h"<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C12&nbsp;:&nbsp;public&nbsp;C11<br><img id=_41_43_Open_Image onclick="this.style.display='none'; document.getElementById('_41_43_Open_Text').style.display='none'; document.getElementById('_41_43_Closed_Image').style.display='inline'; document.getElementById('_41_43_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_41_43_Closed_Image onclick="this.style.display='none'; document.getElementById('_41_43_Closed_Text').style.display='none'; document.getElementById('_41_43_Open_Image').style.display='inline'; document.getElementById('_41_43_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt"><br>5、这里顺便提一下模板<br><br><img height=72 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_51.jpg" width=87 border=0><br><br>上面的图对应的代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>template&lt;int&gt;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C13&nbsp;<br><img id=_25_27_Open_Image onclick="this.style.display='none'; document.getElementById('_25_27_Open_Text').style.display='none'; document.getElementById('_25_27_Closed_Image').style.display='inline'; document.getElementById('_25_27_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_25_27_Closed_Image onclick="this.style.display='none'; document.getElementById('_25_27_Closed_Text').style.display='none'; document.getElementById('_25_27_Open_Image').style.display='inline'; document.getElementById('_25_27_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></div>
</div>
<p style="FONT-SIZE: 12pt">这里再说一下重复度，其实看完了上面的描述之后，我们应该清楚了各个关系间的关系以及具体对应到代码是怎么样的，所谓的重复度，也只不过是上面的扩展，例如A和B有着&#8220;1对多&#8221;的重复度，那在A中就有一个列表，保存着B对象的N个引用，就是这样而已。<br><br>好了，到这里，已经把上面的类图关系说完了，希望你能有所收获了，我也费了不少工夫啊（画图、生成代码、截图、写到BLOG上，唉，一头大汗）。不过如果能让你彻底理解UML类图的这些关系，也值得了。:)</p><img src ="http://www.cppblog.com/mzty/aggbug/47264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-04-16 17:09 <a href="http://www.cppblog.com/mzty/archive/2008/04/16/47264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++拷贝构造函数的几个细节</title><link>http://www.cppblog.com/mzty/archive/2008/04/02/45998.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 02 Apr 2008 01:47:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/04/02/45998.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/45998.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/04/02/45998.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/45998.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/45998.html</trackback:ping><description><![CDATA[<h3><font color=#002c99>C++拷贝构造函数的几个细节(转自：<a href="http://grantren.javaeye.com/blog/43289">http://grantren.javaeye.com/blog/43289</a>)</font><a href="http://grantren.javaeye.com/blog/43289"><u><font color=#810081></font></u></a></h3>
<div class=blog_content>
<p><font face=Arial>一 拷贝构造函数是<span class=hilite1>C</span>++最基础的概念之一，大家自认为对拷贝构造函数了解么？请大家先回答一下三个问题:</font></p>
<p><font face=Arial><strong>1.</strong> 以下函数哪个是拷贝构造函数,为什么?</font></p>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-cpp>
    <li class=alt><span><span>X::X(</span><span class=keyword><span class=hilite1>c</span>onst</span><span>&nbsp;X&amp;); &nbsp;&nbsp;</span></span>
    <li class=""><span>X::X(X); &nbsp;&nbsp;</span>
    <li class=alt><span>X::X(X&amp;,&nbsp;</span><span class=datatypes>int</span><span>&nbsp;a=1); &nbsp;&nbsp;</span>
    <li class=""><span>X::X(X&amp;,&nbsp;</span><span class=datatypes>int</span><span>&nbsp;a=1,&nbsp;b=2);&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;<font face=Arial><strong>2.</strong> 一个类中可以存在多于一个的拷贝构造函数吗?</font></p>
<p><font face=Arial><strong>3.</strong> 写出以下程序段的输出结果, 并说明为什么?</font><strong> </strong><strong></strong>如果你都能回答无误的话，那么你已经对<font face=Arial>拷贝构造函数有了相当的了解。</font></p>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-cpp>
    <li class=alt><span><span class=preprocessor>#in<span class=hilite1>c</span>lude&nbsp;<iostream></iostream> </span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span></span><span class=preprocessor>#in<span class=hilite1>c</span>lude&nbsp;<string></string> </span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span>
    <li class=""><span></span><span class=keyword>stru<span class=hilite1>c</span>t</span><span>&nbsp;X&nbsp;{ &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span><span class=keyword>template</span><span>&lt;</span><span class=keyword>typename</span><span>&nbsp;T&gt; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;X(&nbsp;T&amp;&nbsp;)&nbsp;{&nbsp;std::<span class=hilite1>c</span>out&nbsp;&lt;&lt;&nbsp;</span><span class=string>"This&nbsp;is&nbsp;<span class=hilite1>c</span>tor."</span><span>&nbsp;&lt;&lt;&nbsp;std::endl;&nbsp;} &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class=keyword>template</span><span>&lt;</span><span class=keyword>typename</span><span>&nbsp;T&gt; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;X&amp;&nbsp;operator=(&nbsp;T&amp;&nbsp;)&nbsp;{&nbsp;std::<span class=hilite1>c</span>out&nbsp;&lt;&lt;&nbsp;</span><span class=string>"This&nbsp;is&nbsp;<span class=hilite1>c</span>tor."</span><span>&nbsp;&lt;&lt;&nbsp;std::endl;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>}; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span>
    <li class=""><span></span><span class=keyword>void</span><span>&nbsp;main()&nbsp;{ &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;X&nbsp;a(5); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;X&nbsp;b(10.5); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;X&nbsp;<span class=hilite1>c</span>&nbsp;=&nbsp;a; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;<span class=hilite1>c</span>&nbsp;=&nbsp;b; &nbsp;&nbsp;</span>
    <li class=alt><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p><strong>解答如下：</strong></p>
<p><strong>1. </strong><font face=Arial>对于一个类X,如果一个构造函数的第一个参数是下列之一:<br>a) X&amp;<br>b) <span class=hilite1>c</span>onst X&amp;<br><span class=hilite1>c</span>) volatile X&amp;<br>d) <span class=hilite1>c</span>onst volatile X&amp;<br>且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数.&nbsp;</font></p>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-cpp>
    <li class=alt><strong><span><span>X::X(</span><span class=keyword><span class=hilite1>c</span>onst</span><span>&nbsp;X&amp;);&nbsp;&nbsp;</span><span class=comment>//是拷贝构造函数 </span><span>&nbsp;&nbsp;</span></span> </strong>
    <li class=""><strong><span>X::X(X&amp;,&nbsp;</span><span class=datatypes>int</span><span>=1);&nbsp;</span><span class=comment>//是拷贝构造函数</span><span>&nbsp;&nbsp;</span> </strong></li>
</ol>
</div>
<p>&nbsp;2.<font face=Arial>类中可以存在超过一个拷贝构造函数,</font>&nbsp;</p>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-cpp>
    <li class=alt><span><span class=keyword><span class=hilite1>c</span>lass</span><span><strong>&nbsp;X&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</strong></span></span><strong> </strong>
    <li class=""><span></span><span class=keyword>publi<span class=hilite1>c</span></span><strong><span>:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </strong>
    <li class=alt><strong><span>&nbsp;&nbsp;X(</span><span class=keyword><span class=hilite1>c</span>onst</span><span>&nbsp;X&amp;);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </strong>
    <li class=""><strong><span>&nbsp;&nbsp;X(X&amp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;OK </span><span>&nbsp;&nbsp;</span> </strong>
    <li class=alt><strong><span>};&nbsp;&nbsp;</span> </strong></li>
</ol>
</div>
<p>注意,如果一个类中只存在一个参数为X&amp;的拷贝构造函数,那么就不能使用<span class=hilite1>c</span>onst X或volatile X的对象实行拷贝初始化.</p>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-cpp>
    <li class=alt><span><span class=keyword><span class=hilite1>c</span>lass</span><span><strong>&nbsp;X&nbsp;{ &nbsp;&nbsp;</strong></span></span><strong> </strong>
    <li class=""><span></span><span class=keyword>publi<span class=hilite1>c</span></span><strong><span>: &nbsp;&nbsp;</span> </strong>
    <li class=alt><strong><span>&nbsp;&nbsp;X(); &nbsp;&nbsp;</span> </strong>
    <li class=""><strong><span>&nbsp;&nbsp;X(X&amp;); &nbsp;&nbsp;</span> </strong>
    <li class=alt><strong><span>}; &nbsp;&nbsp;</span> </strong>
    <li class=""><strong><span>&nbsp; &nbsp;&nbsp;</span> </strong>
    <li class=alt><span></span><span class=keyword><span class=hilite1>c</span>onst</span><strong><span>&nbsp;X&nbsp;<span class=hilite1>c</span>x; &nbsp;&nbsp;</span> </strong>
    <li class=""><strong><span>X&nbsp;x&nbsp;=&nbsp;<span class=hilite1>c</span>x;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;error </span><span>&nbsp;&nbsp;</span> </strong></li>
</ol>
</div>
<p>如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数.<br>这个默认的参数可能为X::X(<span class=hilite1>c</span>onst X&amp;)或X::X(X&amp;),由编译器根据上下文决定选择哪一个.</p>
<font face=Arial><font face=Arial>
<p><font face=Arial>默认拷贝构造函数的行为如下:<br>&nbsp;默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.<br>&nbsp;拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise <span class=hilite1>C</span>opy)的动作.<br>&nbsp;a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数.<br>&nbsp;b)如果数据成员是一个数组,对数组的每一个执行按位拷贝. <br>&nbsp;<span class=hilite1>c</span>)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值.</font></p>
<p><font face=Arial></font><strong>&nbsp;</strong></p>
<p><font face=Arial><strong>3.</strong>&nbsp; 拷贝构造函数不能由成员函数模版生成.</font>&nbsp;</p>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-cpp>
    <li class=alt><span><span class=keyword>stru<span class=hilite1>c</span>t</span><span><strong>&nbsp;X&nbsp;{ &nbsp;&nbsp;</strong></span></span><strong> </strong>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>template</span><span>&lt;</span><span class=keyword>typename</span><span>&nbsp;T&gt; &nbsp;&nbsp;</span> </strong>
    <li class=alt><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;X(&nbsp;</span><span class=keyword><span class=hilite1>c</span>onst</span><span>&nbsp;T&amp;&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;NOT&nbsp;<span class=hilite1>c</span>opy&nbsp;<span class=hilite1>c</span>tor,&nbsp;T&nbsp;<span class=hilite1>c</span>an't&nbsp;be&nbsp;X </span><span>&nbsp;&nbsp;</span> </strong>
    <li class=""><strong><span>&nbsp;&nbsp;</span> </strong>
    <li class=alt><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>template</span><span>&lt;</span><span class=keyword>typename</span><span>&nbsp;T&gt; &nbsp;&nbsp;</span> </strong>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;operator=(&nbsp;</span><span class=keyword><span class=hilite1>c</span>onst</span><span>&nbsp;T&amp;&nbsp;);&nbsp;&nbsp;</span><span class=comment>//&nbsp;NOT&nbsp;<span class=hilite1>c</span>opy&nbsp;ass't,&nbsp;T&nbsp;<span class=hilite1>c</span>an't&nbsp;be&nbsp;X </span><span>&nbsp;&nbsp;</span> </strong>
    <li class=alt><strong><span>}; &nbsp;&nbsp;</span> </strong>
    <li class=""><strong><span>&nbsp;&nbsp;</span> </strong></li>
</ol>
</div>
<p>原因很简单, 成员函数模版并不改变语言的规则,而语言的规则说,如果程序需要一个拷贝构造函数而你没有声明它,那么编译器会为你自动生成一个. 所以成员函数模版并不会阻止编译器生成拷贝构造函数, 赋值运算符重载也遵循同样的规则.(参见Effe<span class=hilite1>c</span>tive <span class=hilite1>C</span>++ 3edition, Item45)<br></p>
</font></font></div>
<br>二 针对上面作者的讨论，理解更深了，但是下面我还是会给出一个一般的标准的实现和注意事项：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Test1&nbsp;<br><img id=Codehighlighter1_93_365_Open_Image onclick="this.style.display='none'; Codehighlighter1_93_365_Open_Text.style.display='none'; Codehighlighter1_93_365_Closed_Image.style.display='inline'; Codehighlighter1_93_365_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_93_365_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_365_Closed_Text.style.display='none'; Codehighlighter1_93_365_Open_Image.style.display='inline'; Codehighlighter1_93_365_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_93_365_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_93_365_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_107_109_Open_Image onclick="this.style.display='none'; Codehighlighter1_107_109_Open_Text.style.display='none'; Codehighlighter1_107_109_Closed_Image.style.display='inline'; Codehighlighter1_107_109_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_107_109_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_107_109_Closed_Text.style.display='none'; Codehighlighter1_107_109_Open_Image.style.display='inline'; Codehighlighter1_107_109_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test1()&nbsp;</span><span id=Codehighlighter1_107_109_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_107_109_Open_Text><span style="COLOR: #000000">{&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_128_138_Open_Image onclick="this.style.display='none'; Codehighlighter1_128_138_Open_Text.style.display='none'; Codehighlighter1_128_138_Closed_Image.style.display='inline'; Codehighlighter1_128_138_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_128_138_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_128_138_Closed_Text.style.display='none'; Codehighlighter1_128_138_Open_Image.style.display='inline'; Codehighlighter1_128_138_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test1(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i)&nbsp;</span><span id=Codehighlighter1_128_138_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_128_138_Open_Text><span style="COLOR: #000000">{&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test1(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Test1</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;test)<br><img id=Codehighlighter1_173_201_Open_Image onclick="this.style.display='none'; Codehighlighter1_173_201_Open_Text.style.display='none'; Codehighlighter1_173_201_Closed_Image.style.display='inline'; Codehighlighter1_173_201_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_173_201_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_173_201_Closed_Text.style.display='none'; Codehighlighter1_173_201_Open_Image.style.display='inline'; Codehighlighter1_173_201_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_173_201_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_173_201_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;test.id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test1</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Test1</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;test)<br><img id=Codehighlighter1_249_351_Open_Image onclick="this.style.display='none'; Codehighlighter1_249_351_Open_Text.style.display='none'; Codehighlighter1_249_351_Closed_Image.style.display='inline'; Codehighlighter1_249_351_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_249_351_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_249_351_Closed_Text.style.display='none'; Codehighlighter1_249_351_Open_Image.style.display='inline'; Codehighlighter1_249_351_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_249_351_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_249_351_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">test)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;test.id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Test2<br><img id=Codehighlighter1_381_1170_Open_Image onclick="this.style.display='none'; Codehighlighter1_381_1170_Open_Text.style.display='none'; Codehighlighter1_381_1170_Closed_Image.style.display='inline'; Codehighlighter1_381_1170_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_381_1170_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_381_1170_Closed_Text.style.display='none'; Codehighlighter1_381_1170_Open_Image.style.display='inline'; Codehighlighter1_381_1170_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_381_1170_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_381_1170_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_402_419_Open_Image onclick="this.style.display='none'; Codehighlighter1_402_419_Open_Text.style.display='none'; Codehighlighter1_402_419_Closed_Image.style.display='inline'; Codehighlighter1_402_419_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_402_419_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_402_419_Closed_Text.style.display='none'; Codehighlighter1_402_419_Open_Image.style.display='inline'; Codehighlighter1_402_419_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2()</span><span id=Codehighlighter1_402_419_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_402_419_Open_Text><span style="COLOR: #000000">{&nbsp;m_pChar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_444_462_Open_Image onclick="this.style.display='none'; Codehighlighter1_444_462_Open_Text.style.display='none'; Codehighlighter1_444_462_Closed_Image.style.display='inline'; Codehighlighter1_444_462_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_444_462_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_444_462_Closed_Text.style.display='none'; Codehighlighter1_444_462_Open_Image.style.display='inline'; Codehighlighter1_444_462_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pChar)&nbsp;</span><span id=Codehighlighter1_444_462_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_444_462_Open_Text><span style="COLOR: #000000">{&nbsp;m_pChar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pChar;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num)&nbsp;<br><img id=Codehighlighter1_488_626_Open_Image onclick="this.style.display='none'; Codehighlighter1_488_626_Open_Text.style.display='none'; Codehighlighter1_488_626_Closed_Image.style.display='inline'; Codehighlighter1_488_626_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_488_626_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_488_626_Closed_Text.style.display='none'; Codehighlighter1_488_626_Open_Image.style.display='inline'; Codehighlighter1_488_626_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_488_626_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_488_626_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pChar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[num];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;num;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pChar[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pChar[num</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Test2</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;test)<br><img id=Codehighlighter1_661_839_Open_Image onclick="this.style.display='none'; Codehighlighter1_661_839_Open_Text.style.display='none'; Codehighlighter1_661_839_Closed_Image.style.display='inline'; Codehighlighter1_661_839_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_661_839_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_661_839_Closed_Text.style.display='none'; Codehighlighter1_661_839_Open_Image.style.display='inline'; Codehighlighter1_661_839_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_661_839_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_661_839_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pCharT&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pChar;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pChar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[strlen(test.m_pChar)];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(m_pChar,&nbsp;test.m_pChar);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">pCharT)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]pCharT;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Test2</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;test)<br><img id=Codehighlighter1_887_1140_Open_Image onclick="this.style.display='none'; Codehighlighter1_887_1140_Open_Text.style.display='none'; Codehighlighter1_887_1140_Closed_Image.style.display='inline'; Codehighlighter1_887_1140_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_887_1140_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_887_1140_Closed_Text.style.display='none'; Codehighlighter1_887_1140_Open_Image.style.display='inline'; Codehighlighter1_887_1140_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_887_1140_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_887_1140_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">test)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pCharT&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pChar;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pChar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[strlen(test.m_pChar)];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(m_pChar,&nbsp;test.m_pChar);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">pCharT)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]pCharT;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">m_pChar;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_1207_1530_Open_Image onclick="this.style.display='none'; Codehighlighter1_1207_1530_Open_Text.style.display='none'; Codehighlighter1_1207_1530_Closed_Image.style.display='inline'; Codehighlighter1_1207_1530_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1207_1530_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1207_1530_Closed_Text.style.display='none'; Codehighlighter1_1207_1530_Open_Image.style.display='inline'; Codehighlighter1_1207_1530_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1207_1530_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1207_1530_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Test1&nbsp;ts(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Test1()</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Test1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p_ts&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ts;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Test1&nbsp;ts2(ts);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Test(const&nbsp;Test1&amp;&nbsp;test)</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Test1&nbsp;ts3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ts;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Test(const&nbsp;Test1&amp;&nbsp;test)</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Test1&nbsp;ts4;&nbsp;ts4&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ts;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Test1&amp;&nbsp;operator&nbsp;=&nbsp;(const&nbsp;Test1&amp;&nbsp;test)</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2&nbsp;t(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2&nbsp;t2(t);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2&nbsp;t3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;t2;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2&nbsp;t4;&nbsp;t4&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;t;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br><br><img src ="http://www.cppblog.com/mzty/aggbug/45998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-04-02 09:47 <a href="http://www.cppblog.com/mzty/archive/2008/04/02/45998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLI中native的string和System::String转化</title><link>http://www.cppblog.com/mzty/archive/2008/03/12/44280.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 12 Mar 2008 08:47:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/03/12/44280.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/44280.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/03/12/44280.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/44280.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/44280.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 实例 （代码下载 http://www.cppblog.com/Files/mzty/SystemStringAndNativeString.rar）nativeclass.h#pragma&nbsp;once&nbsp;#include&nbsp;&lt;string&gt;#include&nbsp;&lt;iostream&gt;class&nbsp;NativeClass{publ...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2008/03/12/44280.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/44280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-03-12 16:47 <a href="http://www.cppblog.com/mzty/archive/2008/03/12/44280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>宏定义与空格</title><link>http://www.cppblog.com/mzty/archive/2008/02/25/43209.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 25 Feb 2008 07:09:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/02/25/43209.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/43209.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/02/25/43209.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/43209.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/43209.html</trackback:ping><description><![CDATA[<br>在宏定义中，如果宏有多行，每行的后面必须有\,但是切忌\后不能有空格。<br><br>下面的正确实例：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;c_A&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;c_B&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;INSERT_FUNCTION(NAME)&nbsp;\</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Insert&nbsp;##&nbsp;NAME(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;valuestr)&nbsp;\<br><img id=Codehighlighter1_213_275_Open_Image onclick="this.style.display='none'; Codehighlighter1_213_275_Open_Text.style.display='none'; Codehighlighter1_213_275_Closed_Image.style.display='inline'; Codehighlighter1_213_275_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_213_275_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_275_Closed_Text.style.display='none'; Codehighlighter1_213_275_Open_Image.style.display='inline'; Codehighlighter1_213_275_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_213_275_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_213_275_Open_Text><span style="COLOR: #000000">{&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;c_&nbsp;##&nbsp;NAME&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;valuestr&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>INSERT_FUNCTION(A)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>INSERT_FUNCTION(B)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#undef</span><span style="COLOR: #000000">&nbsp;INSERT_FUNCTION</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_381_454_Open_Image onclick="this.style.display='none'; Codehighlighter1_381_454_Open_Text.style.display='none'; Codehighlighter1_381_454_Closed_Image.style.display='inline'; Codehighlighter1_381_454_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_381_454_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_381_454_Closed_Text.style.display='none'; Codehighlighter1_381_454_Open_Image.style.display='inline'; Codehighlighter1_381_454_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_381_454_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_381_454_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;InsertA(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">value:i&nbsp;am&nbsp;a!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;InsertB(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">value:i&nbsp;am&nbsp;b!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>在vs2005中，使用ctrl+R+w开打开和关闭空格显示，在打开空格显示后你就可以看到你的\后面到底是不是多了空格。<img src ="http://www.cppblog.com/mzty/aggbug/43209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-02-25 15:09 <a href="http://www.cppblog.com/mzty/archive/2008/02/25/43209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dynamic_cast使用的讨论</title><link>http://www.cppblog.com/mzty/archive/2008/02/19/42929.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 19 Feb 2008 02:08:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/02/19/42929.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/42929.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/02/19/42929.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/42929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/42929.html</trackback:ping><description><![CDATA[<br>一 问题<br>1）什么时候应必须使用dynamic_cast<br>2）什么时候dynamic_cast可以使用static_cast代替<br><br>二 实例<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TestCast.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Base<br><img id=Codehighlighter1_148_291_Open_Image onclick="this.style.display='none'; Codehighlighter1_148_291_Open_Text.style.display='none'; Codehighlighter1_148_291_Closed_Image.style.display='inline'; Codehighlighter1_148_291_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_148_291_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_148_291_Closed_Text.style.display='none'; Codehighlighter1_148_291_Open_Image.style.display='inline'; Codehighlighter1_148_291_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_148_291_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_148_291_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_180_209_Open_Image onclick="this.style.display='none'; Codehighlighter1_180_209_Open_Text.style.display='none'; Codehighlighter1_180_209_Closed_Image.style.display='inline'; Codehighlighter1_180_209_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_180_209_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_180_209_Closed_Text.style.display='none'; Codehighlighter1_180_209_Open_Image.style.display='inline'; Codehighlighter1_180_209_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;f()&nbsp;</span><span id=Codehighlighter1_180_209_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_180_209_Open_Text><span style="COLOR: #000000">{&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Base::f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_224_252_Open_Image onclick="this.style.display='none'; Codehighlighter1_224_252_Open_Text.style.display='none'; Codehighlighter1_224_252_Closed_Image.style.display='inline'; Codehighlighter1_224_252_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_224_252_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_224_252_Closed_Text.style.display='none'; Codehighlighter1_224_252_Open_Image.style.display='inline'; Codehighlighter1_224_252_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;f1()</span><span id=Codehighlighter1_224_252_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_224_252_Open_Text><span style="COLOR: #000000">{cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Base::f1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Derived&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Base<br><img id=Codehighlighter1_322_461_Open_Image onclick="this.style.display='none'; Codehighlighter1_322_461_Open_Text.style.display='none'; Codehighlighter1_322_461_Closed_Image.style.display='inline'; Codehighlighter1_322_461_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_322_461_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_322_461_Closed_Text.style.display='none'; Codehighlighter1_322_461_Open_Image.style.display='inline'; Codehighlighter1_322_461_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_322_461_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_322_461_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_352_383_Open_Image onclick="this.style.display='none'; Codehighlighter1_352_383_Open_Text.style.display='none'; Codehighlighter1_352_383_Closed_Image.style.display='inline'; Codehighlighter1_352_383_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_352_383_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_352_383_Closed_Text.style.display='none'; Codehighlighter1_352_383_Open_Image.style.display='inline'; Codehighlighter1_352_383_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;f()</span><span id=Codehighlighter1_352_383_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_352_383_Open_Text><span style="COLOR: #000000">{cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Derived::f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_405_436_Open_Image onclick="this.style.display='none'; Codehighlighter1_405_436_Open_Text.style.display='none'; Codehighlighter1_405_436_Closed_Image.style.display='inline'; Codehighlighter1_405_436_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_405_436_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_405_436_Closed_Text.style.display='none'; Codehighlighter1_405_436_Open_Image.style.display='inline'; Codehighlighter1_405_436_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;k()</span><span id=Codehighlighter1_405_436_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_405_436_Open_Text><span style="COLOR: #000000">{cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Derived::k</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;z;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Base1<br><img id=Codehighlighter1_477_582_Open_Image onclick="this.style.display='none'; Codehighlighter1_477_582_Open_Text.style.display='none'; Codehighlighter1_477_582_Closed_Image.style.display='inline'; Codehighlighter1_477_582_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_477_582_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_477_582_Closed_Text.style.display='none'; Codehighlighter1_477_582_Open_Image.style.display='inline'; Codehighlighter1_477_582_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_477_582_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_477_582_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_507_536_Open_Image onclick="this.style.display='none'; Codehighlighter1_507_536_Open_Text.style.display='none'; Codehighlighter1_507_536_Closed_Image.style.display='inline'; Codehighlighter1_507_536_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_507_536_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_507_536_Closed_Text.style.display='none'; Codehighlighter1_507_536_Open_Image.style.display='inline'; Codehighlighter1_507_536_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;g()</span><span id=Codehighlighter1_507_536_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_507_536_Open_Text><span style="COLOR: #000000">{&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Base1::g</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_551_580_Open_Image onclick="this.style.display='none'; Codehighlighter1_551_580_Open_Text.style.display='none'; Codehighlighter1_551_580_Closed_Image.style.display='inline'; Codehighlighter1_551_580_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_551_580_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_551_580_Closed_Text.style.display='none'; Codehighlighter1_551_580_Open_Image.style.display='inline'; Codehighlighter1_551_580_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;g1()</span><span id=Codehighlighter1_551_580_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_551_580_Open_Text><span style="COLOR: #000000">{cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Base1::g1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Derived1&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Base,</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Base1<br><img id=Codehighlighter1_627_745_Open_Image onclick="this.style.display='none'; Codehighlighter1_627_745_Open_Text.style.display='none'; Codehighlighter1_627_745_Closed_Image.style.display='inline'; Codehighlighter1_627_745_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_627_745_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_627_745_Closed_Text.style.display='none'; Codehighlighter1_627_745_Open_Image.style.display='inline'; Codehighlighter1_627_745_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_627_745_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_627_745_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_657_689_Open_Image onclick="this.style.display='none'; Codehighlighter1_657_689_Open_Text.style.display='none'; Codehighlighter1_657_689_Closed_Image.style.display='inline'; Codehighlighter1_657_689_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_657_689_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_657_689_Closed_Text.style.display='none'; Codehighlighter1_657_689_Open_Image.style.display='inline'; Codehighlighter1_657_689_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;f()</span><span id=Codehighlighter1_657_689_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_657_689_Open_Text><span style="COLOR: #000000">{&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Derived1::f</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_711_743_Open_Image onclick="this.style.display='none'; Codehighlighter1_711_743_Open_Text.style.display='none'; Codehighlighter1_711_743_Closed_Image.style.display='inline'; Codehighlighter1_711_743_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_711_743_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_711_743_Closed_Text.style.display='none'; Codehighlighter1_711_743_Open_Image.style.display='inline'; Codehighlighter1_711_743_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;h()</span><span id=Codehighlighter1_711_743_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_711_743_Open_Text><span style="COLOR: #000000">{&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Derived1::h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Test1()<br><img id=Codehighlighter1_762_1407_Open_Image onclick="this.style.display='none'; Codehighlighter1_762_1407_Open_Text.style.display='none'; Codehighlighter1_762_1407_Closed_Image.style.display='inline'; Codehighlighter1_762_1407_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_762_1407_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_762_1407_Closed_Text.style.display='none'; Codehighlighter1_762_1407_Open_Image.style.display='inline'; Codehighlighter1_762_1407_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_762_1407_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_762_1407_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;对于单继承，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;如果PD真的指向Derived，用dynamic_cast和static_cast效果相同</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pD&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Derived;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Derived&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pD1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dynamic_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Derived</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(pD);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">f();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">k();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">f1();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Derived&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pD2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Derived</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(pD);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">f();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">k();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">f1();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;但是如果PB不是真的指向Derived，则用dynamic_cast则返回NULL，能够更早的禁止error的发生，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;如果用static_cast虽然返回的不为NULL，但是运行时可能抛出exception。</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_1165_1181_Open_Image onclick="this.style.display='none'; Codehighlighter1_1165_1181_Open_Text.style.display='none'; Codehighlighter1_1165_1181_Closed_Image.style.display='inline'; Codehighlighter1_1165_1181_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1165_1181_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1165_1181_Closed_Text.style.display='none'; Codehighlighter1_1165_1181_Open_Image.style.display='inline'; Codehighlighter1_1165_1181_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1165_1181_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_1165_1181_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">/&nbsp;Error&nbsp;code&nbsp;</span><span style="COLOR: #808080"></span></span><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Base&nbsp;*pB&nbsp;=&nbsp;new&nbsp;Base();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Derived&nbsp;*pD3&nbsp;=&nbsp;static_cast&lt;Derived*&gt;(pB);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pD3-&gt;f();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pD3-&gt;k();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pD3-&gt;f1();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Derived&nbsp;*pD4&nbsp;=&nbsp;dynamic_cast&lt;Derived*&gt;(pB);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pD4-&gt;f();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pD4-&gt;k();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pD4-&gt;f1();</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Test2()<br><img id=Codehighlighter1_1423_2017_Open_Image onclick="this.style.display='none'; Codehighlighter1_1423_2017_Open_Text.style.display='none'; Codehighlighter1_1423_2017_Closed_Image.style.display='inline'; Codehighlighter1_1423_2017_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1423_2017_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1423_2017_Closed_Text.style.display='none'; Codehighlighter1_1423_2017_Open_Image.style.display='inline'; Codehighlighter1_1423_2017_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1423_2017_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1423_2017_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;对于多重继承，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;如果PD真的指向的是Derived1，使用dynamic_cast和static_cast都可以转化为Derived1，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;但是如果要转化为Base的兄弟类Base1，必须使用dynamic_cast，使用static_cast不能编译。</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pD&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Derived1;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Derived1&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pD1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dynamic_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Derived1</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(pD);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">f();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">h();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">f1();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Base1&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pB1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dynamic_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Base1</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(pD);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pB1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">g();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Derived1&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pD2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Derived1</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(pD);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">f();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">h();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pD2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">f1();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1849_1876_Open_Image onclick="this.style.display='none'; Codehighlighter1_1849_1876_Open_Text.style.display='none'; Codehighlighter1_1849_1876_Closed_Image.style.display='inline'; Codehighlighter1_1849_1876_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1849_1876_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1849_1876_Closed_Text.style.display='none'; Codehighlighter1_1849_1876_Open_Image.style.display='inline'; Codehighlighter1_1849_1876_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1849_1876_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_1849_1876_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">/&nbsp;error&nbsp;can&nbsp;not&nbsp;compiler</span><span style="COLOR: #808080"></span></span><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Base1&nbsp;*pB2&nbsp;=&nbsp;static_cast&lt;Base1*&gt;(pD);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pB2-&gt;g();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;当然对于PB不是真的指向Derived1，想要转化为Derived1或Base的兄弟类Base1，情况与Test1中的error情况相同。</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_2057_2098_Open_Image onclick="this.style.display='none'; Codehighlighter1_2057_2098_Open_Text.style.display='none'; Codehighlighter1_2057_2098_Closed_Image.style.display='inline'; Codehighlighter1_2057_2098_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_2057_2098_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2057_2098_Closed_Text.style.display='none'; Codehighlighter1_2057_2098_Open_Image.style.display='inline'; Codehighlighter1_2057_2098_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_2057_2098_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2057_2098_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test1();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Test2();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>三 结论<br><br>大家先总结下，哈哈！<img src ="http://www.cppblog.com/mzty/aggbug/42929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-02-19 10:08 <a href="http://www.cppblog.com/mzty/archive/2008/02/19/42929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 虚函数表解析（转）</title><link>http://www.cppblog.com/mzty/archive/2008/02/18/42877.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 18 Feb 2008 05:29:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/02/18/42877.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/42877.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/02/18/42877.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/42877.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/42877.html</trackback:ping><description><![CDATA[<p align=center><strong><span twffan="done">C++ <span twffan="done">虚函数表解析</span></span></strong></p>
<p align=center><font face="Times New Roman" size=3></font>&nbsp;</p>
<h1><span twffan="done"><font size=5>前言</font></span><font face="Times New Roman" size=3>&nbsp;</font></h1>
<p><font size=3><font face="Times New Roman">C++</font><span twffan="done">中的虚函数的作用主要是实现了多态的机制。关于多态，简而言之就是用父类型别的指针指向其子类的实例，然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有&#8220;多种形态&#8221;，这是一种泛型技术。所谓泛型技术，说白了就是试图使用不变的代码来实现可变的算法。比如：模板技术，</span><font face="Times New Roman">RTTI</font><span twffan="done">技术，虚函数技术，要么是试图做到在编译时决议，要么试图做到运行时决议。</span></font><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">关于虚函数的使用方法，我在这里不做过多的阐述。大家可以看看相关的</span><font face="Times New Roman">C++</font><span twffan="done">的书籍。在这篇文章中，我只想从虚函数的实现机制上面为大家</span><span twffan="done"><font face="Times New Roman"> </font></span><span twffan="done">一个清晰的剖析。</span></font><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>当然，相同的文章在网上也出现过一些了，但我总感觉这些文章不是很容易阅读，大段大段的代码，没有图片，没有详细的说明，没有比较，没有举一反三。不利于学习和阅读，所以这是我想写下这篇文章的原因。也希望大家多给我提意见。</font></span><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>言归正传，让我们一起进入虚函数的世界。</font></span><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<h1><span twffan="done"><font size=5>虚函数表</font></span><font face="Times New Roman" size=3>&nbsp;</font></h1>
<p><font size=3><span twffan="done">对</span><font face="Times New Roman">C++ </font><span twffan="done">了解的人都应该知道虚函数（</span><font face="Times New Roman">Virtual Function</font><span twffan="done">）是通过一张虚函数表（</span><font face="Times New Roman">Virtual Table</font><span twffan="done">）来实现的。简称为</span><font face="Times New Roman">V-Table</font><span twffan="done">。在这个表中，主是要一个类的虚函数的地址表，这张表解决了继承、重载的问题，保证其容真实反应实际的函数。这样，在有虚函数的类的实例中这个表被分配在了这个实例的内存中，所以，当我们用父类的指针来操作一个子类的时候，这张虚函数表就显得由为重要了，它就像一个地图一样，指明了实际所应该调用的函数。</span></font><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">这里我们着重看一下这张虚函数表。在</span><font face="Times New Roman">C++</font><span twffan="done">的标准规格说明书中说到，编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置（这是为了保证正确取到虚函数的偏移量）。</span><span twffan="done"><font face="Times New Roman"> </font></span><span twffan="done">这意味着我们通过对象实例的地址得到这张虚函数表，然后就可以遍历其中函数指针，并调用相应的函数。</span></font><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">听我扯了那么多，我可以感觉出来你现在可能比以前更加晕头转向了。</span><span twffan="done"><font face="Times New Roman"> </font></span><span twffan="done">没关系，下面就是实际的例子，相信聪明的你一看就明白了。</span></font><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>假设我们有这样的一个类：</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done">class</span><span twffan="done"> Base {</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp; </span>public</span><span twffan="done">:</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> f() { cout &lt;&lt; <span twffan="done">"Base::f"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> g() { cout &lt;&lt; <span twffan="done">"Base::g"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> h() { cout &lt;&lt; <span twffan="done">"Base::h"</span> &lt;&lt; endl; }</span>&nbsp;</p>
<p><span twffan="done">};</span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">按照上面的说法，我们可以通过</span><font face="Times New Roman">Base</font><span twffan="done">的实例来得到虚函数表。</span><span twffan="done"><font face="Times New Roman"> </font></span><span twffan="done">下面是实际例程：</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><span twffan="done"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span twffan="done">typedef</span><span twffan="done"> <span twffan="done">void</span>(*Fun)(<span twffan="done">void</span>);</span><span twffan="done"><font size=3>&nbsp;</font></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base b;</span>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Fun pFun = NULL;</span>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; <span twffan="done">"</span></span><span twffan="done">虚函数表地址：</span><span twffan="done">"</span><span twffan="done"> &lt;&lt; (<span twffan="done">int</span>*)(&amp;b) &lt;&lt; endl;</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; <span twffan="done">"</span></span><span twffan="done">虚函数表</span><span twffan="done"> — </span><span twffan="done">第一个函数地址：</span><span twffan="done">"</span><span twffan="done"> &lt;&lt; (<span twffan="done">int</span>*)*(<span twffan="done">int</span>*)(&amp;b) &lt;&lt; endl;<br></span>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">// Invoke the first virtual function&nbsp;</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)*((<span twffan="done">int</span>*)*(<span twffan="done">int</span>*)(&amp;b));</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">实际运行经果如下：</span><font face="Times New Roman">(Windows XP+VS2003,&nbsp;Linux 2.6.22 + GCC 4.1.3)</font></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done">虚函数表地址：</span><span twffan="done">0012FED4</span></p>
<p><span twffan="done">虚函数表</span><span twffan="done"> — </span><span twffan="done">第一个函数地址：</span><span twffan="done">0044F148</span></p>
<p><span twffan="done">Base::f</span>&nbsp;</p>
<p><font size=3><span twffan="done">通过这个示例，我们可以看到，我们可以通过强行把</span><font face="Times New Roman">&amp;b</font><span twffan="done">转成</span><font face="Times New Roman">int *</font><span twffan="done">，取得虚函数表的地址，然后，再次取址就可以得到第一个虚函数的地址了，也就是</span><font face="Times New Roman">Base::f()</font><span twffan="done">，这在上面的程序中得到了验证（把</span><font face="Times New Roman">int* </font><span twffan="done">强制转成了函数指针）。通过这个示例，我们就可以知道如果要调用</span><font face="Times New Roman">Base::g()</font><span twffan="done">和</span><font face="Times New Roman">Base::h()</font><span twffan="done">，其代码如下：</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font face="Times New Roman" size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span twffan="done">(Fun)*((<span twffan="done">int</span>*)*(<span twffan="done">int</span>*)(&amp;b)+0);&nbsp;<span twffan="done">// Base::f()</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(Fun)*((<span twffan="done">int</span>*)*(<span twffan="done">int</span>*)(&amp;b)+1);&nbsp;<span twffan="done">// Base::g()</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(Fun)*((<span twffan="done">int</span>*)*(<span twffan="done">int</span>*)(&amp;b)+2);&nbsp;<span twffan="done">// Base::h()</span></span></p>
<p>&nbsp;</p>
<p><span twffan="done"><font size=3>这个时候你应该懂了吧。什么？还是有点晕。也是，这样的代码看着太乱了。没问题，让我画个图解释一下。如下所示：</font></span></p>
<p><span twffan="done"><font size=3></font></span></p>
<p align=center><span twffan="done"><font size=3><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_vtable1.jpg" twffan="done"></font></span></p>
<p><span twffan="done"><font size=3></font></span></p>
<p align=center><font size=3></font></p>
<p><font size=3><span twffan="done">注意：在上面这个图中，我在虚函数表的最后多加了一个结点，这是虚函数表的结束结点，就像字符串的结束符&#8220;</span><font face="Times New Roman">\0</font><span twffan="done">&#8221;一样，其标志了虚函数表的结束。这个结束标志的值在不同的编译器下是不同的。在</span><font face="Times New Roman">WinXP+VS2003</font><span twffan="done">下，这个值是</span><font face="Times New Roman">NULL</font><span twffan="done">。而在</span><font face="Times New Roman">Ubuntu 7.10 + Linux 2.6.22 + GCC 4.1.3</font><span twffan="done">下，这个值是如果</span><font face="Times New Roman">1</font><span twffan="done">，表示还有下一个虚函数表，如果值是</span><font face="Times New Roman">0</font><span twffan="done">，表示是最后一个虚函数表。</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>下面，我将分别说明&#8220;无重载&#8221;和&#8220;有重载&#8221;时的虚函数表的样子。没有重载父类的虚函数是毫无意义的。我之所以要讲述没有重载的情况，主要目的是为了给一个对比。在比较之下，我们可以更加清楚地知道其内部的具体实现。</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<h1><span twffan="done"><font size=5>一般继承（无虚函数重载）</font></span></h1>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>下面，再让我们来看看继承时的虚函数表是什么样的。假设有如下所示的一个继承关系：</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p align=center><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_Drawing3.jpg" twffan="done"></p>
<p align=center><font face="Times New Roman" size=3></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>请注意，在这个继承关系中，子类没有重载任何父类的函数。那么，在派生类的实例中，其虚函数表如下所示：</font></span></p>
<p><span twffan="done"><font size=3></font></span></p>
<p align=center></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">对于实例：</span><font face="Times New Roman">Derive d; </font><span twffan="done">的虚函数表如下：</span></font></p>
<p><font size=3></font></p>
<p align=center><font size=3><span twffan="done"><span twffan="done"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_vtable2.JPG" twffan="done"></span></span></font></p>
<p align=center><font size=3></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>我们可以看到下面几点：</font></span></p>
<p><font size=3><span twffan="done"><span twffan="done"><font face="Times New Roman">1）</font></span></span><span twffan="done">虚函数按照其声明顺序放于表中。</span></font></p>
<p><font size=3><span twffan="done"><span twffan="done"><font face="Times New Roman">2）</font></span></span><span twffan="done">父类的虚函数在子类的虚函数前面。</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>我相信聪明的你一定可以参考前面的那个程序，来编写一段程序来验证。</font></span><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<h1><span twffan="done"><font size=5>一般继承（有虚函数重载）</font></span></h1>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>重载父类的虚函数是很显然的事情，不然，虚函数就变得毫无意义。下面，我们来看一下，如果子类中有虚函数重载了父类的虚函数，会是一个什么样子？假设，我们有下面这样的一个继承关系。</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p align=center><font face="Times New Roman" size=3>&nbsp;<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_Drawing4.jpg" twffan="done"></font></p>
<p align=center><font face="Times New Roman" size=3></font></p>
<p align=center><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">为了让大家看到被继承过后的效果，在这个类的设计中，我只重载了父类的一个函数：</span><font face="Times New Roman">f()</font><span twffan="done">。那么，对于派生类的实例，其虚函数表会是下面的一个样子：</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p align=center><font face="Times New Roman" size=3></font></p>
<p align=center><font face="Times New Roman" size=3><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_vtable3.JPG" twffan="done"></font></p>
<p>&nbsp;</p>
<p><font face="Times New Roman" size=3></font></p>
<p><span twffan="done"><font size=3>我们从表中可以看到下面几点，</font></span></p>
<p><font size=3><span twffan="done"><span twffan="done"><font face="Times New Roman">1）</font></span></span><span twffan="done">重载的</span><font face="Times New Roman">f()</font><span twffan="done">函数被放到了虚表中原来父类虚函数的位置。</span></font></p>
<p><font size=3><span twffan="done"><span twffan="done"><font face="Times New Roman">2）</font></span></span><span twffan="done">没有被重载的函数依旧。</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>这样，我们就可以看到对于下面这样的程序，</font></span></p>
<p><span twffan="done"><font size=3>&nbsp;</font></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base *b = <span twffan="done">new</span> Derive();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b-&gt;f();</span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">由</span><font face="Times New Roman">b</font><span twffan="done">所指的内存中的虚函数表的</span><font face="Times New Roman">f()</font><span twffan="done">的位置已经被</span><font face="Times New Roman">Derive::f()</font><span twffan="done">函数地址所取代，于是在实际调用发生时，是</span><font face="Times New Roman">Derive::f()</font><span twffan="done">被调用了。这就实现了多态。</span></font><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<h1><span twffan="done"><font size=5>多重继承（无虚函数重载）</font></span><font face="Times New Roman" size=3>&nbsp;</font></h1>
<p><span twffan="done"><font size=3>下面，再让我们来看看多重继承中的情况，假设有下面这样一个类的继承关系。注意：子类并没有重载复类的函数。</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p align=center><font face="Times New Roman" size=3></font></p>
<p align=center><font face="Times New Roman" size=3><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_Drawing1.jpg" twffan="done">&nbsp;</font></p>
<p align=center><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>对于子类实例中的虚函数表，是下面这个样子：</font></span></p>
<p><span twffan="done"><font size=3></font></span></p>
<p align=center><span twffan="done"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_vtable4.JPG" twffan="done"></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p align=center><font face="Times New Roman" size=3></font></p>
<p><span twffan="done"><font size=3>我们可以看到：</font></span></p>
<p><span twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>1）</font>&nbsp;</font></span></span><span twffan="done"><font size=3>每个父类都有自己的虚表。</font></span></p>
<p><span twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>2）</font>&nbsp;</font></span></span><span twffan="done"><font size=3>子类的成员函数被放到了第一个父类的表中。（所谓的第一个父类是按照声明顺序来判断的）</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>这样做就是为了解决不同的父类类型的指针指向同一个子类实例，而能够调用到实际的函数。</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font><font face="Times New Roman" size=3>&nbsp;</font></p>
<h1><span twffan="done"><font size=5>多重继承（有虚函数重载）</font></span></h1>
<p><span twffan="done"><font size=3>下面我们再来看看，如果发生虚函数重载的情况。</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">下图中，我们重载了父类的</span><font face="Times New Roman">f()</font><span twffan="done">函数。</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p align=center><font face="Times New Roman" size=3></font></p>
<p align=center><font face="Times New Roman" size=3><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_Drawing2.jpg" twffan="done">&nbsp;</font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>下面是对于子类实例中的虚函数表的图：</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p align=center><font face="Times New Roman" size=3></font></p>
<p align=center><font face="Times New Roman" size=3><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_vtable5.jpg" twffan="done"></font></p>
<p align=center>&nbsp;</p>
<p><font size=3><span twffan="done">我们可以看见，三个父类虚函数表中的</span><font face="Times New Roman">f()</font><span twffan="done">的位置被替换成了子类的函数指针。这样，我们就可以任一静态类型的父类来指向子类，并调用子类的</span><font face="Times New Roman">f()</font><span twffan="done">了。如：</span></font></p>
<p><span twffan="done"><font size=3>&nbsp;</font></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Derive d;</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base1 *b1 = &amp;d;</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base2 *b2 = &amp;d;</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base3 *b3 = &amp;d;</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b1-&gt;f(); <span twffan="done">//Derive::f()</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b2-&gt;f(); <span twffan="done">//Derive::f()</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b3-&gt;f(); <span twffan="done">//Derive::f()</span></span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b1-&gt;g(); <span twffan="done">//Base1::g()</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b2-&gt;g(); <span twffan="done">//Base2::g()</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b3-&gt;g(); <span twffan="done">//Base3::g()</span></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<h1><span twffan="done"><font size=5>安全性</font></span><font face="Times New Roman" size=3>&nbsp;</font></h1>
<p><font size=3><span twffan="done">每次写</span><font face="Times New Roman">C++</font><span twffan="done">的文章，总免不了要批判一下</span><font face="Times New Roman">C++</font><span twffan="done">。这篇文章也不例外。通过上面的讲述，相信我们对虚函数表有一个比较细致的了解了。水可载舟，亦可覆舟。下面，让我们来看看我们可以用虚函数表来干点什么坏事吧。</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><strong><font size=3><span twffan="done">一、通过父类型的指针访问子类自己的虚函数</span></font></strong></p>
<p><font size=3><span twffan="done">我们知道，子类没有重载父类的虚函数是一件毫无意义的事情。因为多态也是要基于函数重载的。虽然在上面的图中我们可以看到</span><font face="Times New Roman">Base1</font><span twffan="done">的虚表中有</span><font face="Times New Roman">Derive</font><span twffan="done">的虚函数，但我们根本不可能使用下面的语句来调用子类的自有虚函数：</span></font></p>
<p><span twffan="done"><font size=3>&nbsp;</font></span></p>
<p><span twffan="done"><span twffan="done"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span twffan="done">Base1 *b1 = <span twffan="done">new</span> Derive();</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b1-&gt;f1();&nbsp;</span><span twffan="done">//<span twffan="done">编译出错</span></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">任何妄图使用父类指针想调用子类中的<strong>未重载父类的成员函数</strong>的行为都会被编译器视为非法，所以，这样的程序根本无法编译通过。但在运行时，我们可以通过指针的方式访问虚函数表来达到违反</span><font face="Times New Roman">C++</font><span twffan="done">语义的行为。（关于这方面的尝试，通过阅读后面附录的代码，相信你可以做到这一点）</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><strong><span twffan="done">二、访问</span><font face="Times New Roman">non-public</font></strong><strong><span twffan="done">的虚函数</span></strong></font></p>
<p><font size=3><span twffan="done">另外，如果父类的虚函数是</span><font face="Times New Roman">private</font><span twffan="done">或是</span><font face="Times New Roman">protected</font><span twffan="done">的，但这些非</span><font face="Times New Roman">public</font><span twffan="done">的虚函数同样会存在于虚函数表中，所以，我们同样可以使用访问虚函数表的方式来访问这些</span><font face="Times New Roman">non-public</font><span twffan="done">的虚函数，这是很容易做到的。</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done"><font size=3>如：</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done">class</span><span twffan="done"> Base {</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>private</span><span twffan="done">:</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> f() { cout &lt;&lt; <span twffan="done">"Base::f"</span> &lt;&lt; endl; }</span></p>
<p>&nbsp;</p>
<p><span twffan="done">};</span></p>
<p><span twffan="done"><font size=3>&nbsp;</font></span></p>
<p><span twffan="done">class</span><span twffan="done"> Derive : <span twffan="done">public</span> Base{</span></p>
<p>&nbsp;</p>
<p><span twffan="done">};</span></p>
<p>&nbsp;</p>
<p><span twffan="done">typedef</span><span twffan="done"> <span twffan="done">void</span>(*Fun)(<span twffan="done">void</span>);</span></p>
<p>&nbsp;</p>
<p><span twffan="done">void</span><span twffan="done"> main() {</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>Derive d;</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>Fun&nbsp;pFun = (Fun)*((<span twffan="done">int</span>*)*(<span twffan="done">int</span>*)(&amp;d)+<span twffan="done">0</span>);</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p><span twffan="done">}</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1><span twffan="done"><font size=5>结束语</font></span></h1>
<p><font size=3><font face="Times New Roman">C++</font><span twffan="done">这门语言是一门</span><font face="Times New Roman">Magic</font><span twffan="done">的语言，对于程序员来说，我们似乎永远摸不清楚这门语言背着我们在干了什么。需要熟悉这门语言，我们就必需要了解</span><font face="Times New Roman">C++</font><span twffan="done">里面的那些东西，需要去了解</span><font face="Times New Roman">C++</font><span twffan="done">中那些危险的东西。不然，这是一种搬起石头砸自己脚的编程语言。</span></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">在文章束之前还是介绍一下自己吧。我从事软件研发有十个年头了，目前是软件开发技术主管，技术方面，主攻</span><font face="Times New Roman">Unix/C/C++</font><span twffan="done">，比较喜欢网络上的技术，比如分布式计算，网格计算，</span><font face="Times New Roman">P2P</font><span twffan="done">，</span><font face="Times New Roman">Ajax</font><span twffan="done">等一切和互联网相关的东西。管理方面比较擅长于团队建设，技术趋势分析，项目管理。欢迎大家和我交流，我的</span><font face="Times New Roman">MSN</font><span twffan="done">和</span><font face="Times New Roman">Email</font><span twffan="done">是：</span></font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#104;&#97;&#111;&#101;&#108;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font face="Times New Roman" color=#000080 size=3>haoel@hotmail.com</font></a><span twffan="done"><font face="Times New Roman" size=3>&nbsp; </font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<h1><font size=5><span twffan="done">附录一：</span>VC<span twffan="done">中查看虚函数表</span></font></h1>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">我们可以在</span><font face="Times New Roman">VC</font><span twffan="done">的</span><font face="Times New Roman">IDE</font><span twffan="done">环境中的</span><font face="Times New Roman">Debug</font><span twffan="done">状态下展开类的实例就可以看到虚函数表了（并不是很完整的）</span></font></p>
<p><font size=3></font></p>
<p align=center><font size=3><span twffan="done"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/haoel/15190/o_vtable_vc.JPG" twffan="done"></span></font></p>
<p align=center><font size=3></font></p>
<h1><font size=5><span twffan="done">附录</span><span twffan="done"> </span><span twffan="done">二：例程</span></font></h1>
<p><span twffan="done"><font size=3>下面是一个关于多重继承的虚函数表访问的例程：</font></span></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><span twffan="done">#include</span><span twffan="done"> <span twffan="done">&lt;iostream&gt;</span></span></p>
<p><span twffan="done">using</span><span twffan="done"> <span twffan="done">namespace</span> std;</span></p>
<p>&nbsp;</p>
<p><span twffan="done">class</span><span twffan="done"> Base1 {</span></p>
<p><span twffan="done">public</span><span twffan="done">:</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> f() { cout &lt;&lt; <span twffan="done">"Base1::f"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> g() { cout &lt;&lt; <span twffan="done">"Base1::g"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> h() { cout &lt;&lt; <span twffan="done">"Base1::h"</span> &lt;&lt; endl; }</span></p>
<p>&nbsp;</p>
<p><span twffan="done">};</span></p>
<p>&nbsp;</p>
<p><span twffan="done">class</span><span twffan="done"> Base2 {</span></p>
<p><span twffan="done">public</span><span twffan="done">:</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> f() { cout &lt;&lt; <span twffan="done">"Base2::f"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> g() { cout &lt;&lt; <span twffan="done">"Base2::g"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> h() { cout &lt;&lt; <span twffan="done">"Base2::h"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done">};</span></p>
<p>&nbsp;</p>
<p><span twffan="done">class</span><span twffan="done"> Base3 {</span></p>
<p><span twffan="done">public</span><span twffan="done">:</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> f() { cout &lt;&lt; <span twffan="done">"Base3::f"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> g() { cout &lt;&lt; <span twffan="done">"Base3::g"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> h() { cout &lt;&lt; <span twffan="done">"Base3::h"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done">};</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span twffan="done">class</span><span twffan="done"> Derive : <span twffan="done">public</span> Base1, <span twffan="done">public</span> Base2, <span twffan="done">public</span> Base3 {</span></p>
<p><span twffan="done">public</span><span twffan="done">:</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> f() { cout &lt;&lt; <span twffan="done">"Driver::f"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">virtual</span> <span twffan="done">void</span> g1() { cout &lt;&lt; <span twffan="done">"Driver::g1"</span> &lt;&lt; endl; }</span></p>
<p><span twffan="done">};</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span twffan="done">typedef</span><span twffan="done"> <span twffan="done">void</span>(*Fun)(<span twffan="done">void</span>);</span></p>
<p>&nbsp;</p>
<p><span twffan="done">int</span><span twffan="done"> main() </span></p>
<p><span twffan="done">{</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Fun pFun = NULL;</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Derive d;</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">int</span>** pVtab = (<span twffan="done">int</span>**)&amp;d;</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span twffan="done">//Base1's vtable</span></strong></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//pFun = (Fun)*((int*)*(int*)((int*)&amp;d+0)+0);</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">0</span>][<span twffan="done">0</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//pFun = (Fun)*((int*)*(int*)((int*)&amp;d+0)+1);</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">0</span>][<span twffan="done">1</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//pFun = (Fun)*((int*)*(int*)((int*)&amp;d+0)+2);</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">0</span>][<span twffan="done">2</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//Derive's vtable</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//pFun = (Fun)*((int*)*(int*)((int*)&amp;d+0)+3);</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">0</span>][<span twffan="done">3</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//The tail of the vtable</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">0</span>][<span twffan="done">4</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout&lt;&lt;pFun&lt;&lt;endl;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span twffan="done">//Base2's vtable</span></strong></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//pFun = (Fun)*((int*)*(int*)((int*)&amp;d+1)+0);</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">1</span>][<span twffan="done">0</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//pFun = (Fun)*((int*)*(int*)((int*)&amp;d+1)+1);</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">1</span>][<span twffan="done">1</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">1</span>][<span twffan="done">2</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun(); </span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//The tail of the vtable</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">1</span>][<span twffan="done">3</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout&lt;&lt;pFun&lt;&lt;endl;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span twffan="done">//Base3's vtable</span></strong></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//pFun = (Fun)*((int*)*(int*)((int*)&amp;d+1)+0);</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">2</span>][<span twffan="done">0</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//pFun = (Fun)*((int*)*(int*)((int*)&amp;d+1)+1);</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">2</span>][<span twffan="done">1</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun();</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">2</span>][<span twffan="done">2</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun(); </span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">//The tail of the vtable</span></span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pFun = (Fun)pVtab[<span twffan="done">2</span>][<span twffan="done">3</span>];</span></p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout&lt;&lt;pFun&lt;&lt;endl;</span></p>
<p>&nbsp;</p>
<p><span twffan="done"><span twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span twffan="done">return</span> <span twffan="done">0</span>;</span></p>
<p><span twffan="done">}</span></p>
<p>&nbsp;</p>
<p><font size=3><strong><font face="Times New Roman">(</font></strong><strong><span twffan="done">转载时请注明作者和出处。未经许可，请勿用于商业用途</span><font face="Times New Roman">)</font></strong></font></p>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
<p><font size=3><span twffan="done">更多文章请访问我的</span><font face="Times New Roman">Blog: </font></font><a href="http://blog.csdn.net/haoel"><font face="Times New Roman" color=#000080 size=3>http://blog.csdn.net/haoel</font></a><font face="Times New Roman" size=3> </font></p><img src ="http://www.cppblog.com/mzty/aggbug/42877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-02-18 13:29 <a href="http://www.cppblog.com/mzty/archive/2008/02/18/42877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔试题二（转）</title><link>http://www.cppblog.com/mzty/archive/2008/02/18/42876.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 18 Feb 2008 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/02/18/42876.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/42876.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/02/18/42876.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/42876.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/42876.html</trackback:ping><description><![CDATA[给定九个数，例如：1，3，3，5，6，7，8，8，9计算出这九个数的排列的种数。需要考虑重复情况，如果给定9个1，则只有一种结果。 <br>限制：不能使用stl库 <br>要求：完成函数&nbsp;unsigned&nbsp;int&nbsp;foo(unsigned&nbsp;int&nbsp;*arr); <br>输入算法代码，并给出算法复杂度分析。
<p>分析：&nbsp;</p>
<p>#include &lt;cstdlib&gt;<br>#include &lt;iostream&gt;</p>
<p>using namespace std;<br>unsigned int foo(unsigned int *arr)<br>{<br>&nbsp;&nbsp;&nbsp; unsigned int p[] ={1,2,6,24,120,720,5040,40320,362880};<br>&nbsp;&nbsp;&nbsp; unsigned int i,j,c,s=p[8];//first the number is p<sup>9<sub>9</sub></sup><br>&nbsp;&nbsp;&nbsp; for(i = 0; i &lt; 7; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j = i+1; j &lt; 8; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(arr[i]&gt;arr[j])&nbsp; //swap two number<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[i]^=arr[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[j]^=arr[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[i]^=arr[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; i = 0;<br>&nbsp;&nbsp;&nbsp; c = 0;<br>&nbsp;&nbsp;&nbsp; while(i&lt;8)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = i+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(arr[i]==arr[j])//compute the number of the repetition&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s/=p[c];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=j;<br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return s;<br>}<br>&nbsp;&nbsp; <br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; unsigned int a[]={1,3,3,5,6,7,8,8,9};<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"The number of permutation is: "&lt;&lt;foo(a)&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; system("pause");<br>&nbsp;&nbsp;&nbsp; return 0;<br>}&nbsp;&nbsp;&nbsp;&nbsp; <br>还可以改进排序那部分。</p>
<p>转一个经典的题目：</p>
<p>给一个天平,问如何用3次把这个小球找出来 <br>并且求出这个小球是比其他的轻还是重 <br>将12个球分别编号为a1,a2,a3.......a10,a11,a12. <br>第一步：将12球分开3拨，每拨4个，a1~a4第一拨，记为b1，&nbsp;a5~a8第2拨，记为b2，其余第3拨，记为b3； <br>第二步：将b1和b2放到天平两盘上，记左盘为c1，右为c2；这时候分两中情况： <br><br>1.c1和c2平衡，此时可以确定从a1到a8都是常球；然后把c2拿空，并从c1上拿下a4，从a9到a12四球里随便取三球，假设为a9到a11，放到c2上。此时c1上是a1到a3，c2上是a9到a11。从这里又分三种情况： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A：天平平衡，很简单，说明没有放上去的a12就是异球，而到此步一共称了两次，所以将a12随便跟11个常球再称一次，也就是第三次，马上就可以确定a12是重还是轻； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B：若c1上升，则这次称说明异球为a9到a11三球中的一个，而且是比常球重。取下c1所有的球，并将a8放到c1上，将a9取下，比较a8和a11（第三次称），如果平衡则说明从c2上取下的a9是偏重异球，如果不平衡，则偏向哪盘则哪盘里放的就是偏重异球； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C：若c1下降，说明a9到a11里有一个是偏轻异球。次种情况和B类似，所以接下来的步骤照搬B就是； <br><br>2.c1和c2不平衡，这时候又分两种情况，c1上升和c1下降，但是不管哪种情况都能说明a9到a12是常球。这步是解题的关键。也是这个题最妙的地方。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A：c1上升，此时不能判断异球在哪盘也不能判断是轻还是重。取下c1中的a2到a4三球放一边，将c2中的a5和a6放到c1上，然后将常球a9放到c2上。至此，c1上是a1，a5和a6，c2上是a7，a8和a9。此时又分三中情况： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）如果平衡，说明天平上所有的球都是常球，异球在从c1上取下a2到a4中。而且可以断定异球轻重。因为a5到a8都是常球，而第2次称的时候c1是上升的，所以a2到a4里必然有一个轻球。那么第三次称就用来从a2到a4中找到轻球。这很简单，随便拿两球放到c1和c2，平衡则剩余的为要找球，不平衡则哪边低则哪个为要找球； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）c1仍然保持上升，则说明要么a1是要找的轻球，要么a7和a8两球中有一个是重球（这步懂吧？好好想想，很简单的。因为a9是常球，而取下的a2到a4肯定也是常球，还可以推出换盘放置的a5和a6也是常球。所以要么a1轻，要么a7或a8重）。至此，还剩一次称的机会。只需把a7和a8放上两盘，平衡则说明a1是要找的偏轻异球，如果不平衡，则哪边高说明哪个是偏重异球； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3）如果换球称第2次后天平平衡打破，并且c1降低了，这说明异球肯定在换过来的a5和a6两求中，并且异球偏重，否则天平要么平衡要么保持c1上升。确定要找球是偏重之后，将a5和a6放到两盘上称第3次根据哪边高可以判定a5和a6哪个是重球； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B：第1次称后c1是下降的，此时可以将c1看成c2，其实以后的步骤都同A，所以就不必要再重复叙述了。至此，不管情况如何，用且只用三次就能称出12个外观手感一模一样的小球中有质量不同于其他11球的偏常的球。而且在称的过程中可以判定其是偏轻还是偏重。 <br><br>3.U2 合唱团在17 分钟内得赶到演唱会场，途中必需跨过一座桥，四个人从桥的同一端出发，你得帮助他们到达另一端，天色很暗，而他们只有一只手电筒。一次同时最多可以有两人一起过桥，而过桥的时候必须持有手电筒，所以就得有人把手电筒带来带去，来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同，若两人同行则以较慢者的速度为准。Bono 需花1 分钟过桥，Edge 需花2 分钟过桥，Adam需花 5 分钟过桥，Larry 需花10 分钟过桥。他们要如何在17 分钟内过桥呢？（有个同济的学生写文章说他当时在微软面试时就是碰到了这道题，最短只能做出在19分钟内过桥，微软的人对他讲这样的结果已经是不错的了！）&nbsp; <br>&nbsp; A点到 B 点 <br>&nbsp;1 和2 过去 2 分钟 2&nbsp; <br>&nbsp;2 过来 4 分钟 2+2=4 <br>10和 5过去 14 分钟 4+10=14&nbsp;&nbsp; <br>1 过来 15 分钟 14+1=15&nbsp;&nbsp; <br>1 和2 过去 17 分钟 15+2=17 </p>
<p>第一组&nbsp;&nbsp;<br>　　1.烧一根不均匀的绳，从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子，问如何用烧绳的方法来计时一个小时十五分钟呢?<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ans:三根绳，<font color=#ff0000>开始的时候，第一根点燃两端，第二根点燃一端，第三根不点</font>。<font color=#ff0000>第一根绳烧完(30分钟)后，点燃第二根绳的另一端</font>，第二根只要15分钟就可以烧完了，第二根绳烧完(45分钟)后，点燃第三根绳子两端，第三根绳烧完(1小时15分)后，计时完成<br><br>　　2.你有一桶果冻，其中有黄色、绿色、红色三种，闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?<br><br>　　3.如果你有无穷多的水，一个3公升的提捅，一个5公升的提捅，两只提捅形状上下都不均匀，问你如何才能准确称出4公升的水?<br><br>　　4.一个岔路口分别通向诚实国和说谎国。来了两个人，已知一个是诚实国的，另一个是说谎国的。诚实国永远说实话，说谎国永远说谎话。现在你要去说谎国，但不知道应该走哪条路，需要问这两个人。请问应该怎么问?<br><br>　　5.12个球一个天平，现知道只有一个和其它的重量不同，问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重，所以需要仔细考虑)<br><br>　　6.在9个点上画10条直线，要求每条直线上至少有三个点?<br><br>　　7.在一天的24小时之中，时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?<br><br>　　8.怎么样种植4棵树木，使其中任意两棵树的距离相等?<br><br>　　第二组&nbsp;&nbsp;<br><br>　　1.为什么下水道的盖子是圆的?<br><br>　　2.中国有多少辆汽车?<br><br>　　3.将汽车钥匙插入车门，向哪个方向旋转就可以打开车锁?<br><br>　　4.如果你要去掉中国的34个省(含自治区、直辖市和港澳特区及台湾省)中的任何一个，你会去掉哪一个，为什么?<br><br>　　5.多少个加油站才能满足中国的所有汽车?<br><br>　　6.想象你站在镜子前，请问，为什么镜子中的影象可以颠倒左右，却不能颠倒上下?<br><br>　　7.为什么在任何旅馆里，你打开热水，热水都会瞬间倾泻而出?<br><br>　　8.你怎样将Excel的用法解释给你的奶奶听?<br><br>　　9.你怎样重新改进和设计一个ATM银行自动取款机?<br><br>　　10.如果你不得不重新学习一种新的计算机语言，你打算怎样着手来开始?<br><br>　　11.如果你的生涯规划中打算在5年内受到奖励，那获取该项奖励的动机是什么?观众是谁?<br><br>　　12.如果微软告诉你，我们打算投资五百万美元来启动你的投资计划，你将开始什么样商业计划?为什么?<br><br>　　13.如果你能够将全世界的电脑厂商集合在一个办公室里，然后告诉他们将被强迫做一件事，那件事将是什么?　<br><br>&nbsp;<br><br>第三组&nbsp;&nbsp;<br><br>　　1.你让工人为你工作7天，回报是一根金条，这个金条平分成相连的7段，你必须在每天结束的时候给他们一段金条。如果只允许你两次把金条弄断，你如何给你的工人付费?<br><br>　　2.有一辆火车以每小时15公里的速度离开北京直奔广州，同时另一辆火车每小时20公里的速度从广州开往北京。如果有一只鸟，以30公里每小时的速度和两辆火车同时启动，从北京出发，碰到另一辆车后就向相反的方向返回去飞，就这样依次在两辆火车之间来回地飞，直到两辆火车相遇。请问，这只鸟共飞行了多长的距离?<br><br>　　3.你有四个装药丸的罐子，每个药丸都有一定的重量，被污染的药丸是没被污染的药丸的重量+1。只称量一次，如何判断哪个罐子的药被污染了?<br><br>　　4.门外三个开关分别对应室内三盏灯，线路良好，在门外控制开关时候不能看到室内灯的情况，现在只允许进门一次，确定开关和灯的对应关系?<br><br>　　5.人民币为什么只有1、2、5、10的面值?<br><br>　　6.你有两个罐子以及50个红色弹球和50个蓝色弹球，随机选出一个罐子，&nbsp;随机选出一个弹球放入罐子，怎么给出红色弹球最大的选中机会?在你的计划里，得到红球的几率是多少?<br><br>　　7.给你两颗6面色子，可以在它们各个面上刻上0-9任意一个数字，要求能够用它们拼出任意一年中的日期数值<br><br>　　第四组&nbsp;<br><br>　　第一题&nbsp;.&nbsp;五个海盗抢到了100颗宝石，每一颗都一样大小和价值连城。他们决定这么分：<br><br>　　抽签决定自己的号码(1、2、3、4、5)<br><br>　　首先，由1号提出分配方案，然后大家表决，当且仅当超过半数的人同意时，按照他的方案<br><br>　　进行分配，否则将被扔进大海喂鲨鱼<br><br>　　如果1号死后，再由2号提出分配方案，然后剩下的4人进行表决，当且仅当超过半数的人同<br><br>　　意时，按照他的方案进行分配，否则将被扔入大海喂鲨鱼<br><br>　　依此类推<br><br>　　条件：每个海盗都是很聪明的人，都能很理智地做出判断，从而做出选择。<br><br>　　问题：第一个海盗提出怎样的分配方案才能使自己的收益最大化?<br><br>　　第二题&nbsp;.&nbsp;一道关于飞机加油的问题，已知：<br><br>　　每个飞机只有一个油箱，<br><br>　　飞机之间可以相互加油(注意是相互，没有加油机)<br><br>　　一箱油可供一架飞机绕地球飞半圈，<br><br>　　问题：<br><br>　　为使至少一架飞机绕地球一圈回到起飞时的飞机场，至少需要出动几架飞机?(所有飞机从同一机场起飞，而且必须安全返回机场，不允许中途降落，中间没有飞机场)第三题.&nbsp;汽车加油问题&nbsp;&nbsp;<br><br>　　一辆载油500升的汽车从A开往1000公里外的B，已知汽车每公里耗油量为1升，A处有无穷多的油，其他任何地点都没有油，但该车可以在任何地点存放油以备中转，问从A到B最少需要多少油<br><br>　　第四题.&nbsp;掷杯问题<br><br>　　一种杯子，若在第N层被摔破，则在任何比N高的楼层均会破，若在第M层不破，则在任何比M低的楼层均会破，给你两个这样的杯子，让你在100层高的楼层中测试，要求用最少的测试次数找出恰巧会使杯子破碎的楼层。<br><br>　　第五题.&nbsp;推理游戏<br><br>　　教授选出两个从2到9的数，把它们的和告诉学生甲，把它们的积告诉学生乙，让他们轮流猜这两个数<br><br>　　甲说：&#8220;我猜不出&#8221;<br><br>　　乙说：&#8220;我猜不出&#8221;<br><br>　　甲说：&#8220;我猜到了&#8221;<br><br>　　乙说：&#8220;我也猜到了&#8221;<br><br>　　问这两个数是多少<br><br>　　第六题.&nbsp;病狗问题<br><br>　　一个住宅区内有100户人家，每户人家养一条狗，每天傍晚大家都在同一个地方遛狗。已知这些狗中有一部分病狗，由于某种原因，狗的主人无法判断自己的狗是否是病狗，却能够分辨其他的狗是否有病，现在，上级传来通知，要求住户处决这些病狗，并且不允许指认他人的狗是病狗(就是只能判断自己的)，过了7天之后，所有的病狗都被处决了，问，一共有几只病狗?为什么?<br><br>　　第八题.&nbsp;监狱里有100个房间，每个房间内有一囚犯。一天，监狱长说，你们狱房外有一电灯，你们在放风时可以控制这个电灯(熄或亮)。每天只能有一个人出来放风，并且防风是随机的。如果在有限时间内，你们中的某人能对我说：&#8220;我敢保证，现在每个人都已经至少放过一次风了。&#8221;我就放了你们!问囚犯们要采取什么策略才能被监狱长放掉?如果采用了这种策略，大致多久他们可以被释放?<br><br>&nbsp;<br><br>第五组&nbsp;&nbsp;<br><br>　　1.某手机厂家由于设计失误，有可能造成电池寿命比原来设计的寿命短一半(不是冲放电时间)，解决方案就是免费更换电池或给50元购买该厂家新手机的折换券。请给所有已购买的用户写信告诉解决方案。<br><br>　　2.一高层领导在参观某博物馆时，向博物馆馆员小王要了一块明代的城砖作为纪念，按国家规定，任何人不得将博物馆收藏品变为私有。博物馆馆长需要如何写信给这位领导，将城砖取回。<br><br>　　3.营业员小姐由于工作失误，将2万元的笔记本电脑以1.2万元错卖给李先生，王小姐的经理怎么写信给李先生试图将钱要回来?<br><br>　　4.给你一款新研制的手机，如果你是测试组的组长，你会如何测试?<br><br>　　5.如何为函数int&nbsp;atoi(const&nbsp;char&nbsp;*&nbsp;pstr)编写测试向量?<br><br>　　第六组&nbsp;&nbsp;<br><br>　　1.链表和数组的区别在哪里?<br><br>　　2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?<br><br>　　3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?<br><br>　　4.请编写能直接实现char&nbsp;*&nbsp;strcpy(char&nbsp;*&nbsp;pstrDest,const&nbsp;char&nbsp;*&nbsp;pstrSource)函数功能的代码。<br><br>　　5.编写反转字符串的程序，要求优化速度、优化空间。<br><br>　　6.在链表里如何发现循环链接?<br><br>　　7.给出洗牌的一个算法，并将洗好的牌存储在一个整形数组里。<br><br>　　8.写一个函数，检查字符是否是整数，如果是，返回其整数值。(或者：怎样只用4行代码<br><br>　　9.给出一个函数来输出一个字符串的所有排列。<br><br>　　10.请编写实现void&nbsp;*&nbsp;malloc(int)内存分配函数功能一样的代码。<br><br>　　11.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。<br><br>　　12.怎样编写一个程序，把一个有序整数数组放到二叉树中?<br><br>　　13.怎样从顶部开始逐层打印二叉树结点数据?请编程。<br><br>　　14.怎样把一个链表掉个顺序(也就是反序，注意链表的边界条件并考虑空链表)?&nbsp;--<br><br>　　15.请编写能直接实现int&nbsp;atoi(const&nbsp;char&nbsp;*&nbsp;pstr)函数功能的代码<br><br>-----------------------------------------------------------------------------------<br>第一组题答案：&nbsp;<br><br>　　<br>　　2)根据抽屉原理，4个<br><br>　　3)3升装满;3升-〉5升(全注入);3升装满;3升-〉5升(剩1升);5升倒掉;3升-〉5升(注入1升);3升装满;3升-〉5升;完成(另：可用回溯法编程求解)<br><br>　　4)问其中一人：另外一个人会说哪一条路是通往诚实国的?回答者所指的那条路必然是通往说谎国的。<br><br>　　5)12个球：<br><br>　　第一次：4，4&nbsp;如果平了：<br><br>　　那么剩下的球中取3放左边,取3个好球放右边，称：<br><br>　　如果左边重，那么取两个球称一下，哪个重哪个是次品，平的话第三个重，是次品，轻的话同理<br><br>　　如果平了，那么剩下一个次品，还可根据需要称出次品比正品轻或者重<br><br>　　如果不平：<br><br>　　那么不妨设左边重右边轻，为了便于说明，将左边4颗称为重球，右边4颗称为轻球，剩下4颗称为好球<br><br>　　取重球2颗，轻球2颗放在左侧，右侧放3颗好球和一颗轻球<br><br>　　如果左边重<br><br>　　称那两颗重球，重的一个次品，平的话右边轻球次品<br><br>　　如果右边重<br><br>　　称左边两颗轻球，轻的一个次品<br><br>　　如果平<br><br>　　称剩下两颗重球，重的一个次品，平的话剩下那颗轻球次品<br><br>　　13个球：<br><br>　　第一次：4，4，如果平了<br><br>　　剩5颗球用上面的方法仍旧能找出次品，只是不能知道次品是重是轻<br><br>　　如果不平，同上　<br><br>6)&nbsp;&nbsp;<br><br>　　o&nbsp;o&nbsp;o<br><br>　　o&nbsp;o&nbsp;o<br><br>　　o&nbsp;o&nbsp;o<br><br>　　7)<br><br>　　23次，因为分针要转24圈，时针才能转1圈，而分针和时针重合两次之间的间隔显然&gt;1小时，它们有23次重合机会，每次重合中秒针有一次重合机会，所以是23次<br><br>　　重合时间可以对照手表求出，也可列方程求出<br><br>　　8)<br><br>　　在地球表面种树，做一个地球内接的正四面体，内接点即为所求<br><br>　　第二组&nbsp;无标准答案&nbsp;&nbsp;<br><br>　　第三组&nbsp;<br><br>　　1.&nbsp;分成1,2,4三段，第一天给1，第二天给2取回1，第3天给1，第4天给4取回1、2，第5天给1，第6天给2取回1，第七天给1<br><br>　　2.&nbsp;求出火车相遇时间，鸟速乘以时间就是鸟飞行的距离<br><br>　　3.&nbsp;四个罐子中分别取1,2,3,4颗药丸，称出比正常重多少，即可判断出那个罐子的药被污染<br><br>　　4.&nbsp;三个开关分别：关，开，开10分钟，然后进屋，暗且凉的为开关1控制的灯，亮的为开关2控制的灯，暗且热的为开关3控制的灯<br><br>　　5.&nbsp;因为可以用1，2，5，10组合成任何需要的货币值，日常习惯为10进制<br><br>　　6.&nbsp;题意不理解...*_*<br><br>　　7.&nbsp;012345&nbsp;0126(9)78<br><br>　　第四组&nbsp;都是很难的题目&nbsp;&nbsp;<br><br>　　第一题：97&nbsp;0&nbsp;1&nbsp;2&nbsp;0&nbsp;或者&nbsp;97&nbsp;0&nbsp;1&nbsp;0&nbsp;2&nbsp;(提示：可用逆推法求出)<br><br>　　第二题：3架飞机5架次，飞法：<br><br>　　ABC&nbsp;3架同时起飞，1/8处，C给AB加满油，C返航，1/4处，B给A加满油，B返航，A到达1/2处，C从机场往另一方向起飞，3/4处，C同已经空油箱的A平分剩余油量，同时B从机场起飞，AC到7/8处同B平分剩余油量，刚好3架飞机同时返航。所以是3架飞机5架次。第三题：需要建立数学模型&nbsp;&nbsp;<br><br>　　(提示，严格证明该模型最优比较麻烦，但确实可证，大胆猜想是解题关键)<br><br>　　题目可归结为求数列&nbsp;an=500/(2n+1)&nbsp;n=0,1,2,3......的和Sn什么时候大于等于1000,解得n&gt;6<br><br>　　当n=6时，S6=977.57<br><br>　　所以第一个中转点离起始位置距离为1000-977.57=22.43公里<br><br>　　所以第一次中转之前共耗油&nbsp;22.43*(2*7+1)=336.50升<br><br>　　此后每次中转耗油500升<br><br>　　所以总耗油量为7*500+336.50=3836.50升<br><br>　　第四题：需要建立数学模型<br><br>　　题目可归结为求自然数列的和S什么时候大于等于100，解得n&gt;13<br><br>　　第一个杯子可能的投掷楼层分别为：14，27，39，50，60，69，77，84，90，95，99，100<br><br>　　第五题：3和4(可严格证明)<br><br>　　设两个数为n1，n2，n1&gt;=n2，甲听到的数为n=n1+n2，乙听到的数为m=n1*n2<br><br>　　证明n1=3，n2=4是唯一解<br><br>　　证明：要证以上命题为真，不妨先证n=7<br><br>　　1)必要性：<br><br>　　i)&nbsp;n&gt;5&nbsp;是显然的，因为n&lt;4不可能，n=4或者n=5甲都不可能回答不知道<br><br>　　ii)&nbsp;n&gt;6&nbsp;因为如果n=6的话，那么甲虽然不知道(不确定2+4还是3+3)但是无论是2，4还是3，3乙都不可能说不知道(m=8或者m=9的话乙说不知道是没有道理的)<br><br>　　iii)&nbsp;n&lt;8&nbsp;因为如果n&gt;=8的话，就可以将n分解成&nbsp;n=4+x&nbsp;和&nbsp;n=6+(x-2)，那么m可以是4x也可以是6(x-2)而4x=6(x-2)的必要条件是x=6即n=10，那样n又可以分解成8+2，所以总之当n&gt;=8时，n至少可以分解成两种不同的合数之和，这样乙说不知道的时候，甲就没有理由马上说知道。<br><br>　　以上证明了必要性<br><br>　　2)充分性<br><br>　　当n=7时，n可以分解成2+5或3+4<br><br>　　显然2+5不符合题意，舍去，容易判断出3+4符合题意，m=12，证毕<br><br>　　于是得到n=7&nbsp;m=12&nbsp;n1=3&nbsp;n2=4是唯一解。第六题：7只(数学归纳法证明)&nbsp;&nbsp;<br><br>　　1)若只有1只病狗，因为病狗主人看不到有其他病狗，必然会知道自己的狗是病狗(前提是一定存在病狗)，所以他会在第一天把病狗处决。<br><br>　　2)设有k只病狗的话，会在第k天被处决，那么，如果有k+1只，病狗的主人只会看到k只病狗，而第k天没有人处决病狗，病狗主人就会在第k+1天知道自己的狗是病狗，于是病狗在第k+1天被处决<br><br>　　3)由1)2)得，若有n只病狗，必然在第n天被处决<br><br>　　第八题：<br><br>　　约定好一个人作为报告人(可以是第一个放风的人)<br><br>　　规则如下：<br><br>　　1、报告人放风的时候开灯并数开灯次数<br><br>　　2、其他人第一次遇到开着灯放风时，将灯关闭<br><br>　　3、当报告人第100次开灯的时候，去向监狱长报告，要求监狱长放人......<br><br>　　按照概率大约30年后(10000天)他们可以被释放<br><br>　　第五组无标准答案&nbsp;&nbsp;<br><br>　　第六组部分题参考答案：&nbsp;&nbsp;<br><br>　　4.<br><br>char&nbsp;*&nbsp;strcpy(char&nbsp;*&nbsp;pstrDest,const&nbsp;char&nbsp;*&nbsp;pstrSource)<br>{<br>&nbsp;assert((pstrDest!=NULL)&amp;&amp;(pstrSource!=NULL));&nbsp;<br>&nbsp;char&nbsp;*&nbsp;pstr=pstrDest;<br>&nbsp;while((*(pstrDest++)=*(pstrSource++))!='\0');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pstr;<br>}<br>&nbsp;<br><br><br>　　5.<br><br>char&nbsp;*&nbsp;strrev(char&nbsp;*&nbsp;pstr)<br>{<br>&nbsp;assert(pstr!=NULL);<br>&nbsp;<br>&nbsp;char&nbsp;*&nbsp;p=pstr;<br>&nbsp;char&nbsp;*&nbsp;pret=pstr;<br>&nbsp;while(*(p++)!='\0');<br>&nbsp;p--;<br>&nbsp;char&nbsp;tmp;<br>&nbsp;while(p&gt;pstr)<br>&nbsp;{<br>&nbsp;&nbsp;tmp=*p;<br>&nbsp;&nbsp;*(p--)=*(pstr);<br>&nbsp;&nbsp;*(pstr++)=tmp;&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;return&nbsp;pret; <br><br>百度笔试题：<br>IP段格式:ip1&nbsp;ip2。之间以空格分开，ip形式为X.X.X.X，数据保存在文件中，文件不超过2k行，无序。现在要求编写算法去掉可重IP，可重有三种形式：包含、交叠、紧靠。 <br><br>例如，文件内容为： <br>10.0.0.0&nbsp;10.0.0.12 <br>10.0.0.5&nbsp;10.0.0.10&nbsp;&nbsp;&nbsp;&nbsp;( &lt;=&nbsp;包含) <br>10.0.0.8&nbsp;10.0.0.<span style="COLOR: #ff0000">15</span>&nbsp;&nbsp;&nbsp;&nbsp;( &lt;=&nbsp;交叠) <br>10.0.0.<span style="COLOR: #ff00ff">15</span>&nbsp;10.0.0.24&nbsp;&nbsp;&nbsp;( &lt;=&nbsp;紧靠) <br><br>最后输出为: <br>10.0.0.0&nbsp;10.0.0.24</p>
<p>code：<br>/*<br>**这个函数的作用是将文件中的一行对应的两个数据转换成整形的数据<br>**比如把10.0.0.0&nbsp;10.0.0.12 转换后，left=10*2<sup>24,</sup>就是10.0.0.0对应的整数，每个数字对应8位，right=left+12<br>*/<br>void ParseLine( char line[], size_t length, unsigned int &amp;left, unsigned int &amp;right)<br>{<br>&nbsp;&nbsp;&nbsp; size_t i;<br>&nbsp;&nbsp;&nbsp; for( i=0; i&lt;length; i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( line[i]=='.' || line[i]==' ' )//将点变成0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[i]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <font style="BACKGROUND-COLOR: #00ffff"><font style="BACKGROUND-COLOR: #ffff00">char *p&nbsp;&nbsp; = (char*)&amp;left;</font><br></font>&nbsp;&nbsp;&nbsp; char *num = line;<br>&nbsp;&nbsp;&nbsp; for( i=3; i&lt;4; --i ) //<font color=#ff0000>size是size_t，而size_t是unsigned int，所以i=0再自减后变成了最大的整数，循环就会终止<br></font>&nbsp;&nbsp;&nbsp; {<br>&nbsp;//&nbsp;cout&lt;&lt;i&lt;&lt;",";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(p+i) = strtol( num, &amp;num&nbsp; ,10 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;cout&lt;&lt;static_cast&lt;int&gt;(*(p+i))&lt;&lt;",";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++num;<br>&nbsp;//&nbsp;cout&lt;&lt;num&lt;&lt;":";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; p = (char*)&amp;right;<br>&nbsp;&nbsp;&nbsp; for( i=3; i&lt;4; --i )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(p+i) = strtol( num, &amp;num, 10 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++num;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><br>void UniqueSequence(&nbsp; vector&lt;unsigned int&gt; &amp; uSeq, unsigned int left, unsigned int right )<br>{<br>&nbsp;&nbsp;&nbsp; size_t i, lPos=-1, rPos=-1;<br>&nbsp;&nbsp;&nbsp; for( i=0; i&lt;uSeq.size(); i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( left &lt;= uSeq.at(i)&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lPos = i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; for( ;i&lt;uSeq.size(); i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( right&lt;=uSeq.at(i) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rPos=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if( lPos == -1 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.push_back( left );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.push_back( right );&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if( lPos%2 == 0 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&nbsp; uSeq.at(lPos)==left )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.insert( uSeq.begin()+lPos, left );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --lPos;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if( rPos == -1 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.erase( uSeq.begin()+(lPos+1), uSeq.end() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.push_back(right);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;else if(&nbsp; rPos%2 == 0&nbsp; )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( uSeq.at(rPos)== right )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+(rPos+1) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.insert( uSeq.begin()+rPos, right&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p><br>void PrintIP( unsigned int num )<br>{<br>&nbsp;&nbsp;&nbsp; char *p = (char*)&amp;num;<br>&nbsp;&nbsp;&nbsp; for( size_t i=3;i&gt;0; --i)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt; (int)p[i]&lt;&lt;".";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;(int)p[0];<br>}</p>
<p>#define MAX_BUFFER_LENGTH 100<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; unsigned int left, right;<br>&nbsp;&nbsp;&nbsp; char buffer[MAX_BUFFER_LENGTH];<br>&nbsp;&nbsp;&nbsp; ifstream infile( "test.txt" );<br>&nbsp;&nbsp;&nbsp; if( infile.fail() )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; vector&lt;unsigned int&gt; uSeq;<br>&nbsp;&nbsp;&nbsp; while( infile.getline(buffer, MAX_BUFFER_LENGTH) )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ParseLine(buffer, strlen(buffer), left, right);<br>&nbsp;//&nbsp;cout&lt;&lt;left&lt;&lt;","&lt;&lt;right&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UniqueSequence( uSeq, left, right );<br>&nbsp;&nbsp;for( size_t i=0; i&lt;uSeq.size(); i+=2 )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintIP(uSeq.at(i) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"&nbsp; ";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintIP(uSeq.at(i+1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; for( size_t i=0; i&lt;uSeq.size(); <font color=#ff0000>i+=2</font> )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintIP(uSeq.at(i) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"&nbsp; ";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintIP(uSeq.at(i+1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>/*<strong>long</strong> <strong>strtol(</strong> <strong>const</strong> <strong>char</strong> <strong>*</strong><em>nptr</em><strong>,</strong> <strong>char</strong> <strong>**</strong><em>endptr</em><strong>,</strong> <strong>int</strong> <em>base</em> <strong>),</strong>其中nptr是以NULL结尾字符串，<em>endptr</em>是字符串停止扫描的地方（Pointer to character that stops scan），<strong>strtol</strong> returns the value represented in the string <em>nptr，The <strong>strtol</strong> function converts nptr to a <strong>long</strong>. <strong>strtol</strong> stops reading the string nptr at the first character it cannot recognize as part of a number. This may be the terminating null character, or it may be the first numeric character greater than or equal to base. <br></em><font style="BACKGROUND-COLOR: #ffcc00">string = "-10110134932This stopped it";<br>&nbsp; l = strtol( string, &amp;stopstring, 10 );<br>&nbsp; printf( "string = %s", string );<br>&nbsp; printf("&nbsp;&nbsp; strtol = %ld", l );<br>&nbsp; printf("&nbsp;&nbsp; Stopped scan at: %s", stopstring );<br>&nbsp; string = "10110134932";<br>&nbsp; printf( "string = %s\n", string );<br>&nbsp; /* Convert string using base 2, 4, and 8: */<br>&nbsp; for( base = 2; base &lt;= 8; base *= 2 )<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; /* Convert the string: */<br>&nbsp;&nbsp;&nbsp;&nbsp; ul = strtoul( string, &amp;stopstring, base );<br>&nbsp;&nbsp;&nbsp;&nbsp; printf( "&nbsp;&nbsp; strtol = %ld (base %d)\n", ul, base );<br>&nbsp;&nbsp;&nbsp;&nbsp; printf( "&nbsp;&nbsp; Stopped scan at: %s\n", stopstring );<br>&nbsp; }<br>打印的结果是：<br>string = -10110134932This stopped it&nbsp;&nbsp; strtol = -2147483647&nbsp;&nbsp; Stopped scan at: This stopped itstring = 10110134932<br>&nbsp; strtol = 45 (base 2)<br>&nbsp; Stopped scan at: 34932<br>&nbsp; strtol = 4423 (base 4)<br>&nbsp; Stopped scan at: 4932<br>&nbsp; strtol = 2134108 (base 8)<br>&nbsp; Stopped scan at: 932<br>*/</font></p>
<p><font style="BACKGROUND-COLOR: #ffffff">5.如果存在两个变量：a和b，不使用&#8220;if&#8221;、&#8220;?:&#8221;、 &#8220;switch&#8221;和其它的判断语句，找出两个数中的最大值。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 答案：( ( a + b ) + abs( a - b ) ) / 2</font></p>
<p>6. 写一个函数找出一个整数数组中，第二大的数 （microsoft）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int MINNUMBER = -32767 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int find_sec_max( int data[] , int count)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int maxnumber = data[0] ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sec_max = MINNUMBER ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( int i = 1 ; i &lt; count ; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( data[i] &gt; maxnumber )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sec_max = maxnumber ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxnumber = data[i] ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( data[i] &gt; sec_max )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sec_max = data[i] ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sec_max ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><img src ="http://www.cppblog.com/mzty/aggbug/42876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-02-18 13:26 <a href="http://www.cppblog.com/mzty/archive/2008/02/18/42876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔试题（转）</title><link>http://www.cppblog.com/mzty/archive/2008/02/18/42875.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 18 Feb 2008 05:25:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/02/18/42875.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/42875.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/02/18/42875.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/42875.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/42875.html</trackback:ping><description><![CDATA[<div class=postText>
<p><br>一、如何判断一个单链表是有环的？（注意不能用标志位，最多只能用两个额外指针）<br>&nbsp;&nbsp; struct node { char val; node* next;}<br>&nbsp;&nbsp;&nbsp;bool check(const node* head) {} //return&nbsp;false : 无环；true: 有环<br>&nbsp;&nbsp;&nbsp; 一种O（n）的办法就是（搞两个指针，一个每次递增一步，一个每次递增两步，如果有环的话两者必然重合，反之亦然）：<br>&nbsp;&nbsp;&nbsp;&nbsp;bool check(const node* head)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(head==NULL)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return false;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;node *low=head, *fast=head-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(fast!=NULL &amp;&amp; fast-&gt;next!=NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; low=low-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fast=fast-&gt;next-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(low==fast) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp; }</p>
<p>&nbsp;二、删除一个单项链表的最中间的元素，要求时间尽可能短（不能使用两次循环）<br>struct link<br>{<br>&nbsp;&nbsp;&nbsp; int data;<br>&nbsp;&nbsp;&nbsp; struct link *next;<br>};<br><font color=#ff0000>void delMiddle(link *head)<br></font>{<br>&nbsp;&nbsp; &nbsp;if(head == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp; &nbsp;else if(head-&gt;next == NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;delete head;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;link *low = head;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; link *fast = head-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(fast != NULL &amp;&amp; fast-&gt;next != NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;fast = fast-&gt;next-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(fast == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low = low-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; link *temp = low-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;low-&gt;next = low-&gt;next-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;delete temp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; }<br>}<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;struct link *head,*l;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct link *s;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head = (link*)malloc(sizeof(link));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; head-&gt;data=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;head-&gt;next = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l = head;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;for(int i=1; i&lt;9; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = (link*)malloc(sizeof(link));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s-&gt;data = i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s-&gt;next = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l-&gt;next= s;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;l = l-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(head);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;delMiddle(head);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(head);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p>三、输入n，求一个n*n矩阵，规定矩阵沿45度线递增(威盛)<br><span style="COLOR: #008000">/**<br>&nbsp;* 得到如下样式的二维数组<br>* zigzag（jpeg编码里取象素数据的排列顺序）<br>*<br>*&nbsp;&nbsp; 0, 1, 5, 6,14,15,27,28,<br>*&nbsp;&nbsp; 2, 4, 7,13,16,26,29,42,<br>*&nbsp;&nbsp; 3, 8,12,17,25,30,41,43,<br>*&nbsp;&nbsp; 9,11,18,24,31,40,44,53,<br>*&nbsp;&nbsp; 10,19,23,32,39,45,52,54,<br>*&nbsp;&nbsp; 20,22,33,38,46,51,55,60,<br>*&nbsp;&nbsp; 21,34,37,47,50,56,59,61,<br>*&nbsp;&nbsp; 35,36,48,49,57,58,62,63<br>&nbsp;*/</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">void zigzag(int n)<br>{<br>&nbsp;int **a =(int**) malloc(n*sizeof(int *));&nbsp; //分配空间<br>&nbsp;<br>&nbsp;if(NULL == a)<br>&nbsp;&nbsp;return ;<br>&nbsp;int i;<br>&nbsp;for(i = 0; i &lt; n; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(--i&gt;=0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(a[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;bool flag = false; //这个标志位用来判断是从45度角生成还是225度角生成<br>&nbsp;int count = 0;<br>&nbsp;for(i=0; i&lt;n; i++)&nbsp; //生成的上半部分的数据<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;if(flag)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int r = 0; r&lt;=i; r++)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;a[r][i-r] = count;<br>&nbsp;&nbsp;&nbsp;&nbsp;count++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;flag = false;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int r = i; r&gt;=0; r--)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;a[r][i-r] = count;<br>&nbsp;&nbsp;&nbsp;&nbsp;count++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;flag = true;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;for(i=n-1; i&gt;=0; i--)&nbsp; //生成的是下半部分的数据<br>&nbsp;{<br>&nbsp;//&nbsp;cout&lt;&lt;i&lt;&lt;endl;<br>&nbsp;&nbsp;if(flag)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int r = 0; r&lt;=i-1; r++)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;int r1 = n-i+r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //代表当前行<br>&nbsp;&nbsp;&nbsp;&nbsp;int c1 = 2*n-i-1-r1;&nbsp; //代表当前列<br>&nbsp;&nbsp;&nbsp;&nbsp;a[r1][c1] = count;<br>&nbsp;&nbsp;&nbsp;&nbsp;count++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;flag = false;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;for(int r = i-1; r&gt;=0; r--)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"ddd"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;int r1 = n-i+r;<br>&nbsp;&nbsp;&nbsp;&nbsp;int c1 = 2*n-i-1-r1;<br>&nbsp;//&nbsp;&nbsp;&nbsp;cout&lt;&lt;r1&lt;&lt;","&lt;&lt;c1&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;a[r1][c1] = count;<br>&nbsp;&nbsp;&nbsp;&nbsp;count++;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;flag = true;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;for(int r = 0; r&lt;n; r++)<br>&nbsp;{<br>&nbsp;&nbsp;for(int c=0; c&lt;n; c++)<br>&nbsp;&nbsp;&nbsp;cout&lt;&lt;a[r][c]&lt;&lt;",";<br>&nbsp;&nbsp;cout&lt;&lt;endl;<br>&nbsp;}<br>}<br>int main()<br>{<br>&nbsp;int n;<br>&nbsp;cin&gt;&gt;n;<br>&nbsp;zigzag(n);<br>&nbsp;return 0;<br>}<br>网上还有一个人写了一个比较巧的算法：<br><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>* 得到如下样式的二维数组<br>* zigzag（jpeg编码里取象素数据的排列顺序）<br>*<br>*&nbsp;&nbsp; 0, 1, 5, 6,14,15,27,28,<br>*&nbsp;&nbsp; 2, 4, 7,13,16,26,29,42,<br>*&nbsp;&nbsp; 3, 8,12,17,25,30,41,43,<br>*&nbsp;&nbsp; 9,11,18,24,31,40,44,53,<br>*&nbsp;&nbsp; 10,19,23,32,39,45,52,54,<br>*&nbsp;&nbsp; 20,22,33,38,46,51,55,60,<br>*&nbsp;&nbsp; 21,34,37,47,50,56,59,61,<br>*&nbsp;&nbsp; 35,36,48,49,57,58,62,63<br></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br><br>#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> N;<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> s, i, j;<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> squa;<br>&nbsp;&nbsp;&nbsp; scanf(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">%d</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">N);<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 分配空间 </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> malloc(N </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(a </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((a[i] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> malloc(N </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">))) </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(a[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 数组赋值 </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp; squa </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> N</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">N;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; j </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(s </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#ff0000>a[i][j] </font></span><font color=#ff0000><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> s</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(s</span><span style="COLOR: #000000">+</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> (((i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">j)</span><span style="COLOR: #000000">%</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">?</span></font><span style="COLOR: #000000"><font color=#ff0000> i : j);<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (N</span><span style="COLOR: #000000">-</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">i) </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> (N</span><span style="COLOR: #000000">-</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#ff0000>a[i][j] </font></span><font color=#ff0000><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> squa </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> s</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(s</span><span style="COLOR: #000000">+</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> (N </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> (((i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">j)</span><span style="COLOR: #000000">%</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">?</span></font><span style="COLOR: #000000"><font color=#ff0000> i : j));<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> 打印输出 </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">; j </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> N; j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">%-6d</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, a[i][j]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">\n</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>}<br></span></span></p>
<p><span style="COLOR: #000000"><span style="COLOR: #000000">四、打印1到1000的整数，不能使用流程控制语句(for,while,goto等)也不能使用递归<br>1.<br>typedef <span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> _test{<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a;<br>&nbsp;&nbsp;&nbsp; _test(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">%d\n</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,_test::a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }Test;<br>&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> Test::a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">;<br><br>&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp; main()&nbsp;&nbsp; <br>&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; Test tt[</span><span style="COLOR: #800080">1000</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>&nbsp; }&nbsp;&nbsp; <br>2.<br>#include &nbsp; &lt;stdio.h&gt; <br>#define &nbsp; B &nbsp; P,P,P,P,P,P,P,P,P,P <br>#define &nbsp; P &nbsp; L,L,L,L,L,L,L,L,L,L <br>#define &nbsp; L &nbsp; I,I,I,I,I,I,I,I,I,I,N <br>#define &nbsp; I &nbsp; printf( "%3d &nbsp; ",i++) <br>#define &nbsp; N &nbsp; printf( "\n ")&nbsp;<br>int&nbsp; main() <br>{ <br>&nbsp; &nbsp; int &nbsp; i &nbsp; = &nbsp; 1; <br>&nbsp; &nbsp; B; <br>} <br>或<br><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> A(x) x;x;x;x;x;x;x;x;x;x;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main () <br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">; <br>&nbsp;&nbsp;&nbsp; A(A(A(printf (</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">%d </span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, n</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">))));<br><br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">;<br>}</span><br><br></span></span></span><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></p>
<p><span style="COLOR: #000000">五、struct &nbsp; S &nbsp; { <br>&nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; i; <br>&nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; * &nbsp; p; <br>}; <br>void &nbsp; main() <br>{ <br>&nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; s; <br>&nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; * &nbsp; p &nbsp; = &nbsp; &amp;s.i; <br>&nbsp; &nbsp; &nbsp; &nbsp; p[0] &nbsp; = &nbsp; 4; <br>&nbsp; &nbsp; &nbsp; &nbsp; p[1] &nbsp; = &nbsp; 3; <br>&nbsp; &nbsp; &nbsp; &nbsp; s.p &nbsp; = &nbsp; p; <br>&nbsp; &nbsp; &nbsp; &nbsp; s.p[1] &nbsp; = &nbsp; 1; <br>&nbsp; &nbsp; &nbsp; &nbsp; s.p[0] &nbsp; = &nbsp; 2; <br>} <br>问程序会在哪一行死掉。 （microsoft）<br>解： S&nbsp;&nbsp; s; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp; p&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">s.i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s.i的地址存储在p里</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">]&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #800080">4</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改了s.i</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">]&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #800080">3</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改了s.p</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;s.p&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s.p指向s.i</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;s.p[</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">]&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改s.p本身</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.p[</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">]&nbsp;&nbsp; </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp; </span><span style="COLOR: #800080">2</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s.p指向的是0x00000001,尝试向这里写,出错<br><font color=#000000>&nbsp;&nbsp;&nbsp;&nbsp; s.p[0] &nbsp; &nbsp; &nbsp; = &nbsp; &nbsp; &nbsp; 2; &nbsp; 时出错 <br>&nbsp;&nbsp;&nbsp;&nbsp; 因为s.p存的是s.i的地址,s.p[1]为s.p,当s.p[1]=1时,s.p此时存放的是1了,而不是地址s.i,故在s.p[0] &nbsp; = &nbsp; 2时出错. <br>此时相当于s.p=ox00000001;地址ox0000001 &nbsp; = &nbsp; 2;当然就出错了 <br><br>如果语句s.p[0] &nbsp; =2 &nbsp; 先于s.p[1]=1则程序就不会出错.此时语句相当于s.i=2;s.p=1; </font><br></span></span></p>
<p><span style="COLOR: #000000">六、题目描述： <br>1.&nbsp;&nbsp; int &nbsp; swap(int &nbsp; *x,int &nbsp; *y) <br>{ <br>&nbsp; &nbsp; if(x==NULL &nbsp; &#166; &#166; &nbsp; y==NULL) <br>&nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; -1; <br>&nbsp; &nbsp; *x &nbsp; += &nbsp; *y; <br>&nbsp; &nbsp; *y &nbsp; = &nbsp; *x- &nbsp; *y; <br>&nbsp; &nbsp; *x &nbsp; -= &nbsp; *y; <br>&nbsp; &nbsp; &nbsp; return &nbsp; 1; <br>} <br>请改错，溢出已经考虑，不是错误 <br>2. <br>void &nbsp; foo(int &nbsp; *x, &nbsp; int &nbsp; *y) <br>{ <br>&nbsp; &nbsp; *x &nbsp; += &nbsp; *y; <br>&nbsp; &nbsp; *x &nbsp; += &nbsp; *y; <br>} <br>void &nbsp; fun(int &nbsp; *x, &nbsp; int &nbsp; *y) <br>{ &nbsp; <br>&nbsp; &nbsp; *x &nbsp; += &nbsp; 2 &nbsp; * &nbsp; (*y); <br>&nbsp; } <br>问两个函数是否等价，能否互换 <br>解答<font color=#ff0000>：第一题的函数是交换。但假如考虑x, &nbsp; y都是指向同一个变量,结果是这个变量的值为0. <br>第二题的两个函数是有区别的,也考虑x,y是指向同一个变量.这样第一个函数的结果是这个变量的4倍.但第二个函数的结果是变量的3倍</font>.<br></span></p>
</div><img src ="http://www.cppblog.com/mzty/aggbug/42875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-02-18 13:25 <a href="http://www.cppblog.com/mzty/archive/2008/02/18/42875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2007年迅雷招聘网上试题及解答1 (转)</title><link>http://www.cppblog.com/mzty/archive/2008/02/18/42874.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 18 Feb 2008 05:20:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/02/18/42874.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/42874.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/02/18/42874.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/42874.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/42874.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://blog.csdn.net/ztj111/archive/2007/10/20/1834284.aspx">http://blog.csdn.net/ztj111/archive/2007/10/20/1834284.aspx</a></p>
<p>1.下列程序的输出结果为：(B)<br>#include&lt;iostream.h&gt;<br>void main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char* a[ ] = { "hello", "the", "world"};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char** pa = a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pa++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;&#8221;*pa&lt;&lt;endl;<br>}<br>A) theworld&nbsp;&nbsp;&nbsp; B) the&nbsp;&nbsp; C) ello&nbsp;&nbsp;&nbsp; D) ellotheworld<br>&nbsp;<br>2. 已知二叉树后序遍历序列是bfegcda，中序遍历序列是badefcg，它的前序遍历序列是：(B)<br>A) abcdefg&nbsp;&nbsp;&nbsp;&nbsp; B) abdcefg&nbsp;&nbsp;&nbsp; C) adbcfeg&nbsp;&nbsp;&nbsp; D) abecdfg<br>&nbsp;<br>3. 栈和队列的共同特点是：(C)<br>A) 都是先进先出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 都是先进后出<br>C) 只允许在短点处插入和删除元素 D) 没有共同点<br>&nbsp;<br>4. 下面程序的运行结果为：(A)<br>#include &lt;iostream.h&gt;<br>void main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a, x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(a = 0, x = 0; a&lt;=1 &amp;&amp; !x++; a++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt; a &lt;&lt; x &lt;&lt;endl;<br>}<br>A) 21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 41<br>&nbsp;<br>5. 下列选项，不正确的是：(B) while后没有分号<br>&nbsp;A) for(int a=1; a&lt;=10; a++);<br>B) int a=1;<br>&nbsp;&nbsp; do<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a++;<br>&nbsp;&nbsp; }while(a&lt;=10)<br>C) int a=1;<br>&nbsp;&nbsp; while(a&lt;=10)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a++;<br>}<br>D) for(int a= 1; a&lt;=10; a++)a++;<br>6. 下面关于数组的初始化正确的是：(B)<br>A) char str[2] = {&#8220;a&#8221;,&#8221;b&#8221;};<br>B) char str[2][3]={&#8220;a&#8221;,&#8221;b&#8221;};<br>C) char str[2][3]={{&#8216;a&#8217;,&#8217;b&#8217;},{&#8216;e&#8217;,&#8217;d&#8217;},{&#8216;e&#8217;,&#8217;f&#8217;}};<br>D) char str[] = {&#8220;a&#8221;, &#8220;b&#8221;};<br>&nbsp; </p>
<p>7. 下列说法正确的是：(B)<br>A) 内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方<br>B) 内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方<br>C) 类的内联函数必须在类体内定义<br>D) 类的内联函数必须在类体外通过关键字inline定义<br>&nbsp;<br>8．下面对静态成员的描述中，正确的是：(D)<br>A) 静态数据成员可以在类体内初始化<br>B) 静态数据成员不可以被类的对象调用<br>C) 静态数据成员不能受private控制符的作用<br>D) 静态数据成员可以直接用类名调用<br>&nbsp;<br>9. 下列运算符中，在C++语言中不能重载的是：(C)<br>A) *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) &gt;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) ::&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) delete<br>&nbsp;<br>10 下面关于多态性的描述，错误的是：(C)<br>A) C++语言的多态性分为编译时的多态性和运行时的多态性<br>B) 编译时的多态性可通过函数重载实现<br>C) 运行时的多态性可通过模板和虚函数实现 //模板的是编译时多态性，而虚函数是运行时<br>D) 实现运行时多态性的机制称为动态绑定<br>&nbsp;<br>11. 如果进栈序列为e1,e2,e3,e4,e5,则可能的出栈序列是：(D)<br>A) e3,e2,e5,e4,e1<br>B) e2,e3,e5,e4,e1<br>C)&nbsp;&nbsp;&nbsp; e3,e2,e4,e5,e1<br>D) 以上都有可能<br>&nbsp;<br>12 下面关于类和对象的描述中，错误的是：(A)<br>A) 类就是C语言中的结构体类型，对象就是C语言中的结构体变量<br>B) 类和对象之间的关系是抽象和具体的关系<br>C) 对象是类的实例，一个对象必须属于一个已知的类<br>D) 类是具有共同行为的若干对象的统一描述体<br>&nbsp;<br>13.下面关于数组的描述错误的是：（D）<br>A) 在C++语言中数组的名字就是指向该数组第一个元素的指针<br>B) 长度为n的数组，下标的范围是0－n-1<br>C) 数组的大小必须在编译是确定<br>D) 数组只能通过值参数和引用参数两种方式传递给函数<br>注释：<br>在把数组作为参数传递给函数时，有值传递(by value)和地址传递(by reference)两种方式。 <br>&nbsp;&nbsp;&nbsp; 在值传递方式中，要在数组参数的尾部加上一对方括号([])，调用函数时只需将数组的地址(即数组名)传递给函数。 <br>&nbsp;&nbsp;&nbsp; 例如：如果数组x被声明为：int x[10]; <br>&nbsp;&nbsp;&nbsp; 那麽函数被说明为：void byval_func(int[]); <br>&nbsp;&nbsp;&nbsp; 参数int[]告诉编译程序byval_func()函数只有一个参数,即一个由int型值组成的数组。&nbsp;&nbsp;&nbsp;&nbsp; <br>函数调用时只需将数组名传递给函数:byval_func(x);<br>#include &lt;stdio.h&gt; <br>&nbsp;void byval_func(int[]); <br>&nbsp;void main(void); <br>&nbsp;void main(void)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; int x[10];<br>&nbsp;&nbsp;&nbsp;&nbsp; int y;<br>&nbsp;&nbsp;&nbsp;&nbsp; for(y=0;y&lt;10;y++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[y]=y;<br>&nbsp;&nbsp;&nbsp;&nbsp; byval_func(x);&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;} <br>&nbsp;void byal_func(int i[])<br>&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp; int y;<br>&nbsp;&nbsp;&nbsp;&nbsp; for(y=0;y&lt;10;y++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",i[y]);<br>&nbsp;}<br>在值传递方式中,数组x将被复制一份,复制所得的数组将被存放在栈中,然后由byval_func()函数接收并打印出来。由於传递给byval_func()函数的是初始数组的一份拷贝，因此在byval_func()函数内部修改传递过来的数组对初始数组没有任何影响。 <br>&nbsp;&nbsp;&nbsp; 值传递方法的开销是很大的，因为首先它要完整地复制初始数组并将这份拷贝存放到栈中，这将耗费相当可观的运行时间， 因而值传递方法效率较低；其次，初始化数组的拷贝需要占用额外的内存空间（栈中的内存）；最后，编译程序需要专门产生一部分用来复制初始数组的代码，这将使程序变大。<br>&nbsp;&nbsp;&nbsp; 地址传递方法克服了值传递方法的缺点。在地址传递方法中，传递给函数的是指向初始数组的指针，不用复制数组，因此程序变得简练，也节省了栈中的内存空间。在地址传递过程中,只需在函数原形中将函数的参数说明为指向数组元素数据类型的一个指针。<br>&nbsp;&nbsp;&nbsp; 例如同样定义一个数组x：int x[10];<br>&nbsp;&nbsp;&nbsp; 那麽函数被说明为：int const_funt(const int*);<br>&nbsp;&nbsp;&nbsp; 参数const int*告诉编译程序const_funt()函数只有一个参数,即指向一个int类型常量的指针。<br>&nbsp;&nbsp;&nbsp; 函数调用时只需将数组的地址传递给函数:const_func(x);<br>#include &lt;stdio.h&gt; <br>&nbsp;void const_func(const int*); <br>&nbsp;void main(void); <br>&nbsp;void main(void)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; int x[10];<br>&nbsp;&nbsp;&nbsp;&nbsp; int y;<br>&nbsp;&nbsp;&nbsp;&nbsp; for(y=0;y&lt;10;y++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[y]=y;<br>&nbsp;&nbsp;&nbsp;&nbsp; constl_func(x);&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;} <br>&nbsp;void const_func(const int*i)<br>&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp; int y;<br>&nbsp;&nbsp;&nbsp;&nbsp; for(y=0;y&lt;10;y++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",*(i+y));<br>&nbsp;}<br>&nbsp;在值传递方式中,没有复制初始数组并将其拷贝存放在栈中,const_func()函数只接收到指向一个int类型常量的指针,因此在编写程序时要保证传递给const_func()函数的是指向一个由int类型常量组成的数组的指针。const修饰符的作用是防止意外修改初始数组中的某一个元素。<br>&nbsp;<br>14． 引用标准库时，下面的说法你认为哪个是正确的：（B）<br>A) 语句#include &#8220;stdlib.h&#8221;是正确的，但会影响程序的执行速度<br>B) 语句#include &lt;stdlib.h&gt;是正确的，而去程序执行速度比#include &#8220;stdlib.h&#8221;要快<br>C) 语句#include &lt;stdlib.h&gt;和#include &#8220;stdlib.h&#8221;都是正确的，程序执行速度没有区别<br>D) 语句#include &#8220;stdlib.h&#8221;是错误的<br>注释：include&nbsp;&nbsp; ""是先从本地目录开始寻找，然后去寻找系统路径，而Include&nbsp;&nbsp; &lt;&gt;&nbsp;&nbsp; 相反先从系统目录，后从本地目录，<br>&nbsp;<br>15.设a、b、c、d、m、n均为int型变量，且a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式（m=a&gt;b）&amp;&amp;(n=c&gt;d)运算后，n的值为：（C）<br>A) 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 7<br>&nbsp;<br>16．不能作为重载函数的调用的依据是：（C）<br>A) 参数个数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 参数类型<br>C) 函数类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 函数名称<br>&nbsp;<br>17．下列程序的输出结果为: (D)<br>#include&lt; iostream. h&gt;<br>int func(int n)<br>{<br>　　if〔n&lt;1)return 1;<br>else return n+func(n-1);<br>return 0;<br>}<br>void main()<br>{<br>cout&lt;&lt;func(5)&lt;&lt;endl;<br>}<br>A) 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B)10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C)15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D)16<br>&nbsp;<br>18. 建立派生类对象时,3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这3种构造函数的调用顺序为: (A)<br>A)abc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　B)acb<br>C)cab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D)cba<br>&nbsp;<br>19. 如果友元函数重载一个运算符时，其参数表中没有任何参数则说明该运算符是：（D）<br>A）一元运算符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B）二元运算符<br>C）选项A）和选项B）都可能&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D）重载错误<br>解析：C++中用友元函数重载运算符至少有一个参数，重载一目运算符要有一个参数，重载二目运算符要有两个参数。<br>&nbsp;<br>20. 有以下程序段：（D）？<br>#define F(X,Y)&nbsp;&nbsp; (X)--; (Y)++ (X)*(Y);<br>&#8230;<br>int i, a = 3, b = 4;<br>for( i = 0; i&lt;5; i++)&nbsp;&nbsp; F(a,b)<br>printf(&#8220;%d, %d&#8221;, a, b);<br>输出结果是：（）<br>A) 3, 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 3, 5<br>C) -2, 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) -2, 9<br>&nbsp;<br>21. 下列for循环的循环体执行次数为：（A）<br>for(int i(10), j(1); i=j=0; i++, j--)<br>A) 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 无限;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D)以上都不对<br>&nbsp;<br>22. 下面程序的输出结果是（D）<br>char *p1= &#8220;123&#8221;, *p2 = &#8220;ABC&#8221;, str［50］= "xyz";<br>strcpy（str+2,strcat（p1,p2））;<br>cout &lt;&lt; str;<br>A）xyz123ABC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B）z123ABC<br>C）xy123ABC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D）出错<br>&nbsp;<br>23．下面函数的执行结果是输出（B）<br>char str[ ] = &#8220;xunlei&#8221;;<br>char *p = str;<br>int n = 10;<br>printf(&#8220;%d, %d, %d\n&#8221;, sizeof(str), sizeof(p), sizeof(n));<br>A) 4, 4, 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 7, 4, 4<br>C) 6, 4, 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 6, 6, 4<br>&nbsp;<br>33. 有下列程序段：<br>char *p, *q;<br>p = (char*) malloc(sizeof(char) * 20);<br>q = p;<br>scanf(&#8220;%s %s&#8221;, p, q);<br>printf(&#8220;%s %s\n&#8221;, p, q);<br>若从键盘输入：abc def， 则输出结果是（A）<br>A) def def&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) abc def<br>C) abc d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) d d<br>解析：q=p;因此p,q指向的是同一段内存.scanf先是把abc写到p指向的空间,再把def写到q指向的空间,也就是同一段空间,因此abc被def覆盖了.<br>&nbsp;<br>34．现在有以下语句：<br>struct _THUNDER{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iVersion;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cTag;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cAdv;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iUser;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cEnd;<br>}Thunder;<br>int sz = sizeof(Thunder);<br>则执行后，变量sz的值将得到（D）<br>A) 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 16<br>&nbsp;<br>35. 有如下程序段：<br>void GetMemeory(char* p)<br>｛<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = (char*) malloc (100);<br>｝<br>void test()<br>{<br>char *str=NULL;<br>GetMemory(str);<br>strcpy(str,&#8221;Thunder&#8221;);<br>strcat(str+2, &#8220;Downloader&#8221;);<br>&nbsp;printf(str);<br>}<br>请问运行Test函数结果是：（D）<br>A) Thunder Downloader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) under Downloader<br>C) Thunderownloader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 程序崩溃<br>解析：在函数中给指针分配空间，实际上是给指针的临时变量分配空间，函数结束后，这个临时变量也消亡，而str仍然为NULL，没有为其分配空间，此时strcpy()是肯定会出错的。<br>&nbsp;<br>36. 函数调用exec((v1,v2), (v3,v4,v5),v6,v7);中，实参的个数是（A）<br>A) 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;<br>37. p是指向类X的成员m的指针，s是类X的一个对象。现要给m赋值，（C）是正确的。<br>A) s.p = 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) s-&gt;p = 5<br>C) s.*p = 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) *s.p = 5<br>&nbsp;<br>38. 函数fun（char* p） { return p;}的返回值是（B）<br>A)无确切值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 行参p中存放的地址值<br>C) 一个临时存储单元的地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 行参p自身的地址值<br>&nbsp;<br>39．a,b均为不等于0的整形变量，以下关系式恒成立的是：（C）<br>A) a*b/a*b == 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) a/b*b/a == 1<br>C) a/b*b + a%b == a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) a/b*b == a<br>&nbsp;<br>40. 设有如下说明：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef struct ST{ long a; int b; char c[2]; } NEW; <br>则下面叙述中正确的是：(C)<br>A）以上的说明形式非法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B）ST是一个结构体类型 <br>C）NEW是一个结构体类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D）NEW是一个结构体变量<br>&nbsp;<br>41. 下列表达式正确的是：（C）<br>A) 9++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) （x+y）++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) c+++c+++c++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) ++（a-b--）<br>&nbsp;<br>42．在int b[ ][3] = {{1},{3,2},{4,5,6},{0}};中，sizeof(b) = （D）。<br>A) 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 48<br>&nbsp;<br>43．以下程序的输出结果是：(D)<br>#define M(x,y,z) x*y+z<br>main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a=1, b=2, c=3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&#8220;%d\n&#8221;,M(a+b,b+c,c+a));<br>}<br>A）19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 12<br>&nbsp;<br>44．若有以下定义和语句：<br>int u=010, v= 0x10, w=10;<br>printf(&#8220;%d，%d,%d\n&#8221;,u,v,w);<br>则输出结果是：(A)<br>A)8,16,10&nbsp;&nbsp;&nbsp;&nbsp; B)10,10,10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C)8,8,10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D)8,10,10<br>&nbsp;<br>45. 下面程序段的输出结果是：（B）<br>int a=5, b=4, c=3, d=2;<br>if(a&gt;b&gt;c)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&#8220;%d\n&#8221;,d);<br>else if((c-1&gt;=d)==1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&#8220;%d\n&#8221;, d+1);<br>else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&#8220;%d\n&#8221;, d+1);<br>A) 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 编译错误<br>&nbsp;<br>46．有如下程序段，请问k的值是：（D）<br>enum {a, b=5, c, d=4, e} k; k =c;<br>A) 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B）4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 6<br>&nbsp;<br>47．有如下程序段：<br>int i, n = 0;<br>double x = 1, y1 = 2.1/1.9, y2 = 1.9/2.1;<br>for( i = 1; i&lt;22; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = x*y1;<br>while( x!=1.0)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x =x*y2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n++;<br>}<br>printf(&#8220;%d\n&#8221;, n);<br>请问执行结果是：（A）<br>A) 21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C)无限循环&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 程序崩溃<br>&nbsp;<br>48. 用树形结构表示实体之间联系的模型是（C）<br>A) 关系模型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 网状模型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 层次模型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D)以上三个都是<br>&nbsp;<br>49．有如下程序段：<br>char fun(char *);<br>main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *s = &#8220;one&#8221;, a[5] = {0}, (*f1)(char *) = fun, ch;<br>}<br>则对函数fun的调用语句正确的是（C）<br>A) *f1(&amp;a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) f1（*s）;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) f1(&amp;ch)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) ch = *f1(s);要改成（*f1）(s)才正确<br>&nbsp;<br>50．有如下程序段：<br>int c = 23;<br>printf(&#8220;%d\n&#8221;, c&amp;c);<br>请问执行结果是：（C）<br>A) 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B) 46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C) 23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D) 以上都不对<br></p><img src ="http://www.cppblog.com/mzty/aggbug/42874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-02-18 13:20 <a href="http://www.cppblog.com/mzty/archive/2008/02/18/42874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>本博客所有精华随笔索引</title><link>http://www.cppblog.com/mzty/archive/2008/01/17/41318.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 17 Jan 2008 02:14:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/01/17/41318.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/41318.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/01/17/41318.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/41318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/41318.html</trackback:ping><description><![CDATA[<p><br>总结：<a href="http://www.cppblog.com/mzty/archive/2007/08/13/29922.html"><br><br>http://www.cppblog.com/mzty/archive/2007/08/13/29922.html</a>&nbsp; C++高级</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/02/19109.html">http://www.cppblog.com/mzty/archive/2007/03/02/19109.html</a>&nbsp; C++基础</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/04/16/22064.html">http://www.cppblog.com/mzty/archive/2007/04/16/22064.html</a>&nbsp; C#界面，C++核心算法</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/04/19163.html">http://www.cppblog.com/mzty/archive/2007/03/04/19163.html</a>&nbsp; 设计模式</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/29/20893.html">http://www.cppblog.com/mzty/archive/2007/03/29/20893.html</a>&nbsp; 64bit，FW3.0随笔分类 </p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/29/20892.html">http://www.cppblog.com/mzty/archive/2007/03/29/20892.html</a>&nbsp; windows脚本技术</p>
<p><a href="http://www.cppblog.com/mzty/archive/2007/03/04/19167.html">http://www.cppblog.com/mzty/archive/2007/03/04/19167.html</a>&nbsp; C#基础</p><img src ="http://www.cppblog.com/mzty/aggbug/41318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-01-17 10:14 <a href="http://www.cppblog.com/mzty/archive/2008/01/17/41318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#的Form通过CLI调用C++的DLL</title><link>http://www.cppblog.com/mzty/archive/2007/12/25/39610.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 25 Dec 2007 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/25/39610.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/39610.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/25/39610.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/39610.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/39610.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C#的project调用C++的DLL，一般也有3中方法：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）最简单的方法，通过PInvoke，但是只能调用全局function，不能调用Class。&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2007/12/25/39610.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/39610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-25 19:14 <a href="http://www.cppblog.com/mzty/archive/2007/12/25/39610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NativeC++通过CLI调用C#的Form</title><link>http://www.cppblog.com/mzty/archive/2007/12/25/39555.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 25 Dec 2007 02:51:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/25/39555.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/39555.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/25/39555.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/39555.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/39555.html</trackback:ping><description><![CDATA[<br>一 调用方法<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Native C++的project调用C#的DLL，一般有3中方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）通过COM封装<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）通过CLI/C++的Wrapper<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)&nbsp; 在VS中可以直接修改NativeC++的project或是部分文件为使用CLR来调用C#的DLL<br><br>二 实例<br>1）C#的一个MyForm类，有public函数ShowMyForm（）<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Text;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Windows.Forms;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;CsharpDLL<br><img id=Codehighlighter1_116_1454_Open_Image onclick="this.style.display='none'; Codehighlighter1_116_1454_Open_Text.style.display='none'; Codehighlighter1_116_1454_Closed_Image.style.display='inline'; Codehighlighter1_116_1454_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_116_1454_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_1454_Closed_Text.style.display='none'; Codehighlighter1_116_1454_Open_Image.style.display='inline'; Codehighlighter1_116_1454_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_116_1454_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_116_1454_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;MyForm&nbsp;:&nbsp;Form<br><img id=Codehighlighter1_153_1452_Open_Image onclick="this.style.display='none'; Codehighlighter1_153_1452_Open_Text.style.display='none'; Codehighlighter1_153_1452_Closed_Image.style.display='inline'; Codehighlighter1_153_1452_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_153_1452_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_153_1452_Closed_Text.style.display='none'; Codehighlighter1_153_1452_Open_Image.style.display='inline'; Codehighlighter1_153_1452_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_153_1452_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_153_1452_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;Button&nbsp;button1;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ShowMyForm()<br><img id=Codehighlighter1_229_270_Open_Image onclick="this.style.display='none'; Codehighlighter1_229_270_Open_Text.style.display='none'; Codehighlighter1_229_270_Closed_Image.style.display='inline'; Codehighlighter1_229_270_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_229_270_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_270_Closed_Text.style.display='none'; Codehighlighter1_229_270_Open_Image.style.display='inline'; Codehighlighter1_229_270_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_229_270_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_229_270_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ShowDialog();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;MyForm()<br><img id=Codehighlighter1_304_448_Open_Image onclick="this.style.display='none'; Codehighlighter1_304_448_Open_Text.style.display='none'; Codehighlighter1_304_448_Closed_Image.style.display='inline'; Codehighlighter1_304_448_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_304_448_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_304_448_Closed_Text.style.display='none'; Codehighlighter1_304_448_Open_Image.style.display='inline'; Codehighlighter1_304_448_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_304_448_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_304_448_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyForm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.StartPosition&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FormStartPosition.CenterScreen;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;InitializeComponent()<br><img id=Codehighlighter1_501_1303_Open_Image onclick="this.style.display='none'; Codehighlighter1_501_1303_Open_Text.style.display='none'; Codehighlighter1_501_1303_Closed_Image.style.display='inline'; Codehighlighter1_501_1303_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_501_1303_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_501_1303_Closed_Text.style.display='none'; Codehighlighter1_501_1303_Open_Image.style.display='inline'; Codehighlighter1_501_1303_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_501_1303_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_501_1303_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.Windows.Forms.Button();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.SuspendLayout();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;button1<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Location&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.Drawing.Point(</span><span style="COLOR: #000000">110</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">74</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">button1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Size&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.Drawing.Size(</span><span style="COLOR: #000000">75</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">23</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.TabIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TestMessageBox</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.UseVisualStyleBackColor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1.Click&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.EventHandler(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1_Click);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;MyForm<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ClientSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;System.Drawing.Size(</span><span style="COLOR: #000000">292</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">266</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Controls.Add(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.button1);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyForm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ResumeLayout(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;button1_Click(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br><img id=Codehighlighter1_1377_1446_Open_Image onclick="this.style.display='none'; Codehighlighter1_1377_1446_Open_Text.style.display='none'; Codehighlighter1_1377_1446_Closed_Image.style.display='inline'; Codehighlighter1_1377_1446_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1377_1446_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1377_1446_Closed_Text.style.display='none'; Codehighlighter1_1377_1446_Open_Image.style.display='inline'; Codehighlighter1_1377_1446_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1377_1446_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1377_1446_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello,&nbsp;i&nbsp;am&nbsp;a&nbsp;Csharp&nbsp;Form!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>2）C#的exe调用<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Text;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;CsharpTest<br><img id=Codehighlighter1_89_411_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_411_Open_Text.style.display='none'; Codehighlighter1_89_411_Closed_Image.style.display='inline'; Codehighlighter1_89_411_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_89_411_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_411_Closed_Text.style.display='none'; Codehighlighter1_89_411_Open_Image.style.display='inline'; Codehighlighter1_89_411_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_89_411_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_89_411_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Program<br><img id=Codehighlighter1_113_409_Open_Image onclick="this.style.display='none'; Codehighlighter1_113_409_Open_Text.style.display='none'; Codehighlighter1_113_409_Closed_Image.style.display='inline'; Codehighlighter1_113_409_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_113_409_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_113_409_Closed_Text.style.display='none'; Codehighlighter1_113_409_Open_Image.style.display='inline'; Codehighlighter1_113_409_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_113_409_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_113_409_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;args)<br><img id=Codehighlighter1_163_403_Open_Image onclick="this.style.display='none'; Codehighlighter1_163_403_Open_Text.style.display='none'; Codehighlighter1_163_403_Closed_Image.style.display='inline'; Codehighlighter1_163_403_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_163_403_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_403_Closed_Text.style.display='none'; Codehighlighter1_163_403_Open_Image.style.display='inline'; Codehighlighter1_163_403_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_163_403_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_163_403_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Csharp&nbsp;main&nbsp;funtion&nbsp;start:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CsharpDLL.MyForm&nbsp;myForm&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CsharpDLL.MyForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myForm.ShowMyForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Csharp&nbsp;main&nbsp;function&nbsp;end!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>3）CLI/C++的warpper，DLLexport函数CallCsharpForm（），此函数中调用C#的MyForm<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">CPPCLIPROXYDLLFORCSHARPDLL_API&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CallCsharpForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#</span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">../debug/CsharpDll.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>CPPCLIPROXYDLLFORCSHARPDLL_API&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CallCsharpForm()<br><img id=Codehighlighter1_141_222_Open_Image onclick="this.style.display='none'; Codehighlighter1_141_222_Open_Text.style.display='none'; Codehighlighter1_141_222_Closed_Image.style.display='inline'; Codehighlighter1_141_222_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_141_222_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_141_222_Closed_Text.style.display='none'; Codehighlighter1_141_222_Open_Image.style.display='inline'; Codehighlighter1_141_222_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_141_222_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_141_222_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CsharpDLL::MyForm</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">&nbsp;myForm&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;gcnew&nbsp;CsharpDLL::MyForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;myForm</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ShowMyForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>4）NativeC++的exe调用CLI的Wrapper来间接的调用MyForm<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#pragma&nbsp;comment(lib,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">../debug/CppCLIProxyDLLForCsharpDLL.lib</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CallCsharpForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_166_300_Open_Image onclick="this.style.display='none'; Codehighlighter1_166_300_Open_Text.style.display='none'; Codehighlighter1_166_300_Closed_Image.style.display='inline'; Codehighlighter1_166_300_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_166_300_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_166_300_Closed_Text.style.display='none'; Codehighlighter1_166_300_Open_Image.style.display='inline'; Codehighlighter1_166_300_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_166_300_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_166_300_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;Cpp&nbsp;Main&nbsp;function&nbsp;start:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CallCsharpForm();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;Cpp&nbsp;Main&nbsp;function&nbsp;end!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>三 总结<br>要调试最好修改编译选项为Mixed。<br><br>代码下载： <a href="http://www.cppblog.com/Files/mzty/CppCallCsharpByCLI.rar">http://www.cppblog.com/Files/mzty/CppCallCsharpByCLI.rar</a><br><img src ="http://www.cppblog.com/mzty/aggbug/39555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-25 10:51 <a href="http://www.cppblog.com/mzty/archive/2007/12/25/39555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLI/C++中混合类的使用</title><link>http://www.cppblog.com/mzty/archive/2007/12/24/39517.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 24 Dec 2007 09:47:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/24/39517.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/39517.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/24/39517.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/39517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/39517.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 混合类所谓混合类是指CLI/C++中native的Class中可以包含CLR对象，CLR的class也可以包含Naitve的对象。1）native的class中包含CLR对象，必须通过gcroot&lt;&gt;或auto_gcroot&lt;&gt;。2）CLR中的class中包含native的对象，必须是指针，也可以使用高手写的CAutoNativePtr智能指针。注意：C#中不能...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2007/12/24/39517.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/39517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-24 17:47 <a href="http://www.cppblog.com/mzty/archive/2007/12/24/39517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个CLI/C++的DLL同时被C#的exe和NativeC++的exe调用</title><link>http://www.cppblog.com/mzty/archive/2007/12/20/39165.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 20 Dec 2007 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/20/39165.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/39165.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/20/39165.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/39165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/39165.html</trackback:ping><description><![CDATA[<br>&nbsp;一&nbsp;引子<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）使用VS2005，Native C++，C#，CLI/C++。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）主要介绍CLI/C++和Native C++, C#的交互，最总能够实现以CLI/C++为中介的Native C++与C#的互调。<br><br>&nbsp;二 实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）实现一个CLI/C++的Dll，在此Dll中包含一个RefClass能够被C#的exe调用。（实现过程：在VS中建立C++ CLR Class library 的一个Project，然后增加一个类RefClass）代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refclass.h文件：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#pragma&nbsp;once&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll&nbsp;<br><img id=Codehighlighter1_36_196_Open_Image onclick="this.style.display='none'; Codehighlighter1_36_196_Open_Text.style.display='none'; Codehighlighter1_36_196_Closed_Image.style.display='inline'; Codehighlighter1_36_196_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_36_196_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_196_Closed_Text.style.display='none'; Codehighlighter1_36_196_Open_Image.style.display='inline'; Codehighlighter1_36_196_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_36_196_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_36_196_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">ref</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;RefClass<br><img id=Codehighlighter1_66_193_Open_Image onclick="this.style.display='none'; Codehighlighter1_66_193_Open_Text.style.display='none'; Codehighlighter1_66_193_Closed_Image.style.display='inline'; Codehighlighter1_66_193_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_66_193_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_193_Closed_Text.style.display='none'; Codehighlighter1_66_193_Open_Image.style.display='inline'; Codehighlighter1_66_193_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_66_193_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_66_193_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_89_90_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_90_Open_Text.style.display='none'; Codehighlighter1_89_90_Closed_Image.style.display='inline'; Codehighlighter1_89_90_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_89_90_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_90_Closed_Text.style.display='none'; Codehighlighter1_89_90_Open_Image.style.display='inline'; Codehighlighter1_89_90_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefClass()</span><span id=Codehighlighter1_89_90_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_89_90_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefClass(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_y)&nbsp;:&nbsp;x(_x),&nbsp;y(_y)<br><img id=Codehighlighter1_136_140_Open_Image onclick="this.style.display='none'; Codehighlighter1_136_140_Open_Text.style.display='none'; Codehighlighter1_136_140_Closed_Image.style.display='inline'; Codehighlighter1_136_140_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_136_140_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_136_140_Closed_Text.style.display='none'; Codehighlighter1_136_140_Open_Image.style.display='inline'; Codehighlighter1_136_140_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_136_140_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_136_140_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;PrintSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refclass.cpp文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">refclass.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RefClass::PrintSelf()<br><img id=Codehighlighter1_122_270_Open_Image onclick="this.style.display='none'; Codehighlighter1_122_270_Open_Text.style.display='none'; Codehighlighter1_122_270_Closed_Image.style.display='inline'; Codehighlighter1_122_270_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_122_270_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_122_270_Closed_Text.style.display='none'; Codehighlighter1_122_270_Open_Image.style.display='inline'; Codehighlighter1_122_270_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_122_270_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_122_270_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System::Console::WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello,&nbsp;i&nbsp;am&nbsp;a&nbsp;ref&nbsp;cpp&nbsp;class</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System::Console::WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x&nbsp;is&nbsp;{0}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,x);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System::Console::WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">y&nbsp;is&nbsp;{0}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,y);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）能够调用上面第1）步中的CLI/C++的Dll中class的C#的exe。（实现过程：在VS建立C#的console Application，然后reference 前面的1)生成的Dll）代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Program.cs文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Text;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;CsharpTest<br><img id=Codehighlighter1_89_286_Open_Image onclick="this.style.display='none'; Codehighlighter1_89_286_Open_Text.style.display='none'; Codehighlighter1_89_286_Closed_Image.style.display='inline'; Codehighlighter1_89_286_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_89_286_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_286_Closed_Text.style.display='none'; Codehighlighter1_89_286_Open_Image.style.display='inline'; Codehighlighter1_89_286_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_89_286_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_89_286_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Program<br><img id=Codehighlighter1_113_284_Open_Image onclick="this.style.display='none'; Codehighlighter1_113_284_Open_Text.style.display='none'; Codehighlighter1_113_284_Closed_Image.style.display='inline'; Codehighlighter1_113_284_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_113_284_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_113_284_Closed_Text.style.display='none'; Codehighlighter1_113_284_Open_Image.style.display='inline'; Codehighlighter1_113_284_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_113_284_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_113_284_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;args)<br><img id=Codehighlighter1_163_278_Open_Image onclick="this.style.display='none'; Codehighlighter1_163_278_Open_Text.style.display='none'; Codehighlighter1_163_278_Closed_Image.style.display='inline'; Codehighlighter1_163_278_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_163_278_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_278_Closed_Text.style.display='none'; Codehighlighter1_163_278_Open_Image.style.display='inline'; Codehighlighter1_163_278_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_163_278_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_163_278_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClrCppDll.RefClass&nbsp;refClass&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ClrCppDll.RefClass(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refClass.PrintSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><span style="BACKGROUND-COLOR: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面2步的代码下载</span>：<a href="http://www.cppblog.com/Files/mzty/CSharpCPPCLI1.rar">http://www.cppblog.com/Files/mzty/CSharpCPPCLI1.rar</a>&nbsp;（实现CLI/C++的dll能够被C#调用）<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp; 3）对1）实现的CLI/C++的Dll中增加能够被Native C++调用的NativeClass。代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NativeClass.h文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#pragma&nbsp;once<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll<br><img id=Codehighlighter1_34_207_Open_Image onclick="this.style.display='none'; Codehighlighter1_34_207_Open_Text.style.display='none'; Codehighlighter1_34_207_Closed_Image.style.display='inline'; Codehighlighter1_34_207_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_34_207_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_34_207_Closed_Text.style.display='none'; Codehighlighter1_34_207_Open_Image.style.display='inline'; Codehighlighter1_34_207_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_34_207_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_34_207_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;NativeClass<br><img id=Codehighlighter1_63_204_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_204_Open_Text.style.display='none'; Codehighlighter1_63_204_Closed_Image.style.display='inline'; Codehighlighter1_63_204_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_63_204_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_204_Closed_Text.style.display='none'; Codehighlighter1_63_204_Open_Image.style.display='inline'; Codehighlighter1_63_204_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_63_204_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_63_204_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_93_94_Open_Image onclick="this.style.display='none'; Codehighlighter1_93_94_Open_Text.style.display='none'; Codehighlighter1_93_94_Closed_Image.style.display='inline'; Codehighlighter1_93_94_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_93_94_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_94_Closed_Text.style.display='none'; Codehighlighter1_93_94_Open_Image.style.display='inline'; Codehighlighter1_93_94_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NativeClass()</span><span id=Codehighlighter1_93_94_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_93_94_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NativeClass(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_y)&nbsp;:&nbsp;x(_x),&nbsp;y(_y)<br><img id=Codehighlighter1_145_146_Open_Image onclick="this.style.display='none'; Codehighlighter1_145_146_Open_Text.style.display='none'; Codehighlighter1_145_146_Closed_Image.style.display='inline'; Codehighlighter1_145_146_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_145_146_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_145_146_Closed_Text.style.display='none'; Codehighlighter1_145_146_Open_Image.style.display='inline'; Codehighlighter1_145_146_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_145_146_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_145_146_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;printSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NativeClass.cpp文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">nativeclass.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;NativeClass::printSelf()<br><img id=Codehighlighter1_124_257_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_257_Open_Text.style.display='none'; Codehighlighter1_124_257_Closed_Image.style.display='inline'; Codehighlighter1_124_257_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_124_257_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_124_257_Closed_Text.style.display='none'; Codehighlighter1_124_257_Open_Image.style.display='inline'; Codehighlighter1_124_257_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_124_257_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_124_257_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello,i&nbsp;am&nbsp;a&nbsp;native&nbsp;cpp&nbsp;class!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x&nbsp;is&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">y&nbsp;is&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #ff0000">问题：</span> <span style="COLOR: red">如果我们直接在NativeC++的exe调用上面CLI/C++中的NativeClass，会有问题，Error&nbsp;1&nbsp;error C3381: 'CppClrDll::NativeClass' : assembly access specifiers are only available in code compiled with a /clr option&nbsp;d:\cppandcsharpinteractivetest\csharpcppcli\clrcppdll\nativeclass.h&nbsp;8，这是为什么那，我们想想我们一般的Native C++的DLL的调用，都要将要被调用的Class或funtion导出才可以调用，想到这里我们也对我们的NativeClass进行导出。（怎么导出可以看下面的代码）但是当增加了对NativeClass的导出，调用的时候仍然有上面的error，Error&nbsp;1&nbsp;error C3381: 'CppClrDll::NativeClass' : assembly access specifiers are only available in code compiled with a /clr option&nbsp;d:\cppandcsharpinteractivetest\csharpcppcli\clrcppdll\nativeclass.h&nbsp;9，最后只有查找资料（没有找到）问别人（没有问到），最后想到使用导出函数试试，一试果然可行啊，哈哈哈，so Happy</span>！<span style="COLOR: #00ccff">其实后来发现是我加的导出__declspec(dllexport)的位置不对，应该是在class关键字后面，总之导出类也是可以的。</span>导出类的代码可以下载新的sample，增加导出和导出的函数代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (导出不久需要下面的2文件，还的定义宏 CLR_CPP_DLL在编译选项中，或直接写在文件中)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clrcppdll.h<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;ClrCppDll.h</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#pragma&nbsp;once<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#ifdef&nbsp;CLR_CPP_DLL<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DLLIMPEXP&nbsp;__declspec(dllexport)</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#else</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DLLIMPEXP</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ClrCppDll&nbsp;<br><img id=Codehighlighter1_142_190_Open_Image onclick="this.style.display='none'; Codehighlighter1_142_190_Open_Text.style.display='none'; Codehighlighter1_142_190_Closed_Image.style.display='inline'; Codehighlighter1_142_190_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_142_190_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_142_190_Closed_Text.style.display='none'; Codehighlighter1_142_190_Open_Image.style.display='inline'; Codehighlighter1_142_190_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_142_190_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_142_190_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DLLIMPEXP&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;CallNativeClassPrintSelf();&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clrcppdll.cpp文件：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;This&nbsp;is&nbsp;the&nbsp;main&nbsp;DLL&nbsp;file.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">NativeClass.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ClrCppDll.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>DLLIMPEXP&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;ClrCppDll::CallNativeClassPrintSelf()<br><img id=Codehighlighter1_154_212_Open_Image onclick="this.style.display='none'; Codehighlighter1_154_212_Open_Text.style.display='none'; Codehighlighter1_154_212_Closed_Image.style.display='inline'; Codehighlighter1_154_212_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_154_212_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_212_Closed_Text.style.display='none'; Codehighlighter1_154_212_Open_Image.style.display='inline'; Codehighlighter1_154_212_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_154_212_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_154_212_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ClrCppDll::NativeClass&nbsp;test(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;test.printSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4）建立一个NativeC++的exe来调用1）生成的CLI/C++的Dll中的3）增加的NativeClass（实现过程：建立一个Native C++的console application）代码如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpptest.cpp文件：（经过上一步问题的反复折磨，终于搞定）（同时别忘了要在编译选项中指定lib和lib的路径）<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;CppTest.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">../ClrCppDll/clrcppdll.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_168_280_Open_Image onclick="this.style.display='none'; Codehighlighter1_168_280_Open_Text.style.display='none'; Codehighlighter1_168_280_Closed_Image.style.display='inline'; Codehighlighter1_168_280_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_168_280_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_168_280_Closed_Text.style.display='none'; Codehighlighter1_168_280_Open_Image.style.display='inline'; Codehighlighter1_168_280_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_168_280_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_168_280_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_171_226_Open_Image onclick="this.style.display='none'; Codehighlighter1_171_226_Open_Text.style.display='none'; Codehighlighter1_171_226_Closed_Image.style.display='inline'; Codehighlighter1_171_226_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_171_226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_226_Closed_Text.style.display='none'; Codehighlighter1_171_226_Open_Image.style.display='inline'; Codehighlighter1_171_226_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_171_226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_171_226_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">ClrCppDll::NativeClass&nbsp;test(5,6);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;test.PrintSelf();</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ClrCppDll::CallNativeClassPrintSelf();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><br>&nbsp;&nbsp;&nbsp;上面四步总代码下载：<a href="http://www.cppblog.com/Files/mzty/CSharpCPPCLI2.rar">http://www.cppblog.com/Files/mzty/CSharpCPPCLI2.rar</a>&nbsp;（实现CLI/C++的dll同时被Native C++和C#的调用）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5）扩展，增加在NativeClass中调用RefClass的funtion, 和RefClass中调用NativeClass的function。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代码下载：<a href="http://www.cppblog.com/Files/mzty/CSharpCPPCLI3.rar">http://www.cppblog.com/Files/mzty/CSharpCPPCLI3.rar</a>&nbsp;（最后代码下载，包含NativeClass与RefClass的互调）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.cppblog.com/Files/mzty/CSharpCPPCLI32.zip">http://www.cppblog.com/Files/mzty/CSharpCPPCLI32.zip</a>&nbsp;（包含native class的导出也调用）<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三 总结<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1) CLI/C++中如果想导出让NativeC++使用，则最好导出函数,也可以导出类。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) CLI/C++的DLL可以没有像一般的NativeC++的Dll中的DllMain（）函数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3) CLI/C++如果想导出让C#使用，则一般是ref class。<br><br><br><br><br><br><br><br><img src ="http://www.cppblog.com/mzty/aggbug/39165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-20 22:47 <a href="http://www.cppblog.com/mzty/archive/2007/12/20/39165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CppBlog备份工具开发（开源）</title><link>http://www.cppblog.com/mzty/archive/2007/12/12/38355.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 12 Dec 2007 14:17:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/12/38355.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/38355.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/12/38355.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/38355.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/38355.html</trackback:ping><description><![CDATA[<p><br>一 背景<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;长久以来一直想把自己的blog备份到本地，可是找来找去找不到非常合适的备份工具，所以只有自己动手写一个。考虑到需求主要是对html的解析，还要快速开发，所以选择C#来个简单的原型先，不过据我研究Python提供了很多这方面的功能，所以可能后来也会用Python开发一个更通用的版本。<br><br>二 需求<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）根据用户名和BSP的域名，得到blog下所有文章的地址。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）对所有的地址下载Html保存到本地。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）对html中使用到的图片的保存。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）对CSS，JS其他文件的下载。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5）分类。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6）最好可以做成CHM格式。<br><br>三 C# 版本<br><br>第一版本：<a href="http://www.cppblog.com/Files/mzty/BlogBackUpForMyCppblog2.rar">http://www.cppblog.com/Files/mzty/BlogBackUpForMyCppblog2.rar</a><br><br>四 Python版本<br></p>
欢迎大家提供相关的需求和相关的技术，使备份工具早日实现，供大家使用！有兴趣的也可以加入哦！<img src ="http://www.cppblog.com/mzty/aggbug/38355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-12 22:17 <a href="http://www.cppblog.com/mzty/archive/2007/12/12/38355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏引擎基础（十一）（最后的章节）</title><link>http://www.cppblog.com/mzty/archive/2007/12/04/37781.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 04 Dec 2007 05:31:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2007/12/04/37781.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/37781.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2007/12/04/37781.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/37781.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/37781.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第11部份: 最后的章节前端　　你已经看到了菜单系统，你可能理解游戏内的头顶显示（HUDs）时常是游戏经历中被忽视和诽谤的部分。最近，这个领域开始被给人印象非常深刻的Black and White所关注，这款游戏实际上没有HUD。在Peter Molyneux经历了Dungeon Keeper以后，它在屏幕上大量的图标，他决定游戏的大部分被这些图标占用了，主要的屏幕没有被足够利用。因此他决定废除所...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2007/12/04/37781.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/37781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2007-12-04 13:31 <a href="http://www.cppblog.com/mzty/archive/2007/12/04/37781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>