C++学习笔记(3)
2010-04-13 18:33
218 查看
最近在写code时候,发现了关于static变量的一些使用需要注意的地方。具体的情况可以看下面的例子:
Aclass.h // 声明了Aclass
class Aclass {
public:
Aclass() { data = 100; }
int data;
};
Aclass.cpp // 定义了一个static的Aclass实例
#include "Aclass.h"
static Aclass a;
Bclass.h // 声明了Bclass
class Bclass {
Bclass()
{
data = a.data;
}
int data;
};
Bclass.h // 定义了Bclass的一个静态变量
#include "Bclass.h"
#include "Aclass.h"
static Bclass b;
就像以上代码上面这样,在编译在最终代码之后,在调用获得b的时候,并不能保证a此时已经被初始化,所以此时b.data的值是未知的。这里的问题是因为在一个static的代码里面调用了不被包含(Aclass.cpp)初始化过程的static变量,这个变量的初始化在另外的源文件里面。
在编译的时候,这样的代码并不会报错,但是在运行的时候有一半的机会会出现出现,只有在编译的最终代码里面,a的初始化代码恰巧在foo()的定义前面,这样才会正常运行。
这个我是参考了这个faq的资料:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12
里面还有说明解决的方案。
Aclass.h // 声明了Aclass
class Aclass {
public:
Aclass() { data = 100; }
int data;
};
Aclass.cpp // 定义了一个static的Aclass实例
#include "Aclass.h"
static Aclass a;
Bclass.h // 声明了Bclass
class Bclass {
Bclass()
{
data = a.data;
}
int data;
};
Bclass.h // 定义了Bclass的一个静态变量
#include "Bclass.h"
#include "Aclass.h"
static Bclass b;
就像以上代码上面这样,在编译在最终代码之后,在调用获得b的时候,并不能保证a此时已经被初始化,所以此时b.data的值是未知的。这里的问题是因为在一个static的代码里面调用了不被包含(Aclass.cpp)初始化过程的static变量,这个变量的初始化在另外的源文件里面。
在编译的时候,这样的代码并不会报错,但是在运行的时候有一半的机会会出现出现,只有在编译的最终代码里面,a的初始化代码恰巧在foo()的定义前面,这样才会正常运行。
这个我是参考了这个faq的资料:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12
里面还有说明解决的方案。
相关文章推荐
- C++学习笔记-00
- C++基础学习笔记----第十四课(new和malloc的区别、单例模式等深入)
- c++学习笔记(5):C++ typename的起源与用法
- C++学习笔记 lesson7 static
- C++学习笔记--初始化列表
- 【C++ 学习笔记】 MFC CEdit
- 【C++】【学习笔记】向自定类中添加 combine 和 isbn 成员
- C++学习笔记——第11章 运算符法重载
- C++学习笔记4——类的封装(2)
- C++学习笔记---基本内置类型
- C++ 学习笔记(一些新特性总结 1)
- 【C++学习笔记】结构简介
- C++学习笔记——输入与输出
- C/C++中关于地址、指针和引用变量的学习笔记(七) : sizeof和typedef
- C++学习笔记(三)补充篇 计算机网络基础 — 参考慕课网
- C++ 学习笔记(一些新特性总结 2)
- “Effective C++ Third Edition”学习笔记(三)
- C++学习笔记-----operator=函数处理自赋值
- C++学习笔记60——模板编译模型
- C++学习笔记3:内存模型和名称空间