﻿<?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++博客-       [HORSETAIL]-文章分类-C/C++语言编程</title><link>http://www.cppblog.com/horsetail/category/3487.html</link><description>花儿,总会有谢的时候</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 20:30:02 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 20:30:02 GMT</pubDate><ttl>60</ttl><item><title>数组名----不同的时候,不同的表现</title><link>http://www.cppblog.com/horsetail/articles/18348.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sun, 04 Feb 2007 16:30:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/18348.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/18348.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/18348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/18348.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/18348.html</trackback:ping><description><![CDATA[1、数组名：(1)当一个数组标识符出现在表达式中，这个标识符的类型就从“某种类型T的数组”转换成“指向类型T的指针”，而且它的值就等于数组第一个元素的地址。但是当数组标识符被用作sizeof和取址(&amp;)操作的操作数时，sizeof返回的是整个数组的大小，而取址操作返回的是指向数组的指针(而不是指向一个值为数组头元素地址的指针的指针)。<img src ="http://www.cppblog.com/horsetail/aggbug/18348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-02-05 00:30 <a href="http://www.cppblog.com/horsetail/articles/18348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>"宏" 预处理命令</title><link>http://www.cppblog.com/horsetail/articles/18345.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sun, 04 Feb 2007 16:19:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/18345.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/18345.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/18345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/18345.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/18345.html</trackback:ping><description><![CDATA[         <font color="#ff0000">#define 标识符 字符串<br />         </font><font color="#000000">以上是宏命令的一般形式,上面所说的"字符串"不是我们平时所说的那个"字符串"变量.这点学要注意一下<img height="19" src="http://www.cppblog.com/Emoticons/72_72.gif" width="19" border="0" />!!它只是我们将要代替的东西.哪怕是 int也可以.<br />         宏的作用就是在本文件中,用指定的标识符来代替字符串.在<font color="#ff0000">编译预处理的时候</font><font color="#000000">,将程序中该命令出现的所有标识符,用相应的字符串代替.这样我们就可以用很简单的名字代替一个很长的字符串(包括数字常量).<br /></font>         当然,我们可以在需要的时候,告诉编译器,我们不再需要某个宏,让它从我们的程序上消失!!!<br />         用 #undef  命令可以告诉编译器,我们已经不再需要某个宏了.它的一般形式如下:<br />         <font color="#ff0000">#undef   标识符<br /></font>                  <br />         下面是宏的几点说明:<br />NO.1      宏名(标识符)一般习惯用大写字符,这样方便我们区分变量.当然,这不是必须的,我们一样可以用小写字符命名!<br />NO.2      使用宏名代替一个字符串,可以减少我们重复书写某些字符串的工作量.但是它仅仅是字符串的简单替换,它不做正确性检查!!正因为它只是简单的替换.所以,使用不当,可能会造成程序代码的膨胀!!这就何不尝试了!<br />NO.3      宏定义不是C/C++编程语言的语句,所以它不必在行魔加分号.如果加了分号则连同分号一起进行置换!如:<br />#define HO 13.2;<br />...<br />float fd=HO+HO;<br />在宏展开侯:<br />float fd=13.2;+13.2;<br />...<br />很明显,这是一个错误的程序!!!!<br />NO.4      宏出现在程序中函数的外面,宏名的有效范围为定义宏名之后到源文件莫.我们也可以用 #undef  提前终止宏定义的作用域!<br />NO.5      我们也可以在宏定义的时候引用宏名,可以层层叠加!<br />#define R 3.0<br />#define  J 63<br />#define P 47*J<br />#define L R*J*P<br /><br />这样 L 展开后<br />3.0*63*47*63<br /><br /><br />睡觉!!!!我也是新手,哪里错的麻烦提一下,好么</font><img src ="http://www.cppblog.com/horsetail/aggbug/18345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-02-05 00:19 <a href="http://www.cppblog.com/horsetail/articles/18345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基类虚函数返回类型与子类的可以不同</title><link>http://www.cppblog.com/horsetail/articles/18316.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 03 Feb 2007 16:22:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/18316.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/18316.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/18316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/18316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/18316.html</trackback:ping><description><![CDATA[         在最新版的C++标准中，虚函数的返回类型可以不同，但必须是同一继承体系中的类型。   <br /> 比如: 基类指针和子类指针;基类引用和子类引用;基类对象和子类对象。(此段载自:csdn论坛)<br />         上面列出来的,必须一一对应.不可以基类返回基类指针,而派生类返回的却是对象或引用(不管是派生类的还是基类的).<br /><img src ="http://www.cppblog.com/horsetail/aggbug/18316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-02-04 00:22 <a href="http://www.cppblog.com/horsetail/articles/18316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[C++ Primer 关键概念] 已初始化变量与未初始化变量</title><link>http://www.cppblog.com/horsetail/articles/17847.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 14:06:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17847.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17847.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17847.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17847.html</trackback:ping><description><![CDATA[      在C++中，初始话是一个非常重要的概念。对它的讨论将贯穿本书（C++  Primer 4）的始终。<br />      已初始化变量是指变量在定义时就给定一个值。未初始化变量则未给定初始值：<br />      int va11=0;  //初始化<br />      int va12;  //未初始化<br />给变量一个初始值几乎总是真确的，但不要求必须这样做。当我们确定变量在第一次使用时会赋一个新值，那就不需要创建初始值。例如，我们本节开始我们的第一个有意义的程序中，定义了未初始化变量，并立即读取值给他们。<br />       定义变量时，应该给变量赋初始值，除非确定将变量用于其他意图之前会覆盖这个初值。如果不能保证读取变量之前重置变量，就应该初始化变量。<br /><img src ="http://www.cppblog.com/horsetail/aggbug/17847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 22:06 <a href="http://www.cppblog.com/horsetail/articles/17847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]C++命名规则</title><link>http://www.cppblog.com/horsetail/articles/17829.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17829.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17829.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17829.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17829.html</trackback:ping><description><![CDATA[
		<div class="content" id="BodyLabel" style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">    如果想要有效的管理一个稍微复杂一点的体系，针对其中事物的一套统一、带层次结构、清晰明了的命名准则就是必不可少而且非常好用的工具。 
