﻿<?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++博客-KS.luolE `s Programming Blog &amp;&amp; Brainstorms and Raves</title><link>http://www.cppblog.com/cqluole/</link><description>    C++, DirectX, Unreal Engine, 3D Game Development, Lua&amp;Python...</description><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:08:46 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:08:46 GMT</pubDate><ttl>60</ttl><item><title>一个 C++ 静态成员变量的初始化问题</title><link>http://www.cppblog.com/cqluole/archive/2011/07/12/150741.html</link><dc:creator>KS.luolE</dc:creator><author>KS.luolE</author><pubDate>Tue, 12 Jul 2011 03:20:00 GMT</pubDate><guid>http://www.cppblog.com/cqluole/archive/2011/07/12/150741.html</guid><wfw:comment>http://www.cppblog.com/cqluole/comments/150741.html</wfw:comment><comments>http://www.cppblog.com/cqluole/archive/2011/07/12/150741.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cqluole/comments/commentRss/150741.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cqluole/services/trackbacks/150741.html</trackback:ping><description><![CDATA[<div>前几天在逛论坛的时候看到一篇别人问的帖子,说的是静态成员变量的初始化顺序问题。<br />当时没有细看，后来仔细想想也没有想得很明白，大致回忆了一下，先贴出来给大家看看&#8230;&#8230; <br /><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<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 /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"></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 /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ClassA&nbsp;{<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ClassA():m_nNum(</span><span style="color: #000000">5</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Member&nbsp;Val:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;m_nNum&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ClassA&nbsp;Constructor!</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func()&nbsp;{<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Member&nbsp;Val:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;m_nNum&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ClassA&nbsp;Func()&nbsp;Called!</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m_nNum;<br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">};<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ClassB&nbsp;{<br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ClassB()&nbsp;{<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Class&nbsp;B&nbsp;Constructor!&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_A.Func();<br /></span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">protected</span><span style="color: #000000">:<br /></span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;ClassA&nbsp;s_A;<br /></span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">};<br /></span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">ClassB&nbsp;TestClass;<br /></span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">ClassA&nbsp;ClassB::s_A;<br /></span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">argv[])<br /></span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;system(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">PAUSE&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000">&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 /></span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">38</span>&nbsp;<span style="color: #000000"></span></div><br />这段代码就是讲的在ClassB中有一个静态成员变量ClassA s_A,ClassB在构造时会调用ClassB::s_A的Func()方法.<br />但是后面在初始化ClassB::s_A时,却把初始化的位置写在了一个ClassB的实例之后.<br />并且程序能够正常的通过编译并运行。输出结果如下:<br /><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">Class&nbsp;B&nbsp;Constructor!&nbsp;<br />Member&nbsp;Val:</span><span style="color: #000000">0</span><span style="color: #000000"><br />ClassA&nbsp;Func()&nbsp;Called</span><span style="color: #000000">!</span><span style="color: #000000"><br />Member&nbsp;Val:</span><span style="color: #000000">5</span><span style="color: #000000"><br />ClassA&nbsp;Constructor</span><span style="color: #000000">!</span></div><br />让我不理解的是，在没有初始化静态成员变量之前,ClassB是如何能正常调用ClassB::s_A的Func()方法呢?<br />最后个人得出的答案是:<br />在程序编译"ClassA ClassB::m_cA;" 时就已经对ClassB::s_A分配了空间<br />(以至于ClassB::s_A.Func()在读取成员变量m_nNum时能正确的找到位置不至于报错)<br />但是因为不是内置类型,所以只有等到运行时再来调用构造函数来进行初始化.<br /><br />实际上,在全局对象TestClass定义时调用ClassB::s_A.Func()和跟下面代码类似:<br /><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ClassA&nbsp;{<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Func()&nbsp;{<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ClassA&nbsp;Func()&nbsp;Called!</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">};<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">argv[])<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ClassA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pFunc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pFunc</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Func();<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;system(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">PAUSE&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&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 /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000"></span></div></div><br />这里因为没有涉及成员变量的访问,所以不会因为访问错误的内存地址而报错. 之前的例子因为编译时已为ClassB::s_A分配了空间,这使在没有初始化ClassB::s_A之前访问Func()方法不会有问题,因为能够正确找到成员变量的地址.<br /><br />
<hr />
&nbsp;以上就是个人得出的已经结论，不过回头还得再看看&lt;<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 23px; font-family: simsun; text-align: left">Inside The C++&nbsp;Object Model</span></span>&gt;中能否找到具体的依据。在此也希望各位牛人对此有任何看法能指点一二!<br /><img src ="http://www.cppblog.com/cqluole/aggbug/150741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cqluole/" target="_blank">KS.luolE</a> 2011-07-12 11:20 <a href="http://www.cppblog.com/cqluole/archive/2011/07/12/150741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]如何加密/混乱C源代码</title><link>http://www.cppblog.com/cqluole/archive/2010/02/17/107947.html</link><dc:creator>KS.luolE</dc:creator><author>KS.luolE</author><pubDate>Tue, 16 Feb 2010 19:14:00 GMT</pubDate><guid>http://www.cppblog.com/cqluole/archive/2010/02/17/107947.html</guid><wfw:comment>http://www.cppblog.com/cqluole/comments/107947.html</wfw:comment><comments>http://www.cppblog.com/cqluole/archive/2010/02/17/107947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cqluole/comments/commentRss/107947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cqluole/services/trackbacks/107947.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 之前发表了《6个变态的C语言Hello World程序》主要是是像大家展示了一些C语言的变态玩法。也向大家展示了一下程序是可以写得让人看不懂的，在那篇文章中，可以看到很多人的留言，很多人都觉得很好玩，是的，那本来是用来供朋友们&#8220;消遣作乐&#8221;，供娱乐娱东而已，不必太过认真。不过，通过这种极端的写法，大家可以看到源代码都可以写得那么复杂难懂的。大家也许在赞叹之余一笑了之，而我...&nbsp;&nbsp;<a href='http://www.cppblog.com/cqluole/archive/2010/02/17/107947.html'>阅读全文</a><img src ="http://www.cppblog.com/cqluole/aggbug/107947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cqluole/" target="_blank">KS.luolE</a> 2010-02-17 03:14 <a href="http://www.cppblog.com/cqluole/archive/2010/02/17/107947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]程序员面对分歧和难题应当具备的态度 </title><link>http://www.cppblog.com/cqluole/archive/2009/12/10/102890.html</link><dc:creator>KS.luolE</dc:creator><author>KS.luolE</author><pubDate>Thu, 10 Dec 2009 01:50:00 GMT</pubDate><guid>http://www.cppblog.com/cqluole/archive/2009/12/10/102890.html</guid><wfw:comment>http://www.cppblog.com/cqluole/comments/102890.html</wfw:comment><comments>http://www.cppblog.com/cqluole/archive/2009/12/10/102890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cqluole/comments/commentRss/102890.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cqluole/services/trackbacks/102890.html</trackback:ping><description><![CDATA[<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<p><span style="FONT-SIZE: 10pt">原文出处:http://www.cnblogs.com/effulgent/archive/2009/12/08/1619413.html</span><br><br>能力不是最重要的，态度才是决定因素。程序员由于幼年受虐，缺乏异性关爱，以及鲜与人类交流等特殊原因，滋生了很多心理疾病，点一盏明灯，照亮这些阴暗角落，愿大家健康茁壮成长。</p>
<p><br>1、在没有能力之前，不要过分追求代码完美，完成全部功能才是目标。写完美代码的关键，是对问题有没有完美深入的理解，而不是什么设计模式。<br><br>2、发表意见前，请三思，对没有做过的工作，千万不要说&#8220;这个很简单，XX一下就好了&#8221;，既然这样那你自己去XX吧。<br><br>3、不要轻易否定其他同事的工作成果，特别是有多年工作经验的同仁，最忌讳推倒重来，除非自己真的具备完整经验，否则自己就是下一个被别人推倒的人。<br><br>4、多学习专业知识。比如图形、AI、机械、企业管理等。毕竟代码只是这些专业知识的实现载体。很多微电子专业的人写的媒体播放器比计算机专业的好，而数学专业的人写的编译器比计算机专业的强。<br><br>5、忌讳自我感觉过于良好。自信和自大，奋进和激进仅一线之隔，不要失去理智。<br><br>6、用合适的方法解决问题，问题有多大，解决方案就有多大，千万别嫌弃别人方法土，人家很土，但很靠谱。 <br></p>
</blockquote>
<img src ="http://www.cppblog.com/cqluole/aggbug/102890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cqluole/" target="_blank">KS.luolE</a> 2009-12-10 09:50 <a href="http://www.cppblog.com/cqluole/archive/2009/12/10/102890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>