﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++学习录</title><link>http://www.cppblog.com/cm2004/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 21:44:54 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 21:44:54 GMT</pubDate><ttl>60</ttl><item><title>类的申明，以及成员函数的两种表达方式～</title><link>http://www.cppblog.com/cm2004/archive/2006/04/24/6118.html</link><dc:creator>贫下中农</dc:creator><author>贫下中农</author><pubDate>Sun, 23 Apr 2006 23:06:00 GMT</pubDate><guid>http://www.cppblog.com/cm2004/archive/2006/04/24/6118.html</guid><wfw:comment>http://www.cppblog.com/cm2004/comments/6118.html</wfw:comment><comments>http://www.cppblog.com/cm2004/archive/2006/04/24/6118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cm2004/comments/commentRss/6118.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cm2004/services/trackbacks/6118.html</trackback:ping><description><![CDATA[
		<p>//类的声明形式<br />class 类名称<br />{<br />public:<br /> 共有成员（外部接口）<br />private:<br /> 私有成员<br />protected:<br /> 保护型成员<br />};</p>
		<p>成员函数的两种表达式<br />NO1<br />class Clock<br />{<br />public:<br /> void settime(int hour,int min,int sec)<br /> {<br />  int Newhour,Newmin,Newsec;<br />  Newhour=hour;<br />  Newmin=min;<br />  Newsec=sec;<br /> }<br />};</p>
		<p>//NO2<br />class Clock<br />{<br />public:<br /> void settime(int hour,int min,int sec);<br />};</p>
		<p>void Clock::settime(int hour, int min, int sec)<br />{<br /> int Newhour,Newmin,Newsec;<br /> Newhour=hour;<br /> Newmin=min;<br /> Newsec=sec;<br />}</p>