<p>    活跃在生物学、化学、军队、监狱、黑社会、恐怖组织等各个领域内的大量有识先辈们都曾经无数次地以实际行动证明了以上公理的正确性。除了上帝（设它可以改变世间万物的秩序）以外，相信没人有实力对它不屑一顾。</p><p>    在软件开发这一高度抽象而且十分复杂的活动中，命名规则的重要性更显得尤为突出。一套定义良好并且完整的、在整个项目中统一使用的命名规范将大大提升源代码的可读性和软件的可维护性。</p><p>在引入细节之前，先说明一下命名规范的整体原则：</p><div align="center"><table id="table53" style="WIDTH: 782px; BORDER-COLLAPSE: collapse; HEIGHT: 634px" bordercolor="#c0c0c0" bordercolordark="#c0c0c0" cellpadding="4" width="782" bordercolorlight="#c0c0c0" border="1"><tbody><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">同一性</td><td valign="top" align="left">在编写一个子模块或派生类的时候，要遵循其基类或整体模块的命名风格，保持命名风格在整个模块中的同一性。 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">标识符组成</td><td valign="top" align="left">标识符采用英文单词或其组合，应当直观且可以拼读，可望文知意，用词应当准确。 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">最小化长度 &amp;&amp; 最大化信息量原则</td><td valign="top" align="left">在保持一个标识符意思明确的同时，应当尽量缩短其长度。 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">避免过于相似</td><td valign="top" align="left">不要出现仅靠大小写区分的相似的标识符，例如“i”与“I”，“function”与“Function”等等。 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">避免在不同级别的作用域中重名</td><td valign="top" align="left">程序中不要出现名字完全相同的局部变量和全局变量，尽管两者的作用域不同而不会发生语法错误，但容易使人误解。 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">正确命名具有互斥意义的标识符</td><td valign="top" align="left">用正确的反义词组命名具有互斥意义的标识符，如："nMinValue"和"nMaxValue"，"GetName()" 和 "SetName()" .... 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb"><font color="#808080">避免名字中出现数字编号</font></td><td valign="top" align="left">尽量避免名字中出现数字编号，如Value1,Value2等，除非逻辑上的确需要编号。这是为了防止程序员偷懒，不肯为命名动脑筋而导致产生无意义的名字（因为用数字编号最省事）。</td></tr></tbody></table></div><h3>　</h3><h3>类/结构<br /></h3><div align="center"><table id="table32" style="BORDER-COLLAPSE: collapse" bordercolordark="#808080" cellpadding="4" width="95%" bordercolorlight="#808080" border="0"><tbody><tr><td>除了异常类等个别情况（不希望用户把该类看作一个普通的、正常的类之情况）外，C++类/结构<br />的命名应该遵循以下准则： 
<div align="center">　 
<table id="table54" style="BORDER-COLLAPSE: collapse" bordercolor="#c0c0c0" bordercolordark="#c0c0c0" cellpadding="4" width="95%" bordercolorlight="#c0c0c0" border="1"><tbody><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">C++类/结构的命名</td><td valign="top" align="left">类的名称都要以大写字母“C”开头，后跟一个或多个单词。为便于界定，每个单词的首字母要大写。 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb"><font color="#808080">推荐的组成形式</font></td><td valign="top" align="left">类的命名推荐用"<span style="BACKGROUND-COLOR: #ffff00">名词</span>"或"<span style="BACKGROUND-COLOR: #ffff00">形容词＋名词</span>"的形式，例如："CAnalyzer", "CFastVector" ....</td></tr></tbody></table><p align="left">不同于C++类的概念，传统的C结构体只是一种将一组数据捆绑在一起的方式。传统C结构体的命名规则为：</p><table id="table57" style="BORDER-COLLAPSE: collapse" bordercolor="#c0c0c0" bordercolordark="#c0c0c0" cellpadding="4" width="95%" bordercolorlight="#c0c0c0" border="1"><tbody><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">传统C结构体的命名</td><td valign="top" align="left">传统C结构体的名称全部由大写字母组成，单词间使用下划线界定，例如："SERVICE_STATUS", "DRIVER_INFO" ....</td></tr></tbody></table></div></td></tr></tbody></table><p align="left">　</p><h3 align="left">函数<br /></h3><div align="center"><table id="table34" style="BORDER-COLLAPSE: collapse" bordercolordark="#808080" cellpadding="4" width="95%" bordercolorlight="#808080" border="0"><tbody><tr><td><div align="center"><table id="table58" style="BORDER-COLLAPSE: collapse" bordercolor="#c0c0c0" bordercolordark="#c0c0c0" cellpadding="4" width="95%" bordercolorlight="#c0c0c0" border="1"><tbody><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">函数的命名</td><td valign="top" align="left">函数的名称由一个或多个单词组成。为便于界定，每个单词的首字母要大写。 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb"><font color="#808080">推荐的组成形式</font></td><td valign="top" align="left">函数名应当使用"<span style="BACKGROUND-COLOR: #ffff00">动词</span>"或者"<span style="BACKGROUND-COLOR: #ffff00">动词＋名词</span>"（动宾词组）的形式。例如："GetName()", "SetValue()", "Erase()", "Reserve()" .... 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">保护成员函数</td><td valign="top" align="left">保护成员函数的开头应当加上一个下划线“_”以示区别，例如："_SetState()" .... 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">私有成员函数</td><td valign="top" align="left">类似地，私有成员函数的开头应当加上两个下划线“__”，例如："__DestroyImp()" .... 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb"><font color="#808080">虚函数</font></td><td valign="top" align="left">虚函数习惯以“Do”开头，如："DoRefresh()", "_DoEncryption()" .... 
<p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb"><font color="#808080">回调和事件处理函数</font></td><td valign="top" align="left">回调和事件处理函数习惯以单词“On”开头。例如："_OnTimer()", "OnExit()" ....</td></tr></tbody></table></div></td></tr></tbody></table><p>　</p></div><h3 align="left">变量<br /></h3><div align="center"><table id="table35" style="BORDER-COLLAPSE: collapse" bordercolordark="#808080" cellpadding="4" width="95%" bordercolorlight="#808080" border="0"><tbody><tr><td><div align="center"><p align="left">变量应该是程序中使用最多的标识符了，变量的命名规范可能是一套C++命名准则中最重要的部分：</p><table id="table59" style="BORDER-COLLAPSE: collapse" bordercolor="#c0c0c0" bordercolordark="#c0c0c0" cellpadding="4" width="95%" bordercolorlight="#c0c0c0" border="1"><tbody><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">变量的命名</td><td valign="top" align="left">变量名由<span style="BACKGROUND-COLOR: #ffff00">作用域前缀＋类型前缀＋一个或多个单词</span>组成。为便于界定，每个单词的首字母要大写。 
<p>对于某些用途简单明了的局部变量，也可以使用简化的方式，如：i, j, k, x, y, z .... </p><p>　</p></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">作用域前缀</td><td valign="top" align="left">作用域前缀标明一个变量的可见范围。作用域可以有如下几种： 
<div align="center"><table id="table60" style="BORDER-COLLAPSE: collapse" bordercolordark="#808080" cellpadding="4" width="95%" bordercolorlight="#808080" border="0"><tbody><tr><td style="BORDER-RIGHT: 1px solid; BORDER-BOTTOM: 1px solid" valign="top" align="left" width="125"><b>前缀</b></td><td style="BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" valign="top" align="left"><b>说明</b></td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="125"><font color="#808080"><i>无</i></font></td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">局部变量</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="125">m_</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">类的成员变量（member）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="125">sm_</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">类的静态成员变量（static member）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="125">s_</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">静态变量（static）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="125">g_</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">外部全局变量（global）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="125">sg_</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">静态全局变量（static global）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="125">gg_</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">进程间共享的共享数据段全局变量（global global）</td></tr></tbody></table><p align="left">除非不得已，否则应该尽可能少使用全局变量。 </p><p align="left">　</p></div></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">类型前缀</td><td valign="top" align="left">类型前缀标明一个变量的类型，可以有如下几种： 
<div align="center"><table id="table61" style="BORDER-COLLAPSE: collapse" bordercolordark="#808080" cellpadding="4" width="95%" bordercolorlight="#808080" border="0"><tbody><tr><td style="BORDER-RIGHT: 1px solid; BORDER-BOTTOM: 1px solid" valign="top" align="left" width="125"><b>前缀</b></td><td style="BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid" valign="top" align="left"><b>说明</b></td></tr><tr><td style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid" valign="top" align="left" width="124">n</td><td style="BORDER-TOP: 1px solid; BORDER-LEFT: 1px solid" valign="top" align="left">整型和位域变量（number）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="124">e</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">枚举型变量（enumeration）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="124">c</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">字符型变量（char）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="124">b</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">布尔型变量（bool）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="124">f</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">浮点型变量（float）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="124">p</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">指针型变量和迭代子（pointer）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="124">pfn</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">特别针对指向函数的指针变量和函数对象指针（pointer of function）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="124">g</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">数组（grid）</td></tr><tr><td style="BORDER-RIGHT: 1px solid" valign="top" align="left" width="124">i</td><td style="BORDER-LEFT: 1px solid" valign="top" align="left">类的实例（instance） 
<p>对于经常用到的类，也可以定义一些专门的前缀，如：std::string和std::wstring类的前缀可以定义为"st"，std::vector类的前缀可以定义为"v"等等。</p></td></tr></tbody></table><p align="left">类型前缀可以组合使用，例如"gc"表示字符数组，"ppn"表示指向整型的指针的指针等等。 </p><p align="left">　</p></div></td></tr><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb"><font color="#808080">推荐的组成形式</font></td><td valign="top" align="left">变量的名字应当使用"<span style="BACKGROUND-COLOR: #ffff00">名词</span>"或者"<span style="BACKGROUND-COLOR: #ffff00">形容词＋名词</span>"。例如："nCode", "m_nState"，"nMaxWidth" ....</td></tr></tbody></table></div></td></tr></tbody></table><p align="left">　</p><h3 align="left">常量<br /></h3><div align="center"><table id="table64" style="BORDER-COLLAPSE: collapse" bordercolordark="#808080" cellpadding="4" width="95%" bordercolorlight="#808080" border="0"><tbody><tr><td><div align="center"><p align="left">C++中引入了对常量的支持，常量的命名规则如下：</p><table id="table68" style="BORDER-COLLAPSE: collapse" bordercolor="#c0c0c0" bordercolordark="#c0c0c0" cellpadding="4" width="95%" bordercolorlight="#c0c0c0" border="1"><tbody><tr><td valign="top" align="left" width="182" bgcolor="#ebebeb">常量的命名</td><td valign="top" align="left">常量名由<span style="BACKGROUND-COLOR: #ffff00">类型前缀＋全大写字母</span>组成，单词间通过下划线来界定，如：<font face="Fixedsys" color="#808080">cDELIMITER</font>, <font face="Fixedsys" color="#808080">nMAX_BUFFER</font> .... 
<p>类型前缀的定义与变量命名规则中的相同。</p></td></tr></tbody></table></div></td></tr></tbody></table></div></div><p align="left">　</p><h3 align="left">枚举、联合、typedef<br /></h3><div align="center"><table id="table36" style="BORDER-COLLAPSE: collapse" bordercolordark="#808080" cellpadding="4" width="95%" bordercolorlight="#808080" border="0"><tbody><tr><td><div align="center"><p align="left">枚举、联合及typedef语句都是定义新类型的简单手段，它们的命名规则为：</p><table id="table62" style="BORDER-COLLAPSE: collapse" bordercolor="#c0c0c0" bordercolordark="#c0c0c0" cellpadding="4" width="95%" bordercolorlight="#c0c0c0" border="1"><tbody><tr><td valign="top" align="left" width="181" bgcolor="#ebebeb">枚举、联合、typedef的命名</td><td valign="top" align="left">枚举、联合、typedef语句生成的类型名由全大写字母组成，单词间通过下划线来界定，如：<font face="Fixedsys" color="#0000ff">FAR_PROC</font>, <font face="Fixedsys" color="#0000ff">ERROR_TYPE</font> ....</td></tr></tbody></table></div></td></tr></tbody></table></div><p align="left">　</p><h3 align="left">宏、枚举值<br /></h3><div align="center"><table id="table37" style="BORDER-COLLAPSE: collapse" bordercolordark="#808080" cellpadding="4" width="95%" bordercolorlight="#808080" border="0"><tbody><tr><td><div align="center"><table id="table63" style="BORDER-COLLAPSE: collapse" bordercolor="#c0c0c0" bordercolordark="#c0c0c0" cellpadding="4" width="95%" bordercolorlight="#c0c0c0" border="1"><tbody><tr><td valign="top" align="left" width="181" bgcolor="#ebebeb">宏、枚举值的命名</td><td valign="top" align="left">宏和枚举值由全大写字母组成，单词间通过下划线来界定，如：<font face="Fixedsys" color="#ff8000">ERROR_UNKNOWN</font>, <font face="Fixedsys" color="#ff8000">OP_STOP</font> ....</td></tr></tbody></table></div></td></tr></tbody></table></div><p align="left"><br /> </p></div></div>
<img src ="http://www.cppblog.com/horsetail/aggbug/17829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 17:40 <a href="http://www.cppblog.com/horsetail/articles/17829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[C++ Primer 注解]return语句后面的分号</title><link>http://www.cppblog.com/horsetail/articles/17828.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17828.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17828.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17828.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17828.html</trackback:ping><description><![CDATA[      注意return语句后面的分号。在C++中多数语句以分号作为结束标志。分号很容易被忽略，而漏写分号将会导致莫名其妙的编译错误信息。<img src ="http://www.cppblog.com/horsetail/aggbug/17828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 17:03 <a href="http://www.cppblog.com/horsetail/articles/17828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]异常的几点说明</title><link>http://www.cppblog.com/horsetail/articles/17820.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:29:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17820.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17820.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17820.html</trackback:ping><description><![CDATA[
		<p>作者：<font color="#800080">Horsetail</font></p>
		<p>查看普通函数声明的时候，不可能确定该函数会抛出什么异常，但是，为了编写适当的catch子句，了解函数是否抛出异常以及会抛出那种异常是很有用的。<font color="#000000">异常说明指定，如果函数抛出异常，被抛出异常将是包含在说明中的一种，或者是从列出的异常中派生的类型</font></p>
		<p>异常说明的定义：</p>
		<p>异常说明跟在函数形参之后，uoge异常说明在关键字throw之后跟着一个（可能为空的）由圆括号括住的异常类型类表。如：</p>
		<p>void recoup (int) throw(int);</p>
		<p>注意：如果异常类型列表为空，则可以抛出任何异常！</p>
		<p>成员函数声明中，异常说明跟在const后面！</p>
		<p>异常说明是函数接口的一部份,函数定义以及该函数的任意声明必须具有相同的异常说明！</p>
		<p>基类中的一场说明可以与派生类的不一样，但是派生类中的异常说明要和对应基类中的一样严格，或更严格！</p>
