﻿<?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++博客-life02-随笔分类-c++学习</title><link>http://www.cppblog.com/life02/category/11784.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Jun 2011 05:27:31 GMT</lastBuildDate><pubDate>Thu, 30 Jun 2011 05:27:31 GMT</pubDate><ttl>60</ttl><item><title>Ubuntu 中学习 C/C++ 编程基础入门教程</title><link>http://www.cppblog.com/life02/archive/2011/06/29/149736.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Wed, 29 Jun 2011 08:05:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2011/06/29/149736.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/149736.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2011/06/29/149736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/149736.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/149736.html</trackback:ping><description><![CDATA[<a href="http://forum.ubuntu.org.cn/viewtopic.php?f=70&amp;t=184787">http://forum.ubuntu.org.cn/viewtopic.php?f=70&amp;t=184787</a><img src ="http://www.cppblog.com/life02/aggbug/149736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2011-06-29 16:05 <a href="http://www.cppblog.com/life02/archive/2011/06/29/149736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程经典好书（转）</title><link>http://www.cppblog.com/life02/archive/2009/10/09/98181.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Fri, 09 Oct 2009 10:47:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2009/10/09/98181.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/98181.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2009/10/09/98181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/98181.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/98181.html</trackback:ping><description><![CDATA[<p>1、Java </p>
<p>Java编程语言（第三版)---Java四大名著----James Gosling(Java之父) </p>
<p>Java编程思想（第2版)----Java四大名著----Bruce Eckel </p>
<p>Java编程思想（第3版)----Java四大名著----------------Bruce Eckel </p>
<p>JAVA 2核心技术 卷I：基础知识（原书第7版）---Java四大名著-----Cay Horstmann </p>
<p>JAVA 2核心技术 卷II：高级特性（原书第7版)----Java四大名著-----Cay Horstmann </p>
<p>Effective Java中文版------Java四大名著--------Joshua Bloch </p>
<p>精通Struts:基于MVC的Java Web设计与开发---孙卫琴 </p>
<p>精通Hibernate：Java对象持久化技术详解---孙卫琴 </p>
<p>Tomcat与Java Web开发技术详解------------孙卫琴 </p>
<p>Java与模式------------------------------阎宏 </p>
<p><br>2、c# </p>
<p>C#程序设计-------Charles Petzold&#8220;windows编程泰山北斗&#8221;---C#语言&#8220;倚天屠龙双剑&#8221; </p>
<p>C# Primer中文版--------Stanley B.Lippman---C#语言&#8220;倚天屠龙双剑&#8221; </p>
<p>.NET框架程序设计（修订版)--------Jeffrey Richter&#8220;windows编程泰山北斗&#8221;---.NET平台四大天王 </p>
<p>c#Windows程序设计----------Charles Petzold&#8220;windows编程泰山北斗&#8221;------.NET平台四大天王 </p>
<p>.NET程序设计技术内幕-------------Jeff Prosise---.NET平台四大天王 </p>
<p>.NET本质论--第1卷：公共语言运行库(中文版)--------Chris Sells---.NET平台四大天王 </p>
<p>&nbsp;</p>
<p>3、C++ </p>
<p>C++程序设计语言（特别版)---c++八大金刚----Bjarne Stroustrup&#8220;C++之父&#8221; </p>
<p>C++ Primer (第3版)中文版----c++八大金刚---Stanley B.Lippman </p>
<p>C++ Primer (第4版)中文版----c++八大金刚---Stanley B.Lippman </p>
<p>C++标准程序库—自修教程与参考手册--c++八大金刚--Nicolai M.Josuttis </p>
<p>C++语言的设计和演化-----c++八大金刚----Bjarne Stroustrup&#8220;C++之父&#8221; </p>
<p>深度探索C++对象模型---c++八大金刚----Stanley B.Lippman </p>
<p>Essential C++中文版---c++八大金刚---Stanley B.Lippman </p>
<p>Effective C++中文版 2nd Edition-----c++八大金刚------Scott Meyers </p>
<p>More Effective C++中文版----c++八大金刚------Scott Meyers </p>
<p>C++编程思想（第2版） 第1卷：标准C++导引--------Bruce Eckel </p>
<p>C++编程思想（第2版）第2卷：实用编程技术 --------Bruce Eckel </p>
<p>C++程序设计--------------------------谭浩强 </p>
<p>C++ 程序设计教程(第2版)--------------钱能 </p>
<p>C++ Primer Plus(第五版)中文版---Stephen Prata </p>
<p>广博如四库全书The c++ programming language、c++ Primer <br>深奥如山重水复Inside the c++ object model <br>程序库大全The c++ standard libray <br>工程经验之积累Effective c++、More Effective c++、Exceptional c++ </p>
<p>&nbsp;</p>
<p>c++八大金刚： <br>1、Essentital c++---lippman---C++之父，旁枝暂略，主攻核心，轻薄短小，初学者 </p>
<p>2、The c++ programming language----C++之父，技术权威，用词深峻，思想深远，c++百科全书代表</p>
<p>3、c++ Primer----lippman---纵横书市十数年，c++最佳教本，c++百科全书代表。 <br>4、Inside the c++ object model-----lippman----揭示c++底层，非常好，非常难。 <br>5、Effective c++-----通过50个编程实例，展示专家经验，行文有趣，深处浅出。 <br>6、More Effective c++－－－－通过35个编程实例，展示专家经验，行文有趣，深处浅出。 <br>7、The c++ standard libray－－－c++标准库的百科全书。 <br>8、设计模式：可复用面向对象软件的基础</p>
<p><br>4、c </p>
<p>C程序设计语言（第2版&#183;新版）---C语言&#8220;倚天屠龙双剑&#8221;---Brian W.Kernighan&#8220;C语言之父&#8221; </p>
<p>C Primer Plus中文版（第五版）--------C语言&#8220;倚天屠龙双剑&#8221;---Stephen Prata </p>
<p>C程序设计（第三版）---------------------------谭浩强 </p>
<p>C语言大全（第四版）---------------------------HERBERT SCHILDT </p>
<p>C语言接口与实现：创建可重用软件的技术-------------DAVID R.HANSON&nbsp;&nbsp; </p>
<p>C语言参考手册(原书第5版)--------------------------Samuel P.Harbison </p>
<p>C程序设计教程---------------------------------H.M.Deitel/P.J.Deitel </p>
<p>C陷阱与缺陷-----------------------------------Andrew Koenig&nbsp;&nbsp; </p>
<p><br>5、VB </p>
<p>Visual Basic .NET技术内幕-----VB编程三剑客-----------Francesco Balena&#8220;vb首席大师&#8221; </p>
<p>Windows程序设计-Visual Basic.NET语言描述--VB编程三剑客-----Charles Petzold&#8220;windows编程泰山 </p>
<p>北斗&#8221;--- </p>
<p>.NET框架程序设计：Visual Basic.NET语言描述--VB编程三剑客--Jeffrey Richter&#8220;windows编程泰山北 </p>
<p>斗&#8221;---，Francesco Balena&#8220;vb首席大师&#8221;&nbsp;&nbsp; </p>
<p>Visual Basic 6编程技术大全------------------------Francesco Balena&#8220;vb首席大师&#8221; </p>
<p>Visual Basic.NET 从入门到精通-------------------------Petroutsos,E. </p>
<p>高级VISUAL BASIC编程-----------------------------------MATTHEW CURLAND&nbsp;&nbsp; </p>
<p><br>6、Delphi </p>
<p>Inside VCL(深入核心——VCL架构剖析)----------李维 </p>
<p>Delphi 7高效数据库程序设计--------------李维 </p>
<p>面向对象开发实践之路（Delphi版）----------李维 </p>
<p><br>7、VC </p>
<p>Windows 程序设计（第5版）-----Charles Petzold&#8220;windows编程泰山北斗&#8221;--- </p>
<p>Windows核心编程----------Jeffrey Richter&#8220;windows编程泰山北斗&#8221;--- </p>
<p>Windows高级编程指南---------Jeffrey Richter&#8220;windows编程泰山北斗&#8221;--- </p>
<p>深入浅出MFC（第二版）-----&#8220;MFC四大天王&#8221;-------侯捷 </p>
<p>MFC Windows程序设计（第2版)---MFC四大天王&#8221;---------Jeff Prosise </p>
<p>Visual C++ 技术内幕（第4版)--MFC四大天王&#8221;--------David Kruglinski </p>
<p>深入解析MFC-------------MFC四大天王&#8221;-----------George Shepherd </p>
<p>Visual C++.NET 技术内幕（第6版)-MFC四大天王&#8221;------------David Kruglinski </p>
<p><br>8、vf </p>
<p>Visual Foxpro程序设计参考手册-------------------张洪举 </p>
<p>专家门诊——Visual FoxPro开发答疑160问-------------------张洪举 </p>
<p>Visual FoxPro 6.0/9.0解决方案与范例大全-------------------张洪举 </p>
<p>Visual FoxPro软件开发模式与应用案例-------------------张洪举 </p>
<p>&nbsp;</p>
<p>9、黑客 </p>
<p>应用密码学(协议算法与C源程序-----------Bruce Schneier </p>
<p>网络信息安全的真相-----------Bruce Schneier </p>
<p>黑客大曝光：网络安全机密与解决方案（第5版）--------STUART MCCLURE </p>
<p>软件加密技术内幕------------看雪学院 </p>
<p>加密与解密——软件保护技术与完全解决方案------------看雪学院 </p>
<p>加密与解密（第二版）--------段钢 </p>
<p><br>10、汇编 </p>
<p>Intel微处理器结构、编程与接口（第六版）---------Barry B. Brey </p>
<p>80*86、奔腾机汇编语言程序设计---------Barry B. Brey </p>
<p>Windows环境下32位汇编语言程序设计（第2版)-----------罗云彬 </p>
<p>IBM-PC汇编语言程序设计（第2版） 本书是国内优秀教材--------沈美明 温冬婵 </p>
<p>IBM PC汇编语言程序设计（第五版） 这本书籍是国外优秀教材-------PETER ABEL著,沈美明 温冬蝉译 </p>
<p><br>11、驱动开发 </p>
<p>Windows WDM设备驱动程序开发指南------------------------------------ Chris Cant </p>
<p>Windows 2000/XP WDM设备驱动程序开发(第2版)--------------------------武安河 </p>
<p>WINDOWS 2000/XP WDM设备驱动程序开发-------------------------------- 武安河 </p>
<p><br>12、网络 </p>
<p>计算机网络第四版中文版----网络编程三剑客--------------Andrew S.Tanenbaum </p>
<p><br>TCP/IP详解3卷本--------------------Richard Stevens----网络编程三剑客 </p>
<p>UNIX网络编程2卷本--------------------Richard Stevens----网络编程三剑客 </p>
<p>用TCP/IP进行网际互联-----------Douglas E. Comer </p>
<p>高级TCP/IP编程-------------------Jon C. Snader </p>
<p>C++网络编程-----------------------Douglas Schmidt </p>
<p>UNIX环境高级编程（第2版)--------------------Richard Stevens </p>
<p>&nbsp;</p>
<p>13、算法 </p>
<p>计算机程序设计艺术-------Donald.E.Knuth----------算法&#8220;倚天屠龙&#8221;双剑 </p>
<p>算法导论-----------------Thomas H. Cormen--------算法&#8220;倚天屠龙&#8221;双剑 </p>
<p>离散数学及其应用----------Kenneth H.Rosen </p>
<p>具体数学—计算机科学基础--------Donald.E.Knuth </p>
<p>&nbsp;</p>
<p>14、图形编程 <br>Windows 图形编程----------------FENG YUAN --图形编程界的Charles Petzold之书 </p>
<p><br>15、数据结构 </p>
<p>数据结构 C++语言描述》58.00(Data Structures C++) William Ford,William Topp 刘卫东 沈官林 </p>
<p>数据结构算法与应用-C++语言描述》49.00Sartej Sahni 汪诗林 孙晓东等机械工业出版社 </p>
<p>&nbsp;</p>
<p>16、软件工程 </p>
<p>设计模式--可复用面向对象软件的基础 </p>
<p>重构—改善既有代码的设计 </p>
<p>&nbsp;</p>
<p>17、操作系统 </p>
<p>深入理解计算机系统（修订版）-------RANDAL E.BRYANT </p>
<p>&nbsp;</p>
<p>18、Unix </p>
<p><br>UNIX 网络编程 卷I 套接字联网API（英文版 第三版 <br>UNIX 编程艺术 <br>UNIX环境高级编程（英文影印第2版-----UNIX编程&#8220;圣经 <br>UNIX环境高级编程（英文影印版）（第2版） <br>99-UNIX环境高级编程（第2版） <br>UNIX环境高级编程（第2版)---UNIX编程&#8220;圣经 <br>UNIX网络编程 第1卷：套接口API（第3版） <br>UNIX网络编程卷2：进程间通信（第2版）（英文影印版） <br>UNIX 网络编程（第二版）第2卷：进程间通信 <br>UNIX编程环境 <br>UNIX 网络编程 卷I 套接字联网API（英文版 第三版 <br>UNIX系统编程 <br>UNIX环境高级编程 <br>UNIX环境高级编程（英文影印版 <br>88-LINUX内核分析及编程 <br>UNIX 网络编程 卷I 套接字联网API（英文版 第三版） <br>UNIX网络编程 第1卷：套接口API（第3版） <br>UNIX 网络编程（第二版）第2卷：进程间通信 <br>UNIX网络编程卷2：进程间通信（第2版）（英文影印版） <br>UNIX 网络编程（第2版）第1卷：套接口API和X/Open 传输接口API <br>UNIX网络编程（卷1）：连网的APLS：套接字与XTI（第二版)（英文影印版） <br>UNIX环境高级编程 <br>UNIX 环境高级编程（英文版） <br>UNIX环境高级编程（第2版） <br>Unix技术手册 </p>
<p>&nbsp;</p>
<p>19、Linux </p>
<p><br>Linux内核设计与实现 <br>Linux内核完全注释 <br>LINUX内核分析及编程 <br>GNU/Linux 编程指南（第二版） <br>Linux设备驱动程序（第三版） <br>嵌入式设计及Linux驱动开发指南——基于ARM 9处理器 <br>Linux设备驱动程序 第三版（英文影印版） <br>Linux内核设计与实现（第2版） <br>Linux内核设计与实现（英文影印版）（第2版） <br>linux技术手册 </p>
<p><br>20、游戏编程 </p>
<p>Windows游戏编程大师技巧（第二版 <br>游戏之旅--我的编程感悟 <br>OpenGL超级宝典：第三版 <br>OpenGL编程指南（第四版） <br>Java 游戏高级编程 <br>J2ME手机游戏编程入门 <br>游戏之旅——我的编程感悟 <br>游戏开发中的人工智能（英文影印版） <br>3D游戏：卷2 动画与高级实时渲染技术 <br>面向对象的游戏开发 <br>Java 游戏高级编程 <br>3D游戏编程大师技巧 <br>游戏编程精粹 <br>面向对象的游戏开发 <br>3D游戏 卷1：实时渲染与软件技术 <br>3D游戏：卷2 动画与高级实时渲染技&#8230; <br>J2ME手机游戏编程入门 <br>Direct3D游戏编程入门教程（第二版&#8230; </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>21、移动开发 </p>
<p>Windows Mobile手机应用开发 <br>SYMBIAN OS C++手机应用开发 <br>68-Windows Mobile手机应用开发--傅曦 齐宇 徐骏 <br>48-SYMBIAN OS C++手机应用开发 （第2卷）------------------RICHARD HARRISON著,周良忠 王伯欣译 <br>68-SYMBIAN OS C++手机应用开发---------------RICHARD HARRISON著,周良忠译&nbsp;&nbsp; <br>Windows CE.net内核定制及应用程序开发---------周毓林 宁杨 陆贵强 付林林 <br>嵌入式系统Windows CE 开发技巧与实例--傅曦 <br>Palm OS编程实践---绝版 </p>
<p>&nbsp;</p>
<p>22、单片机 </p>
<p>单片机轻松入门----------------------------------周坚(平凡老师)&nbsp;&nbsp; </p>
<p>单片机典型模块设计实例导航-----------------------求是科技 </p>
<p>例说8051----------------------------------------张义和 陈敌北 </p>
<p>KEIL CX51 V7.0单片机高级语言编程与&#924;VISION2应用实践-----徐爱钧&nbsp;&nbsp; </p>
<p>单片机应用程序设计技术(修订版)--------------------周航慈 </p>
<p>8051单片机实践与应用-------------------------------吴金戎 </p>
<p>MCS-51系列单片机实用接口技术---------------------李华 <br><br>23、串并口通讯 </p>
<p>Visual C++/Turbo C串口通信编程实践------------------龚建伟 </p>
<p>VISUAL BASIC与RS-232串行通信控制（最新版）----------范逸之 </p>
<p>&nbsp;</p>
<p>24、电子 </p>
<p>无线电识图与电路故障分析轻松入门(第二版) -------------------胡斌 </p>
<p>无线电元器件检测与修理技术轻松入门（第二版） -------------------胡斌 </p>
<p>图表细说电子技术识图-------------------胡斌 </p>
<p>图表细说电子元器件-------------------胡斌 </p>
<p>图表细说元器件及实用电路-------------------胡斌 </p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/life02/aggbug/98181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2009-10-09 18:47 <a href="http://www.cppblog.com/life02/archive/2009/10/09/98181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>malloc()和free()（转）</title><link>http://www.cppblog.com/life02/archive/2009/10/09/98147.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Fri, 09 Oct 2009 05:02:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2009/10/09/98147.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/98147.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2009/10/09/98147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/98147.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/98147.html</trackback:ping><description><![CDATA[<p>来自bc-cn C语言论坛</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在C语言的学习中，对内存管理这部分的知识掌握尤其重要！之前对C中的malloc()和free()两个函数的了解甚少，只知道大概该怎么用——就是malloc然后free就一切OK了。当然现在对这两个函数的体会也不见得多，不过对于本文章第三部分的内容倒是有了转折性的认识，所以写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个&#8220;浅谈&#8221;的字眼，也就是这个意思了！希望对大家有一点帮助！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不扯得太远的话（比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等），我感觉这篇文章应该是比较全面地谈了一下malloc()和free().这篇文章由浅入深（不见得有多深）分三个部分介绍主要内容。</p>
<p>废话了那么多，下面立刻进入主题================》》》》》》》》》》》》》》》》》》》》》</p>
<p><br>一、malloc()和free()的基本概念以及基本用法：</p>
<p>1、函数原型及说明：</p>
<p>void *malloc(long NumBytes)：该函数分配了NumBytes个字节，并返回了指向这块内存的指针。如果分配失败，则返回一个空指针（NULL）。</p>
<p>关于分配失败的原因，应该有多种，比如说空间不足就是一种。</p>
<p>void free(void *FirstByte)： 该函数是将之前用malloc分配的空间还给程序或者是操作系统，也就是释放了这块内存，让它重新得到自由。</p>
<p>2、函数的用法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 其实这两个函数用起来倒不是很难，也就是malloc()之后觉得用够了就甩了它把它给free()了，举个简单例子：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Code...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *Ptr = NULL;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ptr = (char *)malloc(100 * sizeof(char));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (NULL == Ptr){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit (1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gets(Ptr);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // code...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(Ptr);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ptr = NULL;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // code...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就是这样！当然，具体情况要具体分析以及具体解决。比如说，你定义了一个指针，在一个函数里申请了一块内存然后通过函数返回传递给这个指针，那么也许释放这块内存这项工作就应该留给其他函数了。</p>
<p>3、关于函数使用需要注意的一些地方：</p>
<p>A、申请了内存空间后，必须检查是否分配成功。</p>
<p>B、当不需要再使用申请的内存时，记得释放；释放后应该把指向这块内存的指针指向NULL，防止程序后面不小心使用了它。</p>
<p>C、这两个函数应该是配对。如果申请后不释放就是内存泄露；如果无故释放那就是什么也没有做。释放只能一次，如果释放两次及两次以上会出现错误（释放空指针例外，释放空指针其实也等于啥也没做，所以释放空指针释放多少次都没有问题）。</p>
<p>D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换，因为这样可以躲过一些编译器的检查。</p>
<p><br>二、malloc()到底从哪里得来了内存空间：</p>
<p>1、malloc()到底从哪里得到了内存空间？答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时，就会遍历该链表，然后就寻找第一个空间大于所申请空间的堆结点，然后就将该结点从空闲结点链表中删除，并将该结点的空间分配给程序。就是这样！</p>
<p>&nbsp;&nbsp; 说到这里，不得不另外插入一个小话题，相信大家也知道是什么话题了。什么是堆？说到堆，又忍不住说到了栈！什么是栈？下面就另外开个小部分专门而又简单地说一下这个题外话：</p>
<p>2、什么是堆：堆是大家共有的空间，分全局堆和局部堆。全局堆就是所有没有分配的空间，局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配，运行过程中也可以向系统要额外的堆，但是记得用完了要还给操作系统，要不然就是内存泄漏。</p>
<p>&nbsp;&nbsp; 什么是栈：栈是线程独有的，保存其运行状态和局部自动变量的。栈在线程开始的时候初始化，每个线程的栈互相独立。每个函数都有自己的栈，栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈，就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。 </p>
<p>&nbsp;&nbsp; 以上的概念描述是标准的描述，不过有个别语句被我删除，不知道因为这样而变得不标准了^_^.</p>
<p>&nbsp;&nbsp; 通过上面对概念的描述，可以知道：</p>
<p>&nbsp;&nbsp; 栈是由编译器自动分配释放，存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。</p>
<p>&nbsp;&nbsp; 堆一般由程序员分配释放，若不释放，程序结束时可能由OS回收。注意这里说是可能，并非一定。所以我想再强调一次，记得要释放！</p>
<p>注意它与数据结构中的堆是两回事，分配方式倒是类似于链表。（这点我上面稍微提过）</p>
<p><br>&nbsp;&nbsp; 所以，举个例子，如果你在函数上面定义了一个指针变量，然后在这个函数里申请了一块内存让指针指向它。实际上，这个指针的地址是在栈上，但是它所指向的内容却是在堆上面的！这一点要注意！所以，再想想，在一个函数里申请了空间后，比如说下面这个函数：</p>
<p>&nbsp;&nbsp; // code...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Function(void)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *p = (char *)malloc(100 * sizeof(char));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就这个例子，千万不要认为函数返回，函数所在的栈被销毁指针也跟着销毁，申请的内存也就一样跟着销毁了！这绝对是错误的！因为申请的内存在堆上，而函数所在的栈被销毁跟堆完全没有啥关系。所以，还是那句话：记得释放！</p>
<p>3、free()到底释放了什么</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个问题比较简单，其实我是想和第二大部分的题目相呼应而已！哈哈！free()释放的是指针指向的内存！注意！释放的是内存，不是指针！这点非常非常重要！指针是一个变量，只有程序结束时才被销毁。释放了内存空间后，原来指向这块空间的指针还是存在！只不过现在指针指向的内容的垃圾，是未定义的，所以说是垃圾。因此，前面我已经说过了，释放内存后把指针指向NULL，防止指针在后面不小心又被解引用了。非常重要啊这一点！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了！这个&#8220;题外话&#8221;终于说完了。就这么简单说一次，知道个大概就可以了！下面就进入第三个部分：</p>
<p>三、malloc()以及free()的机制：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个部分我今天才有了新的认识！而且是转折性的认识！所以，这部分可能会有更多一些认识上的错误！不对的地方请大家帮忙指出！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事实上，仔细看一下free()的函数原型，也许也会发现似乎很神奇，free()函数非常简单，只有一个参数，只要把指向申请空间的指针传递给free()中的参数就可以完成释放工作！这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大多数实现所分配的存储空间比所要求的要稍大一些，额外的空间用来记录管理信息——分配块的长度，指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端，则会改写后一块的管理信息。这种类型的错误是灾难性的，但是因为这种错误不会很快就暴露出来，所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间，另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中，用结构体来记录同一个对象的不同信息是天经地义的事！下面看看这个结构体的原型：</p>
<p>&nbsp;&nbsp; struct mem_control_block {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int is_available;&nbsp;&nbsp;&nbsp; //这是一个标记？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这是实际空间的大小</p>
<p>&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于size,这个是实际空间大小。这里其实我有个疑问，is_available是否是一个标记？因为我看了free()的源代码之后对这个变量感觉有点纳闷（源代码在下面分析）。这里还请大家指出！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以，free()就是根据这个结构体的信息来释放malloc()申请的空间！而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题，malloc()申请空间后返回一个指针应该是指向第二种空间，也就是可用空间！不然，如果指向管理信息空间的话，写入的内容和结构体的类型有可能不一致，或者会把管理信息屏蔽掉，那就没法释放内存空间了，所以会发生错误！（感觉自己这里说的是废话）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了！下面看看free()的源代码，我自己分析了一下，觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问，下面指出！</p>
<p>&nbsp;&nbsp; // code...</p>
<p>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void free(void *ptr) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct mem_control_block *free;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free = ptr - sizeof(struct mem_control_block);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free-&gt;is_available = 1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看一下函数第二句，这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去，让它指向管理信息的那块空间，因为这里是在值上减去了一个结构体的大小！后面那一句free-&gt;is_available = 1;我有点纳闷！我的想法是：这里is_available应该只是一个标记而已！因为从这个变量的名称上来看，is_available 翻译过来就是&#8220;是可以用&#8221;。不要说我土！我觉得变量名字可以反映一个变量的作用，特别是严谨的代码。这是源代码，所以我觉得绝对是严谨的！！这个变量的值是1，表明是可以用的空间！只是这里我想了想，如果把它改为0或者是其他值不知道会发生什么事？！但是有一点我可以肯定，就是释放绝对不会那么顺利进行！因为这是一个标记！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，这里可能还是有人会有疑问，为什么这样就可以释放呢？？我刚才也有这个疑问。后来我想到，释放是操作系统的事，那么就free()这个源代码来看，什么也没有释放，对吧？但是它确实是确定了管理信息的那块内存的内容。所以，free()只是记录了一些信息，然后告诉操作系统那块内存可以去释放，具体怎么告诉操作系统的我不清楚，但我觉得这个已经超出了我这篇文章的讨论范围了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么，我之前有个错误的认识，就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存！但是，这是大错特错！释放是不可以释放一部分的！首先这点应该要明白。而且，从free()的源代码看，ptr只能指向可用空间的首地址，不然，减去结构体大小之后一定不是指向管理信息空间的首地址。所以，要确保指针指向可用空间的首地址！不信吗？自己可以写一个程序然后移动指向可用空间的指针，看程序会有会崩！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后可能想到malloc()的源代码看看malloc()到底是怎么分配空间的，这里面涉及到很多其他方面的知识！有兴趣的朋友可以自己去下载源<br>代码去看看。</p>
<p><br>四、关于其他：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于C中的malloc()和free()的讨论就写到这里吧！写了三个钟头，感觉有点累！希望对大家有所帮助！有不对的地方欢迎大家指出！最后，谢谢参与这个帖子讨论的所有朋友，帖子：<a href="http://www.bc-cn.net/bbs/dispbbs.asp?boardID=5&amp;ID=81781&amp;page=1">http://www.bc-cn.net/bbs/dispbbs.asp?boardID=5&amp;ID=81781&amp;page=1</a>。<br></p>
<img src ="http://www.cppblog.com/life02/aggbug/98147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2009-10-09 13:02 <a href="http://www.cppblog.com/life02/archive/2009/10/09/98147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>malloc/free和new/delete的区别（转）</title><link>http://www.cppblog.com/life02/archive/2009/10/09/98146.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Fri, 09 Oct 2009 05:01:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2009/10/09/98146.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/98146.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2009/10/09/98146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/98146.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/98146.html</trackback:ping><description><![CDATA[<div class=tit>malloc/free和new/delete的区别</div>
<div class=date>2009年08月18日 星期二 11:26</div>
<table style="TABLE-LAYOUT: fixed; WIDTH: 100%">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <div class=cnt>
            <div class=postbody>
            <p>有了malloc/free为什么还要new/delete ？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; malloc与free是C++/C语言的标准库函数，new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。<br><br>对于非内部数据类型的对象而言，光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数，对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符，不在编译器控制权限之内，不能够把执行构造函数和析构函数的任务强加于malloc/free。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new，以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。<br><br>我们先看一看malloc/free和new/delete如何实现对象的动态内存管理，见示例7-8。<br><br><br><br>class Obj<br><br>{<br><br>public :<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Obj(void){ cout &lt;&lt; &#8220;Initialization&#8221; &lt;&lt; endl; }<br><br>~Obj(void){ cout &lt;&lt; &#8220;Destroy&#8221; &lt;&lt; endl; }<br><br>void&nbsp;&nbsp;&nbsp;&nbsp; Initialize(void){ cout &lt;&lt; &#8220;Initialization&#8221; &lt;&lt; endl; }<br><br>void&nbsp;&nbsp;&nbsp;&nbsp; Destroy(void){ cout &lt;&lt; &#8220;Destroy&#8221; &lt;&lt; endl; }<br><br>};<br><br>void UseMallocFree(void)<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp; Obj&nbsp;&nbsp; *a = (obj *)malloc(sizeof(obj));&nbsp;&nbsp;&nbsp; // 申请动态内存<br><br>&nbsp;&nbsp;&nbsp;&nbsp; a-&gt;Initialize();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 初始化<br><br>&nbsp;&nbsp;&nbsp;&nbsp; //&#8230;<br><br>&nbsp;&nbsp;&nbsp;&nbsp; a-&gt;Destroy();&nbsp;&nbsp;&nbsp; // 清除工作<br><br>&nbsp;&nbsp;&nbsp;&nbsp; free(a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 释放内存<br><br>}<br><br>void UseNewDelete(void)<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp; Obj&nbsp;&nbsp; *a = new Obj;&nbsp;&nbsp; // 申请动态内存并且初始化<br><br>&nbsp;&nbsp;&nbsp;&nbsp; //&#8230;<br><br>&nbsp;&nbsp;&nbsp;&nbsp; delete a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 清除并且释放内存<br><br>}<br><br><br>示例7-8 用malloc/free和new/delete如何实现对象的动态内存管理<br><br><br><br>类Obj的函数Initialize模拟了构造函数的功能，函数Destroy模拟了析构函数的功能。函数UseMallocFree中，由于malloc/free不能执行构造函数与析构函数，必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。<br><br>所以我们不要企图用malloc/free来完成动态对象的内存管理，应该用new/delete。由于内部数据类型的&#8220;对象&#8221;没有构造与析构的过程，对它们而言malloc/free和new/delete是等价的。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 既然new/delete的功能完全覆盖了malloc/free，为什么C++不把malloc/free淘汰出局呢？这是因为C++程序经常要调用C函数，而C程序只能用malloc/free管理动态内存。<br><br>如果用free释放&#8220;new创建的动态对象&#8221;，那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放&#8220;malloc申请的动态内存&#8221;，理论上讲程序不会出错，但是该程序的可读性很差。所以new/delete必须配对使用，malloc/free也一样。</p>
            </div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/life02/aggbug/98146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2009-10-09 13:01 <a href="http://www.cppblog.com/life02/archive/2009/10/09/98146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>树</title><link>http://www.cppblog.com/life02/archive/2009/09/21/96889.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Mon, 21 Sep 2009 14:46:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2009/09/21/96889.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/96889.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2009/09/21/96889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/96889.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/96889.html</trackback:ping><description><![CDATA[<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">&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 id=Codehighlighter1_61_114_Open_Image onclick="this.style.display='none'; Codehighlighter1_61_114_Open_Text.style.display='none'; Codehighlighter1_61_114_Closed_Image.style.display='inline'; Codehighlighter1_61_114_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_61_114_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_61_114_Closed_Text.style.display='none'; Codehighlighter1_61_114_Open_Image.style.display='inline'; Codehighlighter1_61_114_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>typedef&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;node</span><span id=Codehighlighter1_61_114_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_61_114_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">int</span><span style="COLOR: #000000">&nbsp;key;<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;data;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">lchild,</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rchild;<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>node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bt</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_163_409_Open_Image onclick="this.style.display='none'; Codehighlighter1_163_409_Open_Text.style.display='none'; Codehighlighter1_163_409_Closed_Image.style.display='inline'; Codehighlighter1_163_409_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_163_409_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_409_Closed_Text.style.display='none'; Codehighlighter1_163_409_Open_Image.style.display='inline'; Codehighlighter1_163_409_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;insertbst(node&nbsp;</span><span style="COLOR: #000000">*&amp;</span><span style="COLOR: #000000">p,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k)</span><span id=Codehighlighter1_163_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_163_409_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">if</span><span style="COLOR: #000000">&nbsp;(p</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img id=Codehighlighter1_180_268_Open_Image onclick="this.style.display='none'; Codehighlighter1_180_268_Open_Text.style.display='none'; Codehighlighter1_180_268_Closed_Image.style.display='inline'; Codehighlighter1_180_268_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_180_268_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_180_268_Closed_Text.style.display='none'; Codehighlighter1_180_268_Open_Image.style.display='inline'; Codehighlighter1_180_268_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_180_268_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_268_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;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(node));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">k;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lchild</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">rchild</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<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">1</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">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(k</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">key)<br><img id=Codehighlighter1_292_307_Open_Image onclick="this.style.display='none'; Codehighlighter1_292_307_Open_Text.style.display='none'; Codehighlighter1_292_307_Closed_Image.style.display='inline'; Codehighlighter1_292_307_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_292_307_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_292_307_Closed_Text.style.display='none'; Codehighlighter1_292_307_Open_Image.style.display='inline'; Codehighlighter1_292_307_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_292_307_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_292_307_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">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/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(k</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">key)<br><img id=Codehighlighter1_328_364_Open_Image onclick="this.style.display='none'; Codehighlighter1_328_364_Open_Text.style.display='none'; Codehighlighter1_328_364_Closed_Image.style.display='inline'; Codehighlighter1_328_364_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_328_364_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_328_364_Closed_Text.style.display='none'; Codehighlighter1_328_364_Open_Image.style.display='inline'; Codehighlighter1_328_364_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_328_364_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_328_364_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">return</span><span style="COLOR: #000000">&nbsp;insertbst(p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lchild,k);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_371_407_Open_Image onclick="this.style.display='none'; Codehighlighter1_371_407_Open_Text.style.display='none'; Codehighlighter1_371_407_Closed_Image.style.display='inline'; Codehighlighter1_371_407_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_371_407_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_371_407_Closed_Text.style.display='none'; Codehighlighter1_371_407_Open_Image.style.display='inline'; Codehighlighter1_371_407_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_371_407_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_371_407_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">return</span><span style="COLOR: #000000">&nbsp;insertbst(p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">rchild,k);<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><br><img id=Codehighlighter1_440_511_Open_Image onclick="this.style.display='none'; Codehighlighter1_440_511_Open_Text.style.display='none'; Codehighlighter1_440_511_Closed_Image.style.display='inline'; Codehighlighter1_440_511_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_440_511_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_440_511_Closed_Text.style.display='none'; Codehighlighter1_440_511_Open_Image.style.display='inline'; Codehighlighter1_440_511_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;creatbst(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;a,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)</span><span id=Codehighlighter1_440_511_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_440_511_Open_Text><span style="COLOR: #000000">{<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">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_465_497_Open_Image onclick="this.style.display='none'; Codehighlighter1_465_497_Open_Text.style.display='none'; Codehighlighter1_465_497_Closed_Image.style.display='inline'; Codehighlighter1_465_497_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_465_497_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_465_497_Closed_Text.style.display='none'; Codehighlighter1_465_497_Open_Image.style.display='inline'; Codehighlighter1_465_497_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">while</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">n)</span><span id=Codehighlighter1_465_497_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_465_497_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;insertbst(bt,a[i]);<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: #000000">++</span><span style="COLOR: #000000">i;<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">return</span><span style="COLOR: #000000">&nbsp;bt;<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 id=Codehighlighter1_537_632_Open_Image onclick="this.style.display='none'; Codehighlighter1_537_632_Open_Text.style.display='none'; Codehighlighter1_537_632_Closed_Image.style.display='inline'; Codehighlighter1_537_632_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_537_632_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_537_632_Closed_Text.style.display='none'; Codehighlighter1_537_632_Open_Image.style.display='inline'; Codehighlighter1_537_632_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;preorder(node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bt)</span><span id=Codehighlighter1_537_632_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_537_632_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">if</span><span style="COLOR: #000000">&nbsp;(bt</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br><img id=Codehighlighter1_555_630_Open_Image onclick="this.style.display='none'; Codehighlighter1_555_630_Open_Text.style.display='none'; Codehighlighter1_555_630_Closed_Image.style.display='inline'; Codehighlighter1_555_630_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_555_630_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_555_630_Closed_Text.style.display='none'; Codehighlighter1_555_630_Open_Image.style.display='inline'; Codehighlighter1_555_630_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_555_630_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_555_630_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;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">bt</span><span style="COLOR: #000000">-&gt;key</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preorder(bt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lchild);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preorder(bt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">rchild);<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><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 id=Codehighlighter1_647_745_Open_Image onclick="this.style.display='none'; Codehighlighter1_647_745_Open_Text.style.display='none'; Codehighlighter1_647_745_Closed_Image.style.display='inline'; Codehighlighter1_647_745_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_647_745_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_647_745_Closed_Text.style.display='none'; Codehighlighter1_647_745_Open_Image.style.display='inline'; Codehighlighter1_647_745_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()</span><span id=Codehighlighter1_647_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_647_745_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_662_674_Open_Image onclick="this.style.display='none'; Codehighlighter1_662_674_Open_Text.style.display='none'; Codehighlighter1_662_674_Closed_Image.style.display='inline'; Codehighlighter1_662_674_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_662_674_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_662_674_Closed_Text.style.display='none'; Codehighlighter1_662_674_Open_Image.style.display='inline'; Codehighlighter1_662_674_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">int</span><span style="COLOR: #000000">&nbsp;a[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span id=Codehighlighter1_662_674_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_662_674_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">10</span><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;node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bl</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;node();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">creatbst(a,</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;preorder(bt);<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></div>
<img src ="http://www.cppblog.com/life02/aggbug/96889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2009-09-21 22:46 <a href="http://www.cppblog.com/life02/archive/2009/09/21/96889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>strlen源码剖析（转）</title><link>http://www.cppblog.com/life02/archive/2009/09/21/96884.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Mon, 21 Sep 2009 14:18:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2009/09/21/96884.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/96884.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2009/09/21/96884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/96884.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/96884.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/robinfoxnan/archive/2008/07/25/2712030.aspx">http://blog.csdn.net/robinfoxnan/archive/2008/07/25/2712030.aspx</a><br>1. 简单实现<br>如果不管效率，最简单的实现只需要4行代码：</p>
<p>1 size_t strlen_a(const char * str) {<br>2&nbsp;&nbsp;&nbsp;&nbsp; size_t length = 0 ;<br>3&nbsp;&nbsp;&nbsp;&nbsp; while (*str++ )<br>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++ length;<br>5&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; length;<br>6 } <br>也许可以稍加改进如下：</p>
<p><br>1 size_t strlen_b(const char * str) {<br>2&nbsp;&nbsp;&nbsp;&nbsp; const char *cp =&nbsp; str;<br>3&nbsp;&nbsp;&nbsp;&nbsp; while (*cp++ )<br>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br>5&nbsp;&nbsp;&nbsp;&nbsp; return (cp - str - 1 );<br>6 } </p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/robinfoxnan/archive/2008/07/25/2712030.aspx">http://blog.csdn.net/robinfoxnan/archive/2008/07/25/2712030.aspx</a></p>
<img src ="http://www.cppblog.com/life02/aggbug/96884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2009-09-21 22:18 <a href="http://www.cppblog.com/life02/archive/2009/09/21/96884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类string的构造函数、拷贝构造函数和析构函数</title><link>http://www.cppblog.com/life02/archive/2009/09/14/96085.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Mon, 14 Sep 2009 01:35:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2009/09/14/96085.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/96085.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2009/09/14/96085.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/96085.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/96085.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">String </font></span><span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的原型如下</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">class String<br>{<br>&nbsp;&nbsp; public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(const char *str=NULL);<span style="COLOR: red">&nbsp;//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构造函数</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(const String &amp;other); <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">拷贝构造函数</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~String(void); <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">析构函数</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&amp; operator=(const String &amp;other); <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等号操作符重载</span></p>
<span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font color=#000000><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; </span>ShowString();<o:p></o:p></font></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left></span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">&nbsp;&nbsp; private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *m_data; <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><br></span><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">};</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">String::~String()<br>{<br>&nbsp;&nbsp;&nbsp; delete [] m_data; <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">析构函数，释放地址空间</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">}<br>String::String(const char *str)<br>{<br>&nbsp;&nbsp;&nbsp; if (str==NULL)<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当初始化串不存在的时候，为</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><font face="Times New Roman">m_data</font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">申请一个空间存放</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><font face="Times New Roman">'\0'</font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><br></span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_data=new char[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *m_data='\0';<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当初始化串存在的时候，为</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><font face="Times New Roman">m_data</font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">申请同样大小的空间存放该串；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><br></span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length=strlen(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_data=new char[length+1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(m_data,str);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">String::String(const String &amp;other)<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">拷贝构造函数，功能与构造函数类似。</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">{<br>&nbsp;&nbsp;&nbsp; int length=strlen(other.m_data);<br>&nbsp;&nbsp;&nbsp; m_data=new [length+1];<br>&nbsp;&nbsp;&nbsp; strcpy(m_data,other.m_data);<br>}<br>String&amp; String::operator =(const String &amp;other) <br>{<br>&nbsp;&nbsp;&nbsp; if (this==&amp;other)<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当地址相同时，直接返回；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><br></span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return *this;&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; delete [] m_data;<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当地址不相同时，删除原来申请的空间，重新开始构造；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; int length=sizeof(other.m_data);<br>&nbsp;&nbsp;&nbsp; m_data=new [length+1];<br>&nbsp;&nbsp;&nbsp; strcpy(m_data,other.m_data);</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; return *this;&nbsp;<br>}</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<span lang=EN-US><o:p><font face="Times New Roman">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">String::ShowString()<span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt">//</span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt">m_data</span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是私有成员，对象只能通过</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt">public</span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成员函数来访问；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<o:p></o:p></span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout&lt;&lt;this-&gt;m_data&lt;&lt;endl;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></font></o:p></span><font face="宋体, MS Song">&nbsp;</font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p></o:p></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face="Times New Roman"></font></o:p></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; mso-font-kerning: 0pt"><font face="Times New Roman">main()<br>{<br>String AD;<br>char * p="ABCDE";<br>String B(p);<br>AD.ShowString();<br>AD=B;<br>AD.ShowString();<o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; mso-font-kerning: 0pt"><br><font face="Times New Roman">}<o:p></o:p></font></span></p>
<img src ="http://www.cppblog.com/life02/aggbug/96085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2009-09-14 09:35 <a href="http://www.cppblog.com/life02/archive/2009/09/14/96085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类string的构造函数、拷贝构造函数和析构函数</title><link>http://www.cppblog.com/life02/archive/2009/09/14/96086.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Mon, 14 Sep 2009 01:35:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2009/09/14/96086.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/96086.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2009/09/14/96086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/96086.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/96086.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">String </font></span><span style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的原型如下</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">class String<br>{<br>&nbsp;&nbsp; public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(const char *str=NULL);<span style="COLOR: red">&nbsp;//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构造函数</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(const String &amp;other); <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">拷贝构造函数</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~String(void); <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">析构函数</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&amp; operator=(const String &amp;other); <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等号操作符重载</span></p>
<span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font color=#000000><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; </span>ShowString();<o:p></o:p></font></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left></span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">&nbsp;&nbsp; private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *m_data; <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><br></span><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">};</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">String::~String()<br>{<br>&nbsp;&nbsp;&nbsp; delete [] m_data; <span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">析构函数，释放地址空间</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">}<br>String::String(const char *str)<br>{<br>&nbsp;&nbsp;&nbsp; if (str==NULL)<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当初始化串不存在的时候，为</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><font face="Times New Roman">m_data</font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">申请一个空间存放</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><font face="Times New Roman">'\0'</font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><br></span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_data=new char[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *m_data='\0';<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当初始化串存在的时候，为</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><font face="Times New Roman">m_data</font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">申请同样大小的空间存放该串；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><br></span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length=strlen(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_data=new char[length+1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(m_data,str);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">String::String(const String &amp;other)<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">拷贝构造函数，功能与构造函数类似。</span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><br><font face="Times New Roman">{<br>&nbsp;&nbsp;&nbsp; int length=strlen(other.m_data);<br>&nbsp;&nbsp;&nbsp; m_data=new [length+1];<br>&nbsp;&nbsp;&nbsp; strcpy(m_data,other.m_data);<br>}<br>String&amp; String::operator =(const String &amp;other) <br>{<br>&nbsp;&nbsp;&nbsp; if (this==&amp;other)<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当地址相同时，直接返回；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><br></span><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return *this;&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; delete [] m_data;<span style="COLOR: red">//</span></font></span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当地址不相同时，删除原来申请的空间，重新开始构造；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; int length=sizeof(other.m_data);<br>&nbsp;&nbsp;&nbsp; m_data=new [length+1];<br>&nbsp;&nbsp;&nbsp; strcpy(m_data,other.m_data);</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; return *this;&nbsp;<br>}</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<span lang=EN-US><o:p><font face="Times New Roman">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">String::ShowString()<span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt">//</span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt">m_data</span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是私有成员，对象只能通过</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt">public</span><span style="FONT-SIZE: 13.5pt; COLOR: red; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成员函数来访问；</span><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: red; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<o:p></o:p></span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout&lt;&lt;this-&gt;m_data&lt;&lt;endl;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; mso-font-kerning: 0pt">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></font></o:p></span><font face="宋体, MS Song">&nbsp;</font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p></o:p></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face="Times New Roman"></font></o:p></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; mso-font-kerning: 0pt"><font face="Times New Roman">main()<br>{<br>String AD;<br>char * p="ABCDE";<br>String B(p);<br>AD.ShowString();<br>AD=B;<br>AD.ShowString();<o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 13.5pt; COLOR: black; mso-font-kerning: 0pt"><br><font face="Times New Roman">}<o:p></o:p></font></span></p>
<img src ="http://www.cppblog.com/life02/aggbug/96086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2009-09-14 09:35 <a href="http://www.cppblog.com/life02/archive/2009/09/14/96086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）dynamic_cast，const_cast,static_cast,reinterpret_cast </title><link>http://www.cppblog.com/life02/archive/2009/09/14/96083.html</link><dc:creator>life02</dc:creator><author>life02</author><pubDate>Mon, 14 Sep 2009 00:07:00 GMT</pubDate><guid>http://www.cppblog.com/life02/archive/2009/09/14/96083.html</guid><wfw:comment>http://www.cppblog.com/life02/comments/96083.html</wfw:comment><comments>http://www.cppblog.com/life02/archive/2009/09/14/96083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/life02/comments/commentRss/96083.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/life02/services/trackbacks/96083.html</trackback:ping><description><![CDATA[<br><a href="http://www.cnblogs.com/cutepig/archive/2009/02/10/1387761.html">http://www.cnblogs.com/cutepig/archive/2009/02/10/1387761.html</a><br>dynamic_cast: &nbsp; 通常在基类和派生类之间转换时使用,run-time &nbsp; cast &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; const_cast: &nbsp; 主要针对const和volatile的转换. &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; static_cast: &nbsp; 一般的转换，no &nbsp; run-time &nbsp; check.通常，如果你不知道该用哪个，就用这个。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; reinterpret_cast: &nbsp; 用于进行没有任何关联之间的转换，比如一个字符指针转换为一个整形数。<br><br><br>http://blog.csdn.net/goodluckyxl/archive/2005/01/19/259851.aspx<br><br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">强制转化四种类型可能很多人都常常忽略就象我一样，但是有时还是比较有用的。不了解的建议看看，一些机制我也不是十分了解，只是将一些用法写出来让大家看看。<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2004-11-27 9:00</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">强制转化无论从语法还是语意上看，都是c++中最难看的特征之一。但是基于c风格的转化的语义的不明确性及其一些潜在问题。强制类型转化最终还是被c++接受了。<br>1.static_cast运算符号<br>static_cast&lt;T&gt;(e),stroustrup让我们可以把它看成隐含转换的显示的逆运算。这个是有一定道理的，基于隐式转化的对象类型我们可以使用static_cast转化运算符号。它是静态的检测，无法运行时检测类型，在继承中尤为突出。<br>使用范围<br>&lt;1&gt;用于所有系统类型之间转化，不能用于系统类型指针类型转化<br>&nbsp; double t_d = 0;<br>int t_i= static_cast&lt;int&gt;(t_d); //是合法的转化<br>而企图将double*-&gt;int*是不允许的<br>&lt;2&gt;用于继承类之间的转化（含指针），不能用于其他没有隐式转化的对象类型之间的转化<br>继承举例:<br>class x<br>{<br>};<br>class y: public x<br>{<br>};<br>使用:x t_o_x;<br>y t_o_y = static_cast&lt;y&gt;(t_o_x); //x* y*转化也可以进行因为x,y继承关<br>//系，类型可以自动隐式转化使用<br>&nbsp;&nbsp; 隐式转化举例:<br>class x<br>{<br>};<br>class y<br>{</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">public:<br>&nbsp;&nbsp;&nbsp;&nbsp;y( x i_x ) {}<br>};<br>&nbsp;&nbsp;&nbsp;&nbsp;x t_o_x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y t_o_y = static_cast&lt;y&gt;(t_o_x); //大家看到y构造函数可以对于x类型隐式转化<br>//所以可以将x-&gt;y，如果企图将y-&gt;x会报错<br>2.reinterpret_cast 运算<br>主要用于对于类型指针类型的强制转化，some_type* -&gt; special_type*这样转化，类型信息可以是不完全的。它允许将任意指针转化到其他类型指针，也允许任意整数类型到任意指针类型转化(BT)。这样导致的结果是极其不安全的，不能安全的应用于其他目的，除非转化到原来类型。<br>&lt;1&gt; 使用所有整形可以转化为任意类型的指针(指针是4字节的long的东东，那么机器就认为同类型就是可以转化)<br>int c;<br>x* p = reinterpret_cast&lt;x*&gt;(c); //x是自定义的任意类型，当然包括系统类型<br>&lt;2&gt; 可以对于任意类型指针之间转化<br>y* c;<br>x* p = reinterpret_cast&lt;x*&gt;(c);//x,y代表所有自定义或系统类型<br>大家可以看到reinterpret_cast的转化是极度的不负责任的，他只管转化不检测是否可以转化。<br>&lt;3&gt; const_cast运算符号<br>这个很简单从名字大家可以看出来，仅仅为了去掉或着加上const修饰符号。但是对于本身定义时为const的类型，即使你去掉const性，在你操作这片内容时候也要小心，只能r不能w操作，否则还是会出错。<br>const char* p = "123";<br>char* c = const_cast&lt;char*&gt;(p);<br>c[0] = 1;&nbsp; //表面上通过编译去掉了const性，但是操作其地址时系统依然不允许这<br>//么做。这是一个漏洞吧<br>&lt;4&gt; dynamic_cast运算符号<br>Scott Mayers将其描述为用来执行继承体系中：安全的向下转型或者跨系转型动作。也就是说你可以，用dynamic_cast将 指向base class的指针或引用转型为 指向子类的对象的指针或引用。<br>class B {};&nbsp; //polymorphic类型含virtual才能dynamic_cast<br>class D: public B {}<br>void f( B* pb )<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;D* pd1 = dynamic_cast&lt;D*&gt;(pb);//如果pb为d类型正确返回，如果不是返回0<br>&nbsp;&nbsp;&nbsp;&nbsp;D* pd2 = static_cast&lt;D*&gt;(pb); //不管怎么样都返回指针有可能指向不合适的对<br>//象，因为static仅仅静态检测，不能得到运<br>//行时对象的信息是否真正为D类型<br>}</p>
反正大家在使用知道怎么用就ok了，c++强制转化在模板中还是非常有用的，其他时候本人也喜欢用c的转化方便。^_^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>http://www.vckbase.com/document/viewdoc/?id=1651<br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center><strong>static_cast&lt;&gt;揭密<br></strong><br><br>作者：Sam NG </p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=center>译者：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#122;&#104;&#97;&#111;&#116;&#105;&#100;&#101;&#64;&#118;&#99;&#107;&#98;&#97;&#115;&#101;&#46;&#99;&#111;&#109;">小刀人</a></p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><br>原文链接：<a href="http://www.codeproject.com/cpp/static_cast.asp">What static_cast&lt;&gt; is actually doing</a><br><br>本文讨论static_cast&lt;&gt; 和 reinterpret_cast&lt;&gt;。 </p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><strong>介绍</strong><br>大多程序员在学C++前都学过C，并且习惯于C风格（类型）转换。当写C++（程序）时，有时候我们在使用static_cast&lt;&gt;和 reinterpret_cast&lt;&gt;时可能会有点模糊。在本文中，我将说明static_cast&lt;&gt;实际上做了什么，并且指出一些将会导致错误的情况。<br><br><strong>泛型（Generic Types）</strong><br><br></p>
<pre>        float f = 12.3;<br><br>        float* pf = &amp;f;<br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">// static cast&lt;&gt;<br><br>        // 成功编译, n = 12<br><br>        int n = static_cast&lt;int&gt;(f);<br><br>        // 错误,指向的类型是无关的（译注：即指针变量pf是float类型，现在要被转换为int类型）<br>        //int* pn = static_cast&lt;int*&gt;(pf);<br><br>        //成功编译<br><br>        void* pv = static_cast&lt;void*&gt;(pf);<br><br>        //成功编译, 但是 *pn2是无意义的内存（rubbish）<br><br>        int* pn2 = static_cast&lt;int*&gt;(pv);</p>
<br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">// reinterpret_cast&lt;&gt;<br><br>        //错误,编译器知道你应该调用static_cast&lt;&gt;<br><br>        //int i = reinterpret_cast&lt;int&gt;(f);<br><br>        //成功编译, 但是 *pn 实际上是无意义的内存,和 *pn2一样<br><br>        int* pi = reinterpret_cast&lt;int*&gt;(pf);</p>
</pre>
简而言之，static_cast&lt;&gt; 将尝试转换，举例来说，如float-到-integer，而reinterpret_cast&lt;&gt;简单改变编译器的意图重新考虑那个对象作为另一类型。<br><br><strong>指针类型（Pointer Types）</strong><br><br>指针转换有点复杂，我们将在本文的剩余部分使用下面的类：<br>
<pre>class CBaseX<br><br>      {<br><br>      public:<br><br>      int x;<br><br>      CBaseX() { x = 10; }<br><br>      void foo() { printf("CBaseX::foo() x=%d\n", x); }<br><br>      };<br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">class CBaseY<br><br>        {<br><br>        public:<br><br>        int y;<br><br>        int* py;<br><br>        CBaseY() { y = 20; py = &amp;y; }<br><br>        void bar() { printf("CBaseY::bar() y=%d, *py=%d\n", y, *py); <br>        }<br><br>        };</p>
<br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">class CDerived : public CBaseX, public CBaseY<br><br>        {<br><br>        public:<br><br>        int z;<br><br>        };</p>
</pre>
<strong>情况1：两个无关的类之间的转换 </strong><strong></strong><br><br>
<pre>      // Convert between CBaseX* and CBaseY*<br><br>      // CBaseX* 和 CBaseY*之间的转换<br><br>      CBaseX* pX = new CBaseX();<br><br>      // Error, types pointed to are unrelated<br><br>      // 错误， 类型指向是无关的<br><br>      // CBaseY* pY1 = static_cast&lt;CBaseY*&gt;(pX);<br><br>      // Compile OK, but pY2 is not CBaseX<br><br>      // 成功编译, 但是 pY2 不是CBaseX<br><br>      CBaseY* pY2 = reinterpret_cast&lt;CBaseY*&gt;(pX);<br><br>      // System crash!!<br><br>      // 系统崩溃!!<br><br>      // pY2-&gt;bar();</pre>
正如我们在泛型例子中所认识到的，如果你尝试转换一个对象到另一个无关的类static_cast&lt;&gt;将失败，而reinterpret_cast&lt;&gt;就总是成功&#8220;欺骗&#8221;编译器：那个对象就是那个无关类。<br><br><strong>情况2：转换到相关的类</strong><br>
<pre>      1. CDerived* pD = new CDerived();<br><br>      2. printf("CDerived* pD = %x\n", (int)pD);<br><br>      3. <br><br>      4. // static_cast&lt;&gt; CDerived* -&gt; CBaseY* -&gt; CDerived*<br><br>      //成功编译，隐式static_cast&lt;&gt;转换<br><br>      5. CBaseY* pY1 = pD;<br><br>      6. printf("CBaseY* pY1 = %x\n", (int)pY1);<br><br>      // 成功编译, 现在 pD1 = pD<br><br>      7. CDerived* pD1 = static_cast&lt;CDerived*&gt;(pY1);<br><br>      8. printf("CDerived* pD1 = %x\n", (int)pD1);<br><br>      9. <br><br>      10. // reinterpret_cast<br><br>      // 成功编译, 但是 pY2 不是 CBaseY*<br><br>      11. CBaseY* pY2 = reinterpret_cast&lt;CBaseY*&gt;(pD);<br><br>      12. printf("CBaseY* pY2 = %x\n", (int)pY2);<br><br>      13. <br><br>      14. // 无关的 static_cast&lt;&gt;<br><br>      15. CBaseY* pY3 = new CBaseY();<br><br>      16. printf("CBaseY* pY3 = %x\n", (int)pY3);<br><br>      // 成功编译,尽管 pY3 只是一个 "新 CBaseY()"<br><br>      17. CDerived* pD3 = static_cast&lt;CDerived*&gt;(pY3);<br><br>      18. printf("CDerived* pD3 = %x\n", (int)pD3);<br></pre>
<pre>      ---------------------- 输出 ---------------------------<br><br>      CDerived* pD = 392fb8<br><br>      CBaseY* pY1 = 392fbc<br><br>      CDerived* pD1 = 392fb8<br><br>      CBaseY* pY2 = 392fb8<br><br>      CBaseY* pY3 = 390ff0<br><br>      CDerived* pD3 = 390fec<br><br>      <br></pre>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">注意：在将CDerived*用隐式 static_cast&lt;&gt;转换到CBaseY*（第5行）时，结果是（指向）CDerived*（的指针向后） 偏移了4（个字节）（译注：4为int类型在内存中所占字节数）。为了知道static_cast&lt;&gt; 实际如何，我们不得不要来看一下CDerived的内存布局。</p>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体" align=left><strong>CDerived的内存布局（Memory Layout）</strong><br><br><img height=224 src="http://www.vckbase.com/document/journal/vckbase48/images/static_cast_layout.gif" width=355> <br><br>如图所示，CDerived的内存布局包括两个对象，CBaseX 和 CBaseY，编译器也知道这一点。因此，当你将CDerived* 转换到 CBaseY*时，它给指针添加4个字节，同时当你将CBaseY*转换到CDerived*时，它给指针减去4。然而，甚至它即便不是一个CDerived你也可以这样做。<br>当然，这个问题只在如果你做了多继承时发生。在你将CDerived转换 到 CBaseX时static_cast&lt;&gt; 和 reinterpret_cast&lt;&gt;是没有区别的。<br><br><strong>情况3：void*之间的向前和向后转换</strong><br><br>因为任何指针可以被转换到void*，而void*可以被向后转换到任何指针（对于static_cast&lt;&gt; 和 reinterpret_cast&lt;&gt;转换都可以这样做），如果没有小心处理的话错误可能发生。<br><br></p>
<pre>    CDerived* pD = new CDerived();<br><br>        printf("CDerived* pD = %x\n", (int)pD);<br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">    CBaseY* pY = pD; // 成功编译, pY = pD + 4<br><br>        printf("CBaseY* pY = %x\n", (int)pY);</p>
<br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">      void* pV1 = pY; //成功编译, pV1 = pY<br><br>        printf("void* pV1 = %x\n", (int)pV1);</p>
<br>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">         // pD2 = pY, 但是我们预期 pD2 = pY - 4<br><br>        CDerived* pD2 = static_cast&lt;CDerived*&gt;(pV1);<br><br>        printf("CDerived* pD2 = %x\n", (int)pD2);<br><br>        // 系统崩溃<br><br>        // pD2-&gt;bar();<br></p>
</pre>
<pre>        ---------------------- 输出 ---------------------------<br><br>        CDerived* pD = 392fb8<br><br>        CBaseY* pY = 392fbc<br><br>        void* pV1 = 392fbc<br><br>        CDerived* pD2 = 392fbc<br><br>     </pre>
<p style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体">一旦我们已经转换指针为void*，我们就不能轻易将其转换回原类。在上面的例子中，从一个void* 返回CDerived*的唯一方法是将其转换为CBaseY*然后再转换为CDerived*。 <br>但是如果我们不能确定它是CBaseY* 还是 CDerived*，这时我们不得不用dynamic_cast&lt;&gt; 或typeid[2]。<br><br><strong>注释：</strong><br>1. dynamic_cast&lt;&gt;，从另一方面来说，可以防止一个泛型CBaseY* 被转换到CDerived*。<br>2. dynamic_cast&lt;&gt;需要类成为多态，即包括&#8220;虚&#8221;函数，并因此而不能成为void*。<br><strong>参考：</strong> <br>1. [MSDN] C++ Language Reference -- Casting <br>2. Nishant Sivakumar, Casting Basics - Use C++ casts in your VC++.NET programs <br>3. Juan Soulie, C++ Language Tutorial: Type Casting<br><strong>推荐链接：</strong><a href="http://www.vckbase.com/document/viewdoc.asp?id=653">如何在运行时确定对象类型（RTTI）</a><br></p>
<img src ="http://www.cppblog.com/life02/aggbug/96083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/life02/" target="_blank">life02</a> 2009-09-14 08:07 <a href="http://www.cppblog.com/life02/archive/2009/09/14/96083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>