📜  C ++ |静态关键字|问题2(1)

📅  最后修改于: 2023-12-03 14:39:38.936000             🧑  作者: Mango

静态关键字

在 C++ 中,static 是一个非常重要的关键字,它可以被用于不同的场景来改变变量和函数的行为。在本文中,我们将介绍 static 关键字的用法以及一些常见问题和解决方案。

静态变量

在函数中定义的变量被称为自动变量,它们存储在栈中,并在函数执行结束时被销毁。如果你想在整个程序生命周期内维护变量的值,可以使用 static 变量。静态变量只会被初始化一次,即使函数被多次调用,也不会重新初始化。

void foo() {
  static int x = 0;
  x++;
  cout << x << endl;
}

int main() {
  foo(); // 输出 1
  foo(); // 输出 2
  foo(); // 输出 3
  return 0;
}

这个例子演示了静态变量的行为。当函数 foo() 首次被调用时,x 被初始化为 0,并且会被存储在静态存储区,该变量的地址被记录下来。每次函数被调用时,x 的值都会自增,并显示在屏幕上。

静态函数

静态函数不是动态绑定的,并且在调用时不能用多态。静态函数只是在一个固定的声明范围内可见,它不能被其他文件中的函数调用,除非这个函数本身是全局变量。

class MyClass {
 public:
  static void foo() {
    cout << "Hello World." << endl;
  }
};

int main() {
  MyClass::foo(); // 输出 Hello World.
  return 0;
}

在这个例子中,静态函数 foo() 是在类中声明的,可以直接在主函数中通过类名调用它。

静态类成员

静态成员变量和静态成员函数都可以用类名作为前缀来访问,而不需要先创建对象。这些变量或函数是在同一类的所有对象之间共享的。

class MyClass {
 public:
  static int x;
};

int MyClass::x = 0;

int main() {
  MyClass a, b;
  a.x = 1;
  b.x = 2;
  cout << a.x << endl; // 输出 2
  cout << MyClass::x << endl; // 输出 2
  return 0;
}

在这个例子中,静态变量 x 可以被多个对象共享,并且可以通过对象或类名来访问。因为两个对象 ab 共享相同的静态变量 x,所以将变量 a.x 设置为 1 之后,b.x 的值也变成了 1。

注意事项
  • 静态变量、静态函数和静态类成员都不需要实例化对象就可以使用。
  • 静态变量在第一次使用前会被初始化为默认值。如果你想手动设置静态变量的初始值,需要在定义时进行初始化。
  • 静态变量在程序结束时才会被销毁,跟其他静态变量一起销毁。
  • 静态成员变量必须在类定义之外进行定义,以便于在全局作用域中生效。
  • 在多线程环境中使用静态变量时,需要特别小心,因为所有的线程都可以访问该变量。一种解决方案是使用互斥锁来保护变量。
结论

static 关键字是 C++ 中非常有用的功能。它提供了一种在程序生命周期内维护变量值的方法,并且使得类的成员和函数可以在不实例化对象的情况下使用。同时,必须正确地使用静态变量、静态函数和静态类成员,以避免一些常见的问题。