如何在C ++类模板中使用静态变量

时间:2016-02-24 05:39:05

标签: c++ templates static

这是一个来自geeksforgeeks的例子。我不理解以下代码。

template<class T> int Test<T>::count = 0;

算一个外部变量吗?为什么不让static int count = 0? geeksforgeeks中的描述和代码如下所示。

  

类模板和静态变量:类模板的规则是   与函数模板相同类模板的每个实例都有   它自己的成员静态变量副本。例如,在下面   程序有两个实例测试和测试。所以静态的两个副本   存在变量计数。

#include <iostream>

using namespace std;

template <class T> class Test
{  
private:
  T val; 
public:
  static int count;
  Test()
  {
    count++;
  }
  // some other stuff in class
};

template<class T>
int Test<T>::count = 0;

int main()
{
  Test<int> a;  // value of count for Test<int> is 1 now
  Test<int> b;  // value of count for Test<int> is 2 now
  Test<double> c;  // value of count for Test<double> is 1 now
  cout << Test<int>::count   << endl;  // prints 2  
  cout << Test<double>::count << endl; //prints 1

  getchar();
  return 0;
}

3 个答案:

答案 0 :(得分:2)

每次使用新类型实例化Test对象时,都会为您创建一个可用模板的新类。 (因此,在您的情况下,编译器会根据您的要求创建Test<int>Test<double>个类。您现在可以将Test<int>Test<double>视为从同一模板创建的2个单独的类。

因为有两个类,所以在不同的范围内有两个具有相同名称的静态变量副本。 template<class T> int Test<T>::count = 0;是在按需创建的类中定义此count的模板。

如果您将此定义专门用于某种类型,例如:

template<>
int Test<int>::count = 5;
打印时,

Test<int>::count7。虽然Test<double>::count将保持1(不变)。

答案 1 :(得分:1)

count不是外部变量。之所以在类之外是因为需要分配变量(并且可能是实例化的)。当一个静态变量在一个类定义中时,它只告诉编译器&#34;将会有这种变量&#34;但由于定义可能包含在许多源文件中,因此编译器不会进行任何分配。

当编译器看到外部定义时,它知道为它分配空间并在它是对象时实例化它。这可能只发生一次,因此它不能在头文件中。

答案 2 :(得分:1)

Class Test是一个模板类,这意味着每次遇到使用不同类型实例化Test的代码时,编译器都会生成不同的代码。

Count不是外部变量;它是一个静态变量。

其容器类的所有实例共享一个静态变量实例。

这里的扭曲是Test是一个模板类,所以实际上并没有一个“类测试”。有两种:main()函数会使编译器生成“class Test”和“class Test”。

如上所述,静态变量由其容器类的所有实例共享。还要注意,有两种生成类型的Test(int和double)。因为count是一个静态变量,这意味着需要有一个count 每个类型 of Test的实例。因此编译器将生成:

int Test<int>::count = 0;

int Test<double>::count = 0;

请记住,模板的目的是您编写一次代码并依赖编译器为使用该模板的所有不同数据类型生成代码。