2016-02-24 72 views
3

这是一个从geeksforgeeks中获取的例子。我不明白以下代码。如何在C++类模板中使用静态变量

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

是计数外部变量吗?为什么不让静态int count = 0? 下面列出了geeksforgeeks中的描述和代码。

类模板和静态变量:对于类模板的规则是 相同函数模板类模板的每个实例都有 其成员静态变量的自己的副本。例如,在下面的 程序中有两个实例Test和Test。因此存在两个静态副本 变量计数。

#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; 
} 

回答

2

实例化检测对象与新型每当这时,从现有的模板创建新类为您创建。 (所以在你的情况下,编译器会根据你的需求创建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

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

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

1

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

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

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

这里的扭曲是Test是一个模板类,所以实际上并不只有一个“class Test”。有两个:main()函数将导致编译器生成“class Test”和“class Test”。

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

int Test<int>::count = 0; 

int Test<double>::count = 0; 

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