<img src ="http://www.cppblog.com/horsetail/aggbug/17820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:29 <a href="http://www.cppblog.com/horsetail/articles/17820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[编程爱好者论坛]关于成员函数与继承的问题</title><link>http://www.cppblog.com/horsetail/articles/17819.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17819.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17819.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17819.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17819.html</trackback:ping><description><![CDATA[
		<p>作者：未知</p>
		<p>protected函数在类及其继承类的内部调用。因此，如果一个类可以调用其它类的public成员函数，如果这个类是另一个类的子类，则还可以调用它的protected成员函数。——即使不使用friend也是可以的。但如果需要跨过private/protected的限制来调用类的成员函数，则需要使用friend声明。一般而言，在设计时应该尽量少使用或不使用friend。<br /><br />静态的成员函数通过类名来调用（如果在类的内部，类名可省略），非静态的成员函数通过类的对象来调用。</p>
<img src ="http://www.cppblog.com/horsetail/aggbug/17819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:28 <a href="http://www.cppblog.com/horsetail/articles/17819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[编程爱好者论坛]delete问题（其一）</title><link>http://www.cppblog.com/horsetail/articles/17818.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:27:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17818.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17818.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17818.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17818.html</trackback:ping><description><![CDATA[
		<p>作者：未知</p>
		<p>delete只是把空间的独占权取消了，并没有随之抹销原存储的数据<br /><br />如果传入引用<br />那么传进来的就是指向原来你所申请的指针的指针<br />在释放独占权之后进行的清空是全局清空<br />而传入的是指针本身的话<br />清零操作可以被看成局部操作，不影响主程序的原始指针</p>
