C++:要包含在多个 cpp 文件中的类中的静态变量

C++: static variables in the class to be included in multiple cpp files

本文关键字:文件 变量 静态 cpp 包含 C++      更新时间:2023-10-16
// A.h
class A {
public:
  static int a;
};
int A::a = 0;

如果我尝试在多个.cpp文件中包含A.h,链接将失败并显示multiple definition of A::a.我认为这是有道理的,因为每个.obj文件都包含A::a

但是,我可以使用模板,

// A.h
template<class T>
class A {
public:
  static T a;
};
template<class T>
T A<T>::a = 0;

我现在可以在多个.cpp文件中包含A.h,还可以在一个.cpp文件中分配A<int>::a = 100;的值,并在另一个文件中获得相同的值 A<int>::a.

  • 模板什么时候有这么大的不同?
  • 这个静态变量只有 1 个副本吗?哪个 .obj 将保留此变量?
  • 构造函数是否只调用一次?如果初始值不同,哪一个赢?

模板什么时候有这么大的不同?

总是。我想我不明白这个问题。

这个静态变量只有 1 个副本吗?

对于实例化模板T每种不同类型的最终程序中只有一个副本。

哪个 .obj 将保留此变量?

所有这些都是从实例化模板的翻译单元生成的。然后,链接器选择一个链接并丢弃所有其他链接器。

构造函数是否只调用一次?

每个专业一次。

如果初始值不同,哪一个赢?

这将违反"一个定义规则"。这样的程序格式不正确,不需要诊断。

为什么不在实现class A的 souce 文件中定义静态成员?然后,您应该能够在没有问题的多个源文件中包含A.h

// A.h
class A {
public:
  static int a;
};
// A.cpp
int A::a = 0;