模板函数中使用的静态变量

Ris*_*pta 4 c++ oop templates

我无法理解以下代码的输出:-

#include <iostream>
using namespace std;
template <typename T>
void fun(const T&x){
 static int count = 0;
 cout << "x = " << x << " count = " << count << endl;
 ++count;
 return;
}
int main(){
 fun(1);
 fun('A');
 fun(1.1);
 fun(2.2);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)
Output:-
x = 1 count = 0
x = A count = 0
x = 1.1 count = 0
x = 2.2 count = 1
Run Code Online (Sandbox Code Playgroud)

如果每次调用函数时都将静态变量 count 的值重新分配为 0,那么为什么在第四次调用该函数时它会变为 1。还有一件事,我们不能直接传递“T x”而不是“ const T&x ”吗?

Sam*_*hik 6

当使用显式或推导的模板参数实例化模板时,就好像声明了一个全新的、离散的类或函数。在您的情况下,此模板最终创建了三个函数:

void fun<int>(const int &x)

void fun<char>(const char &x)

void fun<double>(const double &x)
Run Code Online (Sandbox Code Playgroud)

重要的是要了解这些中的每一个都是一个单独的、独立的函数,具有自己的静态count变量。因为它是static,所以它被初始化一次,并且它的值在函数调用中被保留。这就是static变量在函数中的工作方式。

显示的代码调用前两个一次,第三次调用两次。这些是您看到的结果(对第三个函数的第二次调用static count再次增加相同)。


Jos*_*ica 5

C++ 中的模板不像 Java 中那样是通用函数。它们更像是饼干切割机,为用于实例化它们的每种类型创建一个新的特定于类型的函数。您的代码基本上等同于:

#include <iostream>
using namespace std;
void fun_int(const int&x){
 static int count = 0;
 cout << "x = " << x << " count = " << count << endl;
 ++count;
 return;
}
void fun_char(const char&x){
 static int count = 0;
 cout << "x = " << x << " count = " << count << endl;
 ++count;
 return;
}
void fun_double(const double&x){
 static int count = 0;
 cout << "x = " << x << " count = " << count << endl;
 ++count;
 return;
}
int main(){
 fun_int(1);
 fun_char('A');
 fun_double(1.1);
 fun_double(2.2);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在很明显,您不仅拥有一个static变量,而且在不同的函数中拥有三个不同的变量,而且它们恰好具有相同的名称。