<img src ="http://www.cppblog.com/horsetail/aggbug/17818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:27 <a href="http://www.cppblog.com/horsetail/articles/17818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[未知]关于return及主函数返回类型的问题(精)</title><link>http://www.cppblog.com/horsetail/articles/17816.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17816.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17816.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17816.html</trackback:ping><description><![CDATA[作者：未知<br />关于C语言中return的一些总结 <br />return是C++预定义的语句，它提供了种植函数执行的一种放大。当return语句提供了一个值时，这个值就成为函数的返回值. <br />说到return,有必要提及主函数的定义,下面是从网络上找到的资料,好好消化吧,对了解主函数中返回值的理解有很大的帮助. <br />很多人甚至市面上的一些书籍，都使用了void main( ) ，其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.（ void main( ) 从来就不存在于 C++ 或者 C ）。下面我分别说一下 C 和 C++ 标准中对 main 函数的定义。 <br />1. C <br />在 C89 中，main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 2e（《C 程序设计语言第二版》）用的就是 main( )。不过在最新的 C99 标准中，只有以下两种定义方式是正确的： <br />int main( void ) <br />int main( int argc, char *argv[] ) <br />（参考资料：ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup） <br />当然，我们也可以做一点小小的改动。例如：char *argv[] 可以写成 char **argv；argv 和 argc 可以改成别的变量名（如 intval 和 charval），不过一定要符合变量的命名规则。 <br />如果不需要从命令行中获取参数，请用int main(void) ；否则请用int main( int argc, char *argv[] ) 。 <br />main 函数的返回值类型必须是 int ，这样返回值才能传递给程序的激活者（如操作系统）。 <br />如果 main 函数的最后没有写 return 语句的话，C99 规定编译器要自动在生成的目标文件中（如 exe 文件）加入return 0; ，表示程序正常退出。不过，我还是建议你最好在main函数的最后加上return 语句，虽然没有这个必要，但这是一个好的习惯。注意，vc6不会在目标文件中加入return 0; ，大概是因为 vc6 是 98 年的产品，所以才不支持这个特性。现在明白我为什么建议你最好加上 return 语句了吧！不过，gcc3.2（Linux 下的 C 编译器）会在生成的目标文件中加入 return 0; 。 <br /><br />2. C++ <br />C++98 中定义了如下两种 main 函数的定义方式： <br />int main( ) <br />int main( int argc, char *argv[] ) <br />（参考资料：ISO/IEC 14882(1998-9-01)Programming languages — C++ 3.6 Start and termination） <br />int main( ) 等同于 C99 中的 int main( void ) ；int main( int argc, char *argv[] ) 的用法也和 C99 中定义的一样。同样，main 函数的返回值类型也必须是int。如果main函数的末尾没写return语句，C++98 规定编译器要自动在生成的目标文件中加入 return 0; 。同样，vc6 也不支持这个特性，但是 g++3.2（Linux 下的 C++ 编译器）支持。 <br /><br />3. 关于 void main <br />在 C 和 C++ 中，不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个，所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的！main 函数的返回值应该定义为 int 类型，C 和 C++ 标准中都是这样规定的。虽然在一些编译器中，void main 可以通过编译（如 vc6），但并非所有编译器都支持 void main ，因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型，就根本通不过编译。而 gcc3.2 则会发出警告。所以，如果你想你的程序拥有很好的可移植性，请一定要用 int main 。 <br /><br />4. 返回值的作用 <br />main 函数的返回值用于说明程序的退出状态。如果返回 0，则代表程序正常退出，否则代表程序异常退出。下面我们在 winxp 环境下做一个小实验。首先编译下面的程序： <br />int main( void ) <br />{ <br />return 0; <br />} <br />然后打开附件里的“命令提示符”，在命令行里运行刚才编译好的可执行文件，然后输入“echo %ERRORLEVEL%”，回车，就可以看到程序的返回值为 0 。假设刚才编译好的文件是 a.exe ，如果输入“a &amp;&amp; dir”，则会列出当前目录下的文件夹和文件。但是如果改成“return -1”，或者别的非 0 值，重新编译后输入“a &amp;&amp; dir”，则 dir 不会执行。因为 &amp;&amp; 的含义是：如果 &amp;&amp; 前面的程序正常退出，则继续执行 &amp;&amp; 后面的程序，否则不执行。也就是说，利用程序的返回值，我们可以控制要不要执行下一个程序。这就是 int main 的好处。如果你有兴趣，也可以把 main 函数的返回值类型改成非 int 类型（如 float），重新编译后执行“a &amp;&amp; dir”，看看会出现什么情况，想想为什么会出现那样的情况。顺便提一下，如果输入 a || dir 的话，则表示如果 a 异常退出，则执行 dir 。 <br />5. 那么 intmain(intargc,char*argv[],char*envp[])呢？ <br />这当然也不是标准 C 里面定义的东西！char*envp[] 是某些编译器提供的扩展功能，用于获取系统的环境变量。因为不是标准，所以并非所有编译器都支持，故而移植性差，不推荐使用。 <br />到了这里,你应该了解为什么主函数定义为 int返回类型,而且函数体里面有return 0;这个语句了吧. <br />下面具体说说我对return的应用的理解。 <br />只要一个函数的返回值是数字型的,那么就可以返回0(即return 0),其实你返回多少都没问题。一般情况下，C++做出来的函数都要求返回一个值，当函数执行正常，且达到了一般情况下的目的，那么就返回0表示正确的调用了该函数，这个0就是返回给主调函数以通知没有出错的；如果函数调用中出错，或者没有按照一般情况执行，那么就返回1，以告知主调函数采取响应策略；如果你在某个函数所在类的定义所在的头文件中定义了一组状态值（一般都是负整数），那么函数就可以返回不同的值以告之主调函数具体发生了什么异常或错误，这种情况一般用于函数功能独立性较差的的情况。所以一般不鼓励把函数返回类型定义为void，至少返回应该是int，而在函数的最后加上return 0.语句： <br />int func(参数列表) <br />{ <br />…… <br />…… <br />…… <br />Return 0; <br />} <br />在函数中，如果碰到return 语句，那么程序就会返回调用该函数的下一条语句执行，也就是说跳出函数的执行，回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句，那么整个程序就会停止，退出程序的执行。 <br />如果你定义一个函数有返回类型，可以想下面那样调用： <br />int func() <br />{ <br />int value; <br />…… <br />…… <br />…… <br />return value; <br />} <br />int main() <br />{ <br />int intvalue; <br />intvalue=func(); <br />…… <br />…… <br />teturn 0; <br />} <br />return语句后面具体是什么内容，这就要具体情况具体分析了： <br />（1） 在返回类型是char的函数中，return后应该是char类型的值； <br />（2） 在返回类型是int的函数中，如果是要停止函数的调用，最好应该为0；其他的按照你的目的而定，只要是int 类型就行了 <br />（3） 在返回类型是结构类型的函数中，return后应该是结构的一个实例对象。 <br />总之，函数定义为什么样的返回类型，该函数中return后就应该是相应类型的值。<img src ="http://www.cppblog.com/horsetail/aggbug/17816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:26 <a href="http://www.cppblog.com/horsetail/articles/17816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]关于虚继承中的一点问题</title><link>http://www.cppblog.com/horsetail/articles/17817.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17817.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17817.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17817.html</trackback:ping><description><![CDATA[
		<p>作者：Horsetail</p>
		<p>先看看下面这个程序先：</p>
		<p>#include &lt;iostream&gt;<br />#include &lt;stdio.h&gt;<br />class A{<br />public:<br /> A(){std::cout&lt;&lt;"here is class A"&lt;&lt;std::endl;}<br /> A(int a){std::cout&lt;&lt;a&lt;&lt;std::endl;}<br /> void fun(){std::cout&lt;&lt;"Ten FUN in the A"&lt;&lt;std::endl;return;}<br />};<br />class B:public A{<br />public:<br /> void fun(){std::cout&lt;&lt;"Ten FUN in the B"&lt;&lt;std::endl;return;}<br /> B():A(0){std::cout&lt;&lt;"here is class B"&lt;&lt;std::endl;}<br />};<br />struct C:A,B{ C():A(1){std::cout&lt;&lt;"here is class C"&lt;&lt;std::endl;}<br />};<br />//</p>
		<p>int main()<br />{<br /> C c;<br />char i=0;</p>
		<p>getchar();<br /> return 0;<br />}</p>
		<p>        编译器可以通过编译，但是当我们在main()函数中调用基类A中的fun()函数时，就出错了！因为在B类中也继承了A类，当在main()中调用fun时，编译器不能确定是直接调用A类中的fun()还是通过A类的继承类B间接调用A类中的fun()！因此，在我们继承成员中如果有相同的父类，我们应该声明虚继承！</p>
		<p>在虚继承的同时，我们还应该注意下面这个问题：</p>
		<p>         当我们多虚继承一个类时如果在基类集中存在两个或两个以上同样的基类且其中有一个基类使用了virtual关键字。则其余相同的基类必须全部都要用virtual关键字！否则不能通过编译</p>
