在C++中初始化静态成员
问题描述:
从我所了解的情况来看,你在.cpp文件中初始化一个静态成员而不是在.h中的原因是这样就没有风险去获得该成员的多个实例。在C++中初始化静态成员
//Foo.h
#ifndef FOO_H
#define FOO_H
class Foo{
static int a;
};
int Foo::a = 95;
#endif
预处理指令确保这个.h文件只编译一次,这确保只有一个静态成员的实例。这是可能的,而不是启动.cpp文件中的静态成员?
答
考虑有两个源代码文件,a.cpp
和b.cpp
,都包含头。由于它们是彼此独立编译的,所以标头守卫将不起作用,您将以两个对象文件a.o
和b.o
即均为定义Foo:a
结束。尝试将它们连接在一起将会失败。
答
不,它只能确保每个编译单元(.cpp
文件)包含Foo.h
一次。不在整个项目中。你应该定义静态成员中Foo.cpp
答
这将导致链接错误,如果头被包含在多个.cpp
文件(翻译单元):
//a.cpp
#include <Foo.h>
//b.cpp
#include <Foo.h>
编译后,a.obj
包含Foo::a
和b.obj
定义包含Foo::b
的定义。如果试图将这两个文件链接成单个二进制文件,将会发生多重定义错误。
答
不,包含的警卫确保每个编译单元最多包含一个标头。如果你的程序有多个编译单元(.cpp
文件),包括头文件,那么你将最终得到Foo::a
的多个定义。
.h文件根本不编译。 Foo_H设置为Foo.h不会被多次包含 – Andrew 2012-07-06 11:05:31
[Static Data Member Initialization]的可能重复(http://*.com/questions/11300652/static-data-member-initialization) – dasblinkenlight 2012-07-06 11:11:03