对于C++类中的静态成员变量 - 初始化在类外部完成.我想知道为什么?对此有任何逻辑推理/约束吗?或者它是纯粹的遗留实现 - 标准不想纠正?
我认为在类中初始化更"直观"而且不那么混乱.它还给出了变量的静态和全局性.例如,如果您看到静态const成员.
我有一个像这样的头文件中定义的模板类.这里我也定义了一个静态变量:
#ifndef TEST1_H_
#define TEST1_H_
void f1();
static int count;
template <class T>
class MyClass
{
public:
void f()
{
++count;
}
};
#endif
Run Code Online (Sandbox Code Playgroud)
我已经在不同的cpp文件中定义了main()函数,如下所示:
int main(int argc, char* argv[])
{
MyClass<int> a;
a.f();
f1();
cout<<"Main:" << count << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在不同的cpp文件中实现了函数f1(),如下所示:
void f1()
{
MyClass<int> a;
a.f();
cout<<"F1: " <<count <<"\n";
}
Run Code Online (Sandbox Code Playgroud)
当我用VC6编译它时,输出为"F1:0 Main:2".这怎么可能?另外,一般情况下,如果我想将静态变量与模板一起使用,我应该如何处理?
我有一个模板函数,可以根据typename传递给它的参数给我一个唯一的 id,如下所示:
template<typename T>
inline std::size_t get_component_type_id() noexcept
{
static_assert(std::is_base_of<Component, T>::value, "T must be of type Component.");
static size_t uniqueComponentId{__INTERNAL__::getUniqueComponentId()};
return uniqueComponentId;
}
Run Code Online (Sandbox Code Playgroud)
当我调用get_component_type_id10BaseClass次时,我得到相同的 id。效果很好。
但是,如果我将子类传递给该函数,我也想获得相同的 id。当我用 调用它时ChildClass,我得到一个不同的 id。这是为什么?