静态(C++)

static 关键字可用于声明变量、函数、类数据成员和类函数。

默认情况下,即定义的外部整个对象或变量块有静态时间和外部连接。 静态持续时间意味着将对象或变量,当程序启动时将被释放,当程序的末尾。 外部连接意味着变量的名称从变量声明的文件外部可见。 相反,内部链接表示该名称在变量声明的文件外不可见。

可以在以下情况下使用 static 关键字。

  • 在声明变量或函数在文件范围 (全局和/或命名空间范围), static 关键字指定变量或函数具有内部链接。 在声明变量时,变量具有静态时间限制,因此编译器将其初始化为 0,除非您指定其他值。

  • 在声明函数期间的变量, static 关键字指定变量之间保留其状态调用该函数。

  • 在声明类声明的某个数据成员, static 关键字指定该成员的一个副本。类的所有实例中共享。 静态数据成员必须定义在文件范围。 您声明的一个整型数据成员,当 conststatic 能有初始值设定项。

  • 在声明类中声明时的成员函数, static 关键字指定函数由类的所有实例中共享。 ,因为该函数没有隐式 this 指针,静态成员函数无法访问实例成员。 访问实例成员,声明与实例指针参数的函数或引用。

  • 不能声明联合的成员作为静态。 但是,必须显式声明一个全局声明的匿名联合 static。

有关更多信息,请参见 自动外部注册

示例

下面的示例演示声明函数中的 static 的变量如何保留之间其状态调用该函数。

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
   static int nStatic;    // Value of nStatic is retained
                          // between each function call
   nStatic += curr;
   cout << "nStatic is " << nStatic << endl;
}

int main() {
   for ( int i = 0; i < 5; i++ )
      showstat( i );
}
  

下面的示例演示类中使用 static 。

// static2.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class CMyClass {
public:
   static int m_i;
};

int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;

int main() {
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject1.m_i = 1;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject2.m_i = 2;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   CMyClass::m_i = 3;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;
}
  

下面的示例在成员函数显示 static 声明的局部变量。 可以将静态变量整程序可用;该类型的所有实例共享该静态变量的同一副本。

备注

将值分配给一个多线程应用程序的静态局部变量不是线程安全的,并且我们不建议将其作为的编程做法。

// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
   void Test(int value) {
      static int var = 0;
      if (var == value) 
         cout << "var == value" << endl;
      else
         cout << "var != value" << endl;

      var = value;
   }
}; 

int main() {
   C c1;
   C c2;
   c1.Test(100);
   c2.Test(100);
}
  

请参见

参考

C++关键字

C++存储类

静态存储类说明符

静态成员函数

访问控制和静态成员