<img src ="http://www.cppblog.com/cm2004/aggbug/6118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cm2004/" target="_blank">贫下中农</a> 2006-04-24 07:06 <a href="http://www.cppblog.com/cm2004/archive/2006/04/24/6118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>for循环次数 </title><link>http://www.cppblog.com/cm2004/archive/2006/04/24/6117.html</link><dc:creator>贫下中农</dc:creator><author>贫下中农</author><pubDate>Sun, 23 Apr 2006 23:06:00 GMT</pubDate><guid>http://www.cppblog.com/cm2004/archive/2006/04/24/6117.html</guid><wfw:comment>http://www.cppblog.com/cm2004/comments/6117.html</wfw:comment><comments>http://www.cppblog.com/cm2004/archive/2006/04/24/6117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cm2004/comments/commentRss/6117.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cm2004/services/trackbacks/6117.html</trackback:ping><description><![CDATA[
		<p>//循环4次<br />int main()<br />{<br /> int x(0),<font color="#ff0000">y(0);</font><br /> for(;(y!=123)&amp;&amp;(x&lt;4);x++)<br />  cout&lt;&lt;"1111\n";<br /> return 0;</p>
		<p>}</p>
		<p>//循环0次<br />int main()<br />{<br /> int x(0),y(<font color="#ff0000">123</font>);<br /> for(;(y!=123)&amp;&amp;(x&lt;4);x++)<br />  cout&lt;&lt;"1111\n";<br /> return 0;</p>
		<p>}</p>
		<p>//循环1次<br />int main()<br />{<br /> int x(0),y(0);<br /> for(;(y!=123)&amp;&amp;(x&lt;4);x++)<br />  y=123;<br />  cout&lt;&lt;"1111\n";<br /> return 0;</p>
		<p>}<br /><br /><br />当y!=123)&amp;&amp;(x&lt;4）为假时（逻辑与，任意条件为假，就判断逻辑与为假）就中止循环</p>
<img src ="http://www.cppblog.com/cm2004/aggbug/6117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cm2004/" target="_blank">贫下中农</a> 2006-04-24 07:06 <a href="http://www.cppblog.com/cm2004/archive/2006/04/24/6117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>static用法小结 </title><link>http://www.cppblog.com/cm2004/archive/2006/04/24/6116.html</link><dc:creator>贫下中农</dc:creator><author>贫下中农</author><pubDate>Sun, 23 Apr 2006 23:05:00 GMT</pubDate><guid>http://www.cppblog.com/cm2004/archive/2006/04/24/6116.html</guid><wfw:comment>http://www.cppblog.com/cm2004/comments/6116.html</wfw:comment><comments>http://www.cppblog.com/cm2004/archive/2006/04/24/6116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cm2004/comments/commentRss/6116.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cm2004/services/trackbacks/6116.html</trackback:ping><description><![CDATA[
		<p>  static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).<br />(1)局部静态变量<br />(2)外部静态变量/函数<br />(3)静态数据成员/成员函数<br />下面就这三种使用方式及注意事项分别说明</p>
		<p>一、局部静态变量<br />在C/C++中, 局部变量按照存储形式可分为三种auto, static, register<br />(&lt;C语言程序设计(第二版)&gt;谭浩强, 第174-175页)<br />与auto类型(普通)局部变量相比, static局部变量有三点不同<br />1. 存储空间分配不同<br />auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调用结束后自动释放, 而static分配在静态存储区, 在程序整个运行期间都不释放. 两者之间的作用域相同, 但生存期不同.<br />2. static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次<br />3. 对于局部静态变量, 如果不赋初值, 编译期会自动赋初值0或空字符, 而auto类型的初值是不确定的. (对于C++中的class对象例外, class的对象实例如果不初始化, 则会自动调用默认构造函数, 不管是否是static类型)</p>
		<p>特点: static局部变量的”记忆性”与生存期的”全局性”<br />所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值. <br />示例程序一<br />#include &lt;iostream&gt;</p>
		<p>using namespace std;</p>
		<p>void staticLocalVar()<br />{<br /> static int a = 0; // 运行期时初始化一次, 下次再调用时, 不进行初始化工作<br /> cout&lt;&lt;"a="&lt;&lt;a&lt;&lt;endl;<br /> ++a;<br />}</p>
		<p>int main()<br />{<br /> staticLocalVar(); // 第一次调用, 输出a=0<br /> staticLocalVar(); // 第二次调用, 记忆了第一次退出时的值, 输出a=1<br /> return 0;<br />}</p>
		<p>应用:<br /> 利用”记忆性”, 记录函数调用的次数(示例程序一)<br />   利用生存期的”全局性”, 改善”return a pointer / reference to a local object”的问题. Local object的问题在于退出函数, 生存期即结束,. 利用static的作用, 延长变量的生存期.<br />示例程序二:<br />// IP address to string format<br />// Used in Ethernet Frame and IP Header analysis<br />const char * IpToStr(UINT32 IpAddr)<br />{<br /> static char strBuff[16]; // static局部变量, 用于返回地址有效<br /> const unsigned char *pChIP = (const unsigned char *)&amp;IpAddr;<br /> sprintf(strBuff, "%u.%u.%u.%u",  pChIP[0], pChIP[1], pChIP[2], pChIP[3]);<br /> return strBuff;<br />}</p>
		<p>注意事项:<br />1. “记忆性”, 程序运行很重要的一点就是可重复性, 而static变量的”记忆性”破坏了这种可重复性, 造成不同时刻至运行的结果可能不同.<br />2. “生存期”全局性和唯一性. 普通的local变量的存储空间分配在stack上, 因此每次调用函数时, 分配的空间都可能不一样, 而static具有全局唯一性的特点, 每次调用时, 都指向同一块内存, 这就造成一个很重要的问题 ---- 不可重入性!!!<br />这样在多线程程序设计或递归程序设计中, 要特别注意这个问题.<br />(不可重入性的例子可以参见&lt;effective C++ (2nd)&gt;(影印版)第103-105页)<br />下面针对示例程序二, 分析在多线程情况下的不安全性.(为方便描述, 标上行号)<br />① const char * IpToStr(UINT32 IpAddr)<br />② {<br />③  static char strBuff[16]; // static局部变量, 用于返回地址有效<br />④  const unsigned char *pChIP = (const unsigned char *)&amp;IpAddr;<br />⑤  sprintf(strBuff, "%u.%u.%u.%u",  pChIP[0], pChIP[1], pChIP[2], pChIP[3]);<br />⑥  return strBuff;<br />⑦ }<br />假设现在有两个线程A,B运行期间都需要调用IpToStr()函数, 将32位的IP地址转换成点分10进制的字符串形式. 现A先获得执行机会, 执行IpToStr(), 传入的参数是0x0B090A0A, 顺序执行完应该返回的指针存储区内容是:”10.10.9.11”, 现执行到⑥时, 失去执行权, 调度到B线程执行, B线程传入的参数是0xA8A8A8C0, 执行至⑦, 静态存储区的内容是192.168.168.168. 当再调度到A执行时, 从⑥继续执行, 由于strBuff的全局唯一性, 内容已经被B线程冲掉, 此时返回的将是192.168.168.168字符串, 不再是10.10.9.11字符串.</p>
		<p>二、外部静态变量／函数<br />在C中static有了第二种含义：用来表示不能被其它文件访问的全局变量和函数。, 但为了限制全局变量/函数的作用域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式，而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区, 生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部.<br />使用内部函数的好处是：不同的人编写不同的函数时，不用担心自己定义的函数，是否会与其它文件中的函数同名。<br />示例程序三:<br /> <br />//file1.cpp</p>
		<p>static int varA;<br />int varB;<br />extern void funA()<br />{<br />……<br />}</p>
		<p>static void funB()<br />{<br />……<br />}</p>
		<p>//file2.cpp</p>
		<p>extern int varB; // 使用file1.cpp中定义的全局变量<br />extern int varA; // 错误! varA是static类型, 无法在其他文件中使用<br />extern vod funA(); // 使用file1.cpp中定义的函数<br />extern void funB(); // 错误! 无法使用file1.cpp文件中static函数</p>
		<p> </p>
		<p>三、静态数据成员／成员函数(C++特有)<br />C++重用了这个关键字，并赋予它与前面不同的第三种含义：表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员函数的最大区别, 也是其应用所在, 比如在对某一个类的对象进行计数时, 计数生成多少个类的实例, 就可以用到静态数据成员. 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用, 而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和函数”的含义. 因为它是对整个类来说是唯一的, 因此不可能属于某一个实例对象的. (针对静态数据成员而言, 成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )<br />请看示例程序四(&lt;effective c++ (2nd)&gt;(影印版)第59页)<br />class EnemyTarget {<br />public:<br />  EnemyTarget() { ++numTargets; }<br />  EnemyTarget(const EnemyTarget&amp;) { ++numTargets; }<br />  ~EnemyTarget() { --numTargets; }<br />  static size_t numberOfTargets() { return numTargets; }<br />  bool destroy();   // returns success of attempt to destroy EnemyTarget object<br />private:<br />  static size_t numTargets;               // object counter<br />};<br />// class statics must be defined outside the class;<br />// initialization is to 0 by default<br />size_t EnemyTarget::numTargets;</p>
		<p>在这个例子中, 静态数据成员numTargets就是用来计数产生的对象个数的.<br />另外, 在设计类的多线程操作时, 由于POSIX库下的线程函数pthread_create()要求是全局的, 普通成员函数无法直接做为线程函数, 可以考虑用Static成员函数做线程函数.</p>
<img src ="http://www.cppblog.com/cm2004/aggbug/6116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cm2004/" target="_blank">贫下中农</a> 2006-04-24 07:05 <a href="http://www.cppblog.com/cm2004/archive/2006/04/24/6116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++头文件一览</title><link>http://www.cppblog.com/cm2004/archive/2006/04/24/6115.html</link><dc:creator>贫下中农</dc:creator><author>贫下中农</author><pubDate>Sun, 23 Apr 2006 23:04:00 GMT</pubDate><guid>http://www.cppblog.com/cm2004/archive/2006/04/24/6115.html</guid><wfw:comment>http://www.cppblog.com/cm2004/comments/6115.html</wfw:comment><comments>http://www.cppblog.com/cm2004/archive/2006/04/24/6115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cm2004/comments/commentRss/6115.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cm2004/services/trackbacks/6115.html</trackback:ping><description><![CDATA[C、传统 C++
<p>#include &lt;assert.h&gt;　　　　//设定插入点<br />#include &lt;ctype.h&gt;　　　　 //字符处理<br />#include &lt;errno.h&gt;　　　　 //定义错误码<br />#include &lt;float.h&gt;　　　　 //浮点数处理<br />#include &lt;fstream.h&gt;　　　 //文件输入／输出<br />#include &lt;iomanip.h&gt;　　　 //参数化输入／输出<br />#include &lt;iostream.h&gt;　　　//数据流输入／输出<br />#include &lt;limits.h&gt;　　　　//定义各种数据类型最值常量<br />#include &lt;locale.h&gt;　　　　//定义本地化函数<br />#include &lt;math.h&gt;　　　　　//定义数学函数<br />#include &lt;stdio.h&gt;　　　　 //定义输入／输出函数<br />#include &lt;stdlib.h&gt;　　　　//定义杂项函数及内存分配函数<br />#include &lt;string.h&gt;　　　　//字符串处理<br />#include &lt;strstrea.h&gt;　　　//基于数组的输入／输出<br />#include &lt;time.h&gt;　　　　　//定义关于时间的函数<br />#include &lt;wchar.h&gt;　　　　 //宽字符处理及输入／输出<br />#include &lt;wctype.h&gt;　　　　//宽字符分类</p><p>//////////////////////////////////////////////////////////////////////////</p><p>标准 C++　（同上的不再注释）</p><p>#include &lt;algorithm&gt;　　　 //STL 通用算法<br />#include &lt;bitset&gt;　　　　　//STL 位集容器<br />#include &lt;cctype&gt;<br />#include &lt;cerrno&gt;<br />#include &lt;clocale&gt;<br />#include &lt;cmath&gt;<br />#include &lt;complex&gt;　　　　 //复数类<br />#include &lt;cstdio&gt;<br />#include &lt;cstdlib&gt;<br />#include &lt;cstring&gt;<br />#include &lt;ctime&gt;<br />#include &lt;deque&gt;　　　　　 //STL 双端队列容器<br />#include &lt;exception&gt;　　　 //异常处理类<br />#include &lt;fstream&gt;<br />#include &lt;functional&gt;　　　//STL 定义运算函数（代替运算符）<br />#include &lt;limits&gt;<br />#include &lt;list&gt;　　　　　　//STL 线性列表容器<br />#include &lt;map&gt;　　　　　　 //STL 映射容器<br />#include &lt;iomanip&gt;<br />#include &lt;ios&gt;　　　　　　 //基本输入／输出支持<br />#include &lt;iosfwd&gt;　　　　　//输入／输出系统使用的前置声明<br />#include &lt;iostream&gt;<br />#include &lt;istream&gt;　　　　 //基本输入流<br />#include &lt;ostream&gt;　　　　 //基本输出流<br />#include &lt;queue&gt;　　　　　 //STL 队列容器<br />#include &lt;set&gt;　　　　　　 //STL 集合容器<br />#include &lt;sstream&gt;　　　　 //基于字符串的流<br />#include &lt;stack&gt;　　　　　 //STL 堆栈容器　　　　<br />#include &lt;stdexcept&gt;　　　 //标准异常类<br />#include &lt;streambuf&gt;　　　 //底层输入／输出支持<br />#include &lt;string&gt;　　　　　//字符串类<br />#include &lt;utility&gt;　　　　 //STL 通用模板类<br />#include &lt;vector&gt;　　　　　//STL 动态数组容器<br />#include &lt;cwchar&gt;<br />#include &lt;cwctype&gt;</p><p>using namespace std;</p><p>//////////////////////////////////////////////////////////////////////////</p><p>C99 增加</p><p>#include &lt;complex.h&gt;　　 //复数处理<br />#include &lt;fenv.h&gt;　　　　//浮点环境<br />#include &lt;inttypes.h&gt;　　//整数格式转换<br />#include &lt;stdbool.h&gt;　　 //布尔环境<br />#include &lt;stdint.h&gt;　　　//整型环境<br />#include &lt;tgmath.h&gt;　　　//通用类型数学宏<br /></p><img src ="http://www.cppblog.com/cm2004/aggbug/6115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cm2004/" target="_blank">贫下中农</a> 2006-04-24 07:04 <a href="http://www.cppblog.com/cm2004/archive/2006/04/24/6115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华为软件编程规范和范例</title><link>http://www.cppblog.com/cm2004/archive/2006/04/23/6113.html</link><dc:creator>贫下中农</dc:creator><author>贫下中农</author><pubDate>Sun, 23 Apr 2006 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/cm2004/archive/2006/04/23/6113.html</guid><wfw:comment>http://www.cppblog.com/cm2004/comments/6113.html</wfw:comment><comments>http://www.cppblog.com/cm2004/archive/2006/04/23/6113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cm2004/comments/commentRss/6113.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cm2004/services/trackbacks/6113.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [ 										华为软件编程规范和范例 ]												 														 																																				〔一〕=====[排版] ]=======																																						...&nbsp;&nbsp;<a href='http://www.cppblog.com/cm2004/archive/2006/04/23/6113.html'>阅读全文</a><img src ="http://www.cppblog.com/cm2004/aggbug/6113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cm2004/" target="_blank">贫下中农</a> 2006-04-23 23:24 <a href="http://www.cppblog.com/cm2004/archive/2006/04/23/6113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>