实际上有 3 种方式,这里已经提到了其中的 2 种。我总结一下原因:
1) 将变量声明为静态:
void callMe()
{
static int count=0;
cout<<"I am called "<<++count<<" times!\n";
}
这是有效的,因为内存现在创建了一个 count 副本,而不是每次调用函数时都创建一个,然后在函数完成时将其删除。这里还值得注意的是 count 仍然是函数的本地,即如果您尝试执行以下操作:
int main()
{
int count;
callMe();
callMe();
callMe();
callMe();
cout<<"you called "<<count<<"functions!\n";
return 0;
}
count 仍将显示垃圾值,因为您的函数的计数和 main 的计数是 2 个不同位置的 2 个不同变量。
2)初始化一个全局变量:
int count=0;
void callMe()
{
cout<<"I am called "<<++count<<" times!\n";
}
在上面的示例中,变量具有全局范围,因此整个程序使用变量的单个副本,因此在某处所做的更改将反映在程序中的任何位置。如果您需要监控 2 个以上的功能,则可以使用此方法。例如:
int count=0;
void callMe()
{
cout<<"I am called "<<++count<<" times!\n";
}
void callMe2()
{
cout<<"I am called 2 "<<++count<<" times!\n";
}
int main()
{
callMe();
callMe();
callMe2();
callMe2();
cout<<"you called "<<count<<" functions!\n";
return 0;
}
由于这里的 count 基本上对函数和 main 都是通用的,因此它们都引用相同的值,而不是制作自己的本地副本。如果你有同名的变量,可能会搞砸。要了解全局变量和静态变量及其范围之间的区别,请单击此处
3)传递变量的引用:
void callMe(int &count)
{
cout<<"I am called "<<count++<<" times!\n";
}
void callMe2(int &count)
{
cout<<"I am called 2 "<<++count<<" times!\n";
}
int main()
{
int count=0;
callMe(count);
callMe(count);
callMe2(count);
callMe2(count);
cout<<"you called "<<count<<" functions!\n";
return 0;
}
这可能是最干净的方法,变量是 main 的本地变量(这将节省垃圾收集的复杂性),并且由于这是通过引用传递,所以所做的所有更改都指向内存中的同一位置。如果你没有充分的理由不遵循这个,我会说使用这个。
希望我没有进一步混淆你,快乐狩猎。