如何为相同/不同的数据类型跟踪静态变量

how static variable are tracked for same / different data types

本文关键字:数据类型 跟踪 静态 变量      更新时间:2023-10-16

下面的类Test有一个静态变量count,它在创建类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;  
  Test<int> b;  
  Test<double> c;  
  cout << Test<int>::count   << endl;  // prints 2  
  cout << Test<double>::count << endl; //prints 1
  getchar();
  return 0;
}

输出:21

我猜有两个实例Test和Test(同时调用Test和Test)。但是我想知道为什么int和double有两个实例,因为有两种不同的类型??如果是这样,如何为不同的数据类型和相同的数据类型跟踪计数变量??这可能是一个简单的问题,但我只是想知道它背后的基本过程。

是的,你得到一个实例:

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

对于每种类型的T。当然还有一个实例化的

  Test()
  {
    count++;
  }

想象你添加了:

  Test()
  {
    val = 0;
    count++;
  }

你马上就会明白为什么每个类型都必须有另一个函数。Test<int>Test<double>是不同的类别。

每个count变量的全称为:

Test<int>::count
Test<double>::count

编译器将分别"mangle"成count_Test$i_icount_Test$D_i(我只是编的,它可能在现实中完全不同)

由于Test<int>Test<double>是不同的类型。

类模板定义了相关类型的无界集合的布局和操作

是。Test有两种不同的类型。一种是基于int: Test<int>。另一种是基于double: Test<double> .

可以假设有两个Test类:

class Test_int // Test<int>
{  
private:
  int val; 
//...
class Test_double // Test<double>
{  
private:
  double val; 
//...

你有两个不同的类

每个指定的类模板是不同的类类型。
因此,Test<int>是不同于Test<double>的类类型的类名。

编译器为这些类中的每一个生成单独的代码,因此生成两个不同的静态变量。

还有,它将为包含头文件的每个编译单元创建代码(因为代码将被"注入"到需要的地方)。

因此,如果您将它打印在两个不同的.cpp文件中的两个不同的类中,您将看到每个编译单元都有不同的计数器,即使对于相同的模板化类类型也是如此。