<img src ="http://www.cppblog.com/horsetail/aggbug/17817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:26 <a href="http://www.cppblog.com/horsetail/articles/17817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]static类成员函数</title><link>http://www.cppblog.com/horsetail/articles/17815.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:25:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17815.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17815.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17815.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17815.html</trackback:ping><description><![CDATA[
		<p>作者：<a class="titlink" title="Horsetail的空间 http://hi.baidu.com/horsetail" href="http://hi.baidu.com/horsetail"><font color="#800080">Horsetail</font></a><br /><br />在类内部声明static成员函数的时候，必须指定static关键字。然而，在类外部定义类成员函数的时候，则一定不可以出现static关键字了</p>
<img src ="http://www.cppblog.com/horsetail/aggbug/17815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:25 <a href="http://www.cppblog.com/horsetail/articles/17815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]关于在cin中输入输出空格的实现</title><link>http://www.cppblog.com/horsetail/articles/17814.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:23:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17814.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17814.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17814.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17814.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17814.html</trackback:ping><description><![CDATA[
		<p>作者：<font color="#800080">Horsetail</font></p>
		<p>因为std::cin不能直接接受空格(空格作为输入的标志),所以我们要用cin对象中的一个成员函数std::cin.get()接受单个字符.并可以用std::cout.put()成员函数直接输出.如下:</p>
		<p> #include &lt;iostream&gt;<br /><br />using namespace std;<br /><br />int main()<br />{<br />  char c;<br /><br />  while( cin.get())  //接受单个字符(包括空格)<br />  {<br />     cout.put();调 //输出单个字符!<br />  }<br /><br />  return 1;<br />}</p>
