这是一个来自极客健忘者的例子。我不明白下面的代码。
template<class T> int Test<T>::count = 0;计数是一个外部变量吗?为什么不让静态int计数= 0呢?下面列出了“极客”中的描述和代码。
类模板和静态变量:类模板的规则与函数模板相同,类模板的每个实例化都有自己的成员静态变量副本。例如,在下面的程序中有两个实例测试和测试。因此,存在两个静态变量计数副本。
#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;
}发布于 2016-02-24 05:47:57
每次使用新类型实例化Test对象时,都会从可用模板中为您创建一个新类。(因此,在您的示例中,编译器根据需要为您创建Test<int>和Test<double>类)。现在您可以将Test<int>和Test<double>看作是从同一个模板创建的两个单独的类。
因为有两个类,所以在不同的作用域中有两个名称相同的静态变量的副本。template<class T> int Test<T>::count = 0;是在按需创建的类中定义此count的模板。
如果您将此定义专门用于某些类型,则为ex:
template<>
int Test<int>::count = 5;打印时,Test<int>::count将是7。而Test<double>::count将保持1 (不变)。
发布于 2016-02-24 05:53:35
count不是外部变量。它像这样出现在类之外的原因是因为需要分配变量(可能还需要实例化)。当静态变量在类定义中时,它只告诉编译器“将会有这类变量”,但是由于定义可能包含在许多源文件中,编译器不会进行任何分配。
当编译器看到它知道为其分配空间的外部定义时,如果它是一个对象,则实例化它。这种情况可能只发生一次,因此不能出现在头文件中。
发布于 2016-02-24 05:58:08
类测试是一个模板类,这意味着编译器每次遇到用不同类型实例化测试的代码时都会生成不同的代码。
Count不是外部变量,而是静态变量。
有一个静态变量的实例由其容器类的所有实例共享。
这里的扭曲之处在于Test是一个模板类,所以不只是一个“类测试”。有两个: main()函数将导致编译器生成“类测试”和“类测试”。
如前所述,静态变量由其容器类的所有实例共享。如前所述,有两种生成的类测试类型(int和double)。因为count是一个静态变量,这意味着每个类型的Test需要有一个count实例。因此,编译器将生成以下两种:
int Test<int>::count = 0;和
int Test<double>::count = 0;请记住,模板的目的是只编写一次代码,并依赖编译器为使用该模板的所有不同数据类型生成代码。
https://stackoverflow.com/questions/35594127
复制相似问题