Answers:
static
不幸的是,关键字在C ++中具有一些不同的不相关含义
当用于数据成员时,这意味着数据是在类中而不是在实例中分配的。
当用于函数内部的数据时,这意味着数据是静态分配的,在第一次进入该块时进行初始化,并持续到程序退出。此外,变量仅在函数内部可见。局部静态的这一特殊功能通常用于实现单例的惰性构造。
当在编译单元级别(模块)使用时,这意味着变量就像全局变量(即在main
运行之前分配和初始化,并在main
退出后销毁),但是该变量在其他编译单元中将不可访问或不可见。
我在每次使用中最重要的部分上加了一些强调。不鼓励使用(3)来支持未命名的名称空间,该名称空间还允许未导出的类声明。
在您的代码中,static
关键字的含义为2,与类或实例无关...它是函数的变量将只有一个副本。
正如iammilind所说,如果该函数是模板函数,则该变量可能有多个实例(因为在这种情况下,函数本身确实可以在程序中的许多不同副本中出现)。即使在这种情况下,课程和实例都不相关...请参见以下示例:
#include <stdio.h>
template<int num>
void bar()
{
static int baz;
printf("bar<%i>::baz = %i\n", num, baz++);
}
int main()
{
bar<1>(); // Output will be 0
bar<2>(); // Output will be 0
bar<3>(); // Output will be 0
bar<1>(); // Output will be 1
bar<2>(); // Output will be 1
bar<3>(); // Output will be 1
bar<1>(); // Output will be 2
bar<2>(); // Output will be 2
bar<3>(); // Output will be 2
return 0;
}
keyword static unfortunately has a few different unrelated meanings in C++
:)
函数内部的静态变量
在函数内部创建的静态变量存储在程序的静态存储器中而不是堆栈中。
静态变量初始化将在函数的第一次调用时完成。
静态变量将在多个函数调用中保留该值
静态变量的生命周期为Program
例子
#include <iostream>
using namespace std;
class CVariableTesting
{
public:
void FuncWithStaticVariable();
void FuncWithAutoVariable();
};
void CVariableTesting::FuncWithStaticVariable()
{
static int staticVar = 0; //staticVar is initialised by 0 the first time
cout<<"Variable Value : "<<staticVar<<endl;
staticVar++;
}
void CVariableTesting::FuncWithAutoVariable()
{
int autoVar = 0;
cout<<"Variable Value : "<<autoVar<<endl;
autoVar++;
}
int main()
{
CVariableTesting objCVariableTesting;
cout<<"Static Variable";
objCVariableTesting.FuncWithStaticVariable();
objCVariableTesting.FuncWithStaticVariable();
objCVariableTesting.FuncWithStaticVariable();
objCVariableTesting.FuncWithStaticVariable();
objCVariableTesting.FuncWithStaticVariable();
cout<<endl;
cout<<"Auto Variable";
objCVariableTesting.FuncWithAutoVariable();
objCVariableTesting.FuncWithAutoVariable();
objCVariableTesting.FuncWithAutoVariable();
objCVariableTesting.FuncWithAutoVariable();
objCVariableTesting.FuncWithAutoVariable();
return 0;
}
输出:
静态变量
变量值:0
变量值1
变量值2
变量值3
变量值4
自动变数
变量值:0
变量值:0
变量值:0
变量值:0
变量值:0
简化答案:
静态变量,无论它们是(非模板的)class
还是(非模板的)函数的成员,从技术上来说,其行为类似于全局标签,其范围限于class
or或函数。
MyClass& instance(){ static MyClass x("config.ini"); return x; }
-一个单线程使用的有效可移植实现,恰恰是因为无论您说什么,局部静态数据都不只是像全局变量那样简单。
static int i
实例具有特定范围的东西,例如ego1.foo(); // i = 1
和$o2.foo(); // i = 1
...?