<img src ="http://www.cppblog.com/horsetail/aggbug/17814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:23 <a href="http://www.cppblog.com/horsetail/articles/17814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]函数测试块与构造函数</title><link>http://www.cppblog.com/horsetail/articles/17813.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:22:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17813.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17813.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17813.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17813.html</trackback:ping><description><![CDATA[
		<p>作者：<font color="#800080">Horsetail</font></p>
		<p>为了让构造函数能捕获初始化时的异常，我们必须将构造函数些微函数测试块。可以使用函数测试块将一组catch子句与函数联成一个主题。如：</p>
		<p>template &lt;typename T&gt;<font color="#ff0000">Hand&lt;T&gt;::Hand(T *p)try:a(0),b(0)</font><font color="#000000">{...}</font></p>
		<p>catch(int a){....}</p>
<img src ="http://www.cppblog.com/horsetail/aggbug/17813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:22 <a href="http://www.cppblog.com/horsetail/articles/17813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]“&amp;*”与“*&amp;”组合类型的理解判断方法</title><link>http://www.cppblog.com/horsetail/articles/17811.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:18:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17811.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17811.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17811.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17811.html</trackback:ping><description><![CDATA[       在使用指针引用的时候,不少人会被 “&amp;*”与“*&amp;”弄得一塌糊涂(我就是这样了……^v^). 
<p>这里我把我本人的理解过程分享下!希望对大家有所帮助!</p><p>        现在我们先来看看下面这个声明:</p><p>void DelDate(date *&amp;timer);</p><p>date *&amp;timer 这里我们应该是从右向左理解:</p><p>&amp;timer  理解成timer是一个引用,但是它会是指向一个什么类型的引用呢?我们接着往下看^v^</p><p> *&amp;timer这里我们可以很轻松的理解到timer是一个指针的引用</p><p>按照上面那种我们可以很快知道timer是一个date的指针类型的引用!</p><p>...................................</p><p>接着,我们来分析下“&amp;*”</p><p>在“date &amp;*timer”中，我们可以按照上面的方法分析下。</p><p>*timer是个指针，它指向一个date的引用，可是在C++中指向引用的指针是错误的！（）</p><p>所以&amp;*是错误的的！</p><p> </p><p>==============================</p><p>这样理解不知道可以不?希望大家给给意见,好么?</p><img src ="http://www.cppblog.com/horsetail/aggbug/17811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:18 <a href="http://www.cppblog.com/horsetail/articles/17811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[未知]如何解读复杂指针声明</title><link>http://www.cppblog.com/horsetail/articles/17810.html</link><dc:creator>[HORSETAIL]</dc:creator><author>[HORSETAIL]</author><pubDate>Sat, 20 Jan 2007 05:17:00 GMT</pubDate><guid>http://www.cppblog.com/horsetail/articles/17810.html</guid><wfw:comment>http://www.cppblog.com/horsetail/comments/17810.html</wfw:comment><comments>http://www.cppblog.com/horsetail/articles/17810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/horsetail/comments/commentRss/17810.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/horsetail/services/trackbacks/17810.html</trackback:ping><description><![CDATA[
		<p>作者:未知   </p>
		<p>       C语言所有复杂的指针声明，都是由各种声明嵌套构成的。如何解读复杂指针声明呢？右左法则是一个既著名又常用的方法。不过，右左法则其实并不是C标准里面的内容，它是从C标准的声明规定中归纳出来的方法。C标准的声明规则，是用来解决如何创建声明的，而右左法则是用来解决如何辩识一个声明的，两者可以说是相反的。右左法则的英文原文是这样说的：</p>
		<p>The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed. </p>
		<p>
				<br />这段英文的翻译如下：</p>
		<p>右左法则：首先从最里面的圆括号看起，然后往右看，再往左看。每当遇到圆括号时，就应该掉转阅读方向。一旦解析完圆括号里面所有的东西，就跳出圆括号。重复这个过程直到整个声明解析完毕。</p>
		<p>        笔者要对这个法则进行一个小小的修正，应该是从未定义的标识符开始阅读，而不是从括号读起，之所以是未定义的标识符，是因为一个声明里面可能有多个标识符，但未定义的标识符只会有一个。</p>
		<p>        现在通过一些例子来讨论右左法则的应用，先从最简单的开始，逐步加深：</p>
		<p>int (*func)(int *p);</p>
		<p>首先找到那个未定义的标识符，就是func，它的外面有一对圆括号，而且左边是一个*号，这说明func是一个指针，然后跳出这个圆括号，先看右边，也是一个圆括号，这说明(*func)是一个函数，而func是一个指向这类函数的指针，就是一个函数指针，这类函数具有int*类型的形参，返回值类型是int。</p>
		<p>int (*func)(int *p, int (*f)(int*));</p>
		<p>func被一对括号包含，且左边有一个*号，说明func是一个指针，跳出括号，右边也有个括号，那么func是一个指向函数的指针，这类函数具有int *和int (*)(int*)这样的形参，返回值为int类型。再来看一看func的形参int (*f)(int*)，类似前面的解释，f也是一个函数指针，指向的函数具有int*类型的形参，返回值为int。</p>
		<p>int (*func[5])(int *p);</p>
		<p>func右边是一个[]运算符，说明func是一个具有5个元素的数组，func的左边有一个*，说明func的元素是指针，要注意这里的*不是修饰func的，而是修饰func[5]的，原因是[]运算符优先级比*高，func先跟[]结合，因此*修饰的是func[5]。跳出这个括号，看右边，也是一对圆括号，说明func数组的元素是函数类型的指针，它所指向的函数具有int*类型的形参，返回值类型为int。</p>
		<p>
				<br />int (*(*func)[5])(int *p);</p>
		<p>func被一个圆括号包含，左边又有一个*，那么func是一个指针，跳出括号，右边是一个[]运算符号，说明func是一个指向数组的指针，现在往左看，左边有一个*号，说明这个数组的元素是指针，再跳出括号，右边又有一个括号，说明这个数组的元素是指向函数的指针。总结一下，就是：func是一个指向数组的指针，这个数组的元素是函数指针，这些指针指向具有int*形参，返回值为int类型的函数。</p>
		<p>int (*(*func)(int *p))[5];</p>
		<p>func是一个函数指针，这类函数具有int*类型的形参，返回值是指向数组的指针，所指向的数组的元素是具有5个int元素的数组。</p>
		<p>要注意有些复杂指针声明是非法的，例如：</p>
		<p>int func(void) [5];</p>
		<p>func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组，这是因为如果允许函数返回值为数组，那么接收这个数组的内容的东西，也必须是一个数组，但C语言的数组名是一个右值，它不能作为左值来接收另一个数组，因此函数返回值不能为数组。</p>
		<p>int func[5](void);</p>
		<p>func是一个具有5个元素的数组，这个数组的元素都是函数。这也是非法的，因为数组的元素除了类型必须一样外，每个元素所占用的内存空间也必须相同，显然函数是无法达到这个要求的，即使函数的类型一样，但函数所占用的空间通常是不相同的。</p>
		<p>作为练习，下面列几个复杂指针声明给读者自己来解析，答案放在第十章里。</p>
		<p>int (*(*func)[5][6])[7][8];</p>
		<p>int (*(*(*func)(int *))[5])(int *);</p>
		<p>int (*(*func[7][8][9])(int*))[5];</p>
		<p>        实际当中，需要声明一个复杂指针时，如果把整个声明写成上面所示的形式，对程序可读性是一大损害。应该用typedef来对声明逐层分解，增强可读性，例如对于声明：</p>
		<p>int (*(*func)(int *p))[5];</p>
		<p>可以这样分解：</p>
		<p>typedef  int (*PARA)[5];<br />typedef PARA (*func)(int *);</p>
		<p>这样就容易看得多了。</p>
<img src ="http://www.cppblog.com/horsetail/aggbug/17810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/horsetail/" target="_blank">[HORSETAIL]</a> 2007-01-20 13:17 <a href="http://www.cppblog.com/horsetail/articles/17810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>