KS.luolE `s Programming Blog && Brainstorms and Raves

C++, DirectX, Unreal Engine, 3D Game Development, Lua&Python...
随笔 - 3, 文章 - 0, 评论 - 1, 引用 - 0
数据加载中……

2011年7月12日

一个 C++ 静态成员变量的初始化问题

前几天在逛论坛的时候看到一篇别人问的帖子,说的是静态成员变量的初始化顺序问题。
当时没有细看,后来仔细想想也没有想得很明白,大致回忆了一下,先贴出来给大家看看……

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class ClassA {
 6 public:
 7     ClassA():m_nNum(5) {
 8         cout << "Member Val:" << m_nNum << endl;
 9         cout << "ClassA Constructor!" << endl;
10     }
11     void Func() {
12         cout << "Member Val:" << m_nNum << endl;
13         cout << "ClassA Func() Called!" << endl;
14     }
15     int m_nNum;
16 };
17 
18 class ClassB {
19 public:
20     ClassB() {
21         cout << "Class B Constructor! " << endl;
22         s_A.Func();
23     }
24 
25 protected:
26     static ClassA s_A;
27 };
28 
29 ClassB TestClass;
30 ClassA ClassB::s_A;
31 
32 
33 int main(int argc, char *argv[])
34 {
35     system( "PAUSE ");
36     return 0;
37 }
38 

这段代码就是讲的在ClassB中有一个静态成员变量ClassA s_A,ClassB在构造时会调用ClassB::s_A的Func()方法.
但是后面在初始化ClassB::s_A时,却把初始化的位置写在了一个ClassB的实例之后.
并且程序能够正常的通过编译并运行。输出结果如下:

Class B Constructor! 
Member Val:
0
ClassA Func() Called
!
Member Val:
5
ClassA Constructor
!

让我不理解的是,在没有初始化静态成员变量之前,ClassB是如何能正常调用ClassB::s_A的Func()方法呢?
最后个人得出的答案是:
在程序编译"ClassA ClassB::m_cA;" 时就已经对ClassB::s_A分配了空间
(以至于ClassB::s_A.Func()在读取成员变量m_nNum时能正确的找到位置不至于报错)
但是因为不是内置类型,所以只有等到运行时再来调用构造函数来进行初始化.

实际上,在全局对象TestClass定义时调用ClassB::s_A.Func()和跟下面代码类似:

 1 class ClassA {
 2 public:
 3     void Func() {
 4         cout << "ClassA Func() Called!" << endl;
 5     }
 6 };
 7 
 8 int main(int argc, char *argv[])
 9 {
10     ClassA * pFunc = NULL;
11     pFunc->Func();
12 
13     system( "PAUSE ");
14     return 0;
15 }
16 

这里因为没有涉及成员变量的访问,所以不会因为访问错误的内存地址而报错. 之前的例子因为编译时已为ClassB::s_A分配了空间,这使在没有初始化ClassB::s_A之前访问Func()方法不会有问题,因为能够正确找到成员变量的地址.


 以上就是个人得出的已经结论,不过回头还得再看看<Inside The C++ Object Model>中能否找到具体的依据。在此也希望各位牛人对此有任何看法能指点一二!

posted @ 2011-07-12 11:20 KS.luolE 阅读(960) | 评论 (1)编辑 收藏

2010年2月17日

[转载]如何加密/混乱C源代码

     摘要: 之前发表了《6个变态的C语言Hello World程序》主要是是像大家展示了一些C语言的变态玩法。也向大家展示了一下程序是可以写得让人看不懂的,在那篇文章中,可以看到很多人的留言,很多人都觉得很好玩,是的,那本来是用来供朋友们“消遣作乐”,供娱乐娱东而已,不必太过认真。 不过,通过这种极端的写法,大家可以看到源代码都可以写得那么复杂难懂的。大家也许在赞叹之余一笑了之,而我...  阅读全文

posted @ 2010-02-17 03:14 KS.luolE 阅读(408) | 评论 (0)编辑 收藏

2009年12月10日

[转载]程序员面对分歧和难题应当具备的态度

原文出处:http://www.cnblogs.com/effulgent/archive/2009/12/08/1619413.html

能力不是最重要的,态度才是决定因素。程序员由于幼年受虐,缺乏异性关爱,以及鲜与人类交流等特殊原因,滋生了很多心理疾病,点一盏明灯,照亮这些阴暗角落,愿大家健康茁壮成长。


1、在没有能力之前,不要过分追求代码完美,完成全部功能才是目标。写完美代码的关键,是对问题有没有完美深入的理解,而不是什么设计模式。

2、发表意见前,请三思,对没有做过的工作,千万不要说“这个很简单,XX一下就好了”,既然这样那你自己去XX吧。

3、不要轻易否定其他同事的工作成果,特别是有多年工作经验的同仁,最忌讳推倒重来,除非自己真的具备完整经验,否则自己就是下一个被别人推倒的人。

4、多学习专业知识。比如图形、AI、机械、企业管理等。毕竟代码只是这些专业知识的实现载体。很多微电子专业的人写的媒体播放器比计算机专业的好,而数学专业的人写的编译器比计算机专业的强。

5、忌讳自我感觉过于良好。自信和自大,奋进和激进仅一线之隔,不要失去理智。

6、用合适的方法解决问题,问题有多大,解决方案就有多大,千万别嫌弃别人方法土,人家很土,但很靠谱。

posted @ 2009-12-10 09:50 KS.luolE 阅读(169) | 评论 (0)编辑 收藏