返回

深入浅出剖析 C++ 中的 static 用法及其实例详解

后端

C++ 中 static 的概述

static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。static 在 C 语言和 C++ 语言中各有多个用途,下面我们将分类讲解:

C 语言中 static 的三种用法

1. 全局变量的存储方式控制

在 C 语言中,static 修饰的全局变量将被存储在静态存储区中。静态存储区的变量在程序运行期间始终存在,即使它们所在的函数或块已经结束。这意味着 static 修饰的全局变量可以被程序中的任何函数访问。

2. 局部变量的存储方式控制

在 C 语言中,static 修饰的局部变量也将被存储在静态存储区中。这与未经 static 修饰的局部变量不同,未经 static 修饰的局部变量在函数结束时会被销毁。因此,static 修饰的局部变量可以被函数中的任何语句访问,即使它们所在的块已经结束。

3. 函数的可见性控制

在 C 语言中,static 修饰的函数只能被它所在的源文件中其他函数访问,而不能被其他源文件中的函数访问。这有助于防止函数名冲突,并提高程序的可读性和可维护性。

C++ 中 static 的四种用法

1. 全局变量的存储方式控制

与 C 语言类似,在 C++ 中,static 修饰的全局变量将被存储在静态存储区中。

2. 局部变量的存储方式控制

与 C 语言类似,在 C++ 中,static 修饰的局部变量也将被存储在静态存储区中。

3. 函数的可见性控制

与 C 语言类似,在 C++ 中,static 修饰的函数只能被它所在的源文件中其他函数访问,而不能被其他源文件中的函数访问。

4. 类成员的存储方式和可见性控制

在 C++ 中,static 修饰的类成员将被存储在类中,并且只能被该类的对象访问。这有助于防止成员名冲突,并提高程序的可读性和可维护性。

实例详解

为了更好地理解 static 的用法,我们来看几个实例:

实例 1:C 语言中 static 修饰的全局变量

static int global_variable = 10;

int main() {
  printf("The value of global_variable is %d\n", global_variable);
  return 0;
}

在这个实例中,global_variable 被 static 修饰,因此它将被存储在静态存储区中。这意味着它可以在程序中的任何函数中访问。

实例 2:C 语言中 static 修饰的局部变量

void foo() {
  static int local_variable = 0;

  printf("The value of local_variable is %d\n", local_variable);
  local_variable++;
}

int main() {
  foo();
  foo();
  return 0;
}

在这个实例中,local_variable 被 static 修饰,因此它将被存储在静态存储区中。这意味着它可以在函数 foo() 中的任何语句中访问,即使它所在的块已经结束。此外,local_variable 的值在函数 foo() 被调用两次后变为 1。

实例 3:C 语言中 static 修饰的函数

static void foo() {
  printf("Hello, world!\n");
}

int main() {
  foo();
  return 0;
}

在这个实例中,foo() 被 static 修饰,因此它只能被它所在的源文件中其他函数访问。这有助于防止函数名冲突,并提高程序的可读性和可维护性。

实例 4:C++ 中 static 修饰的类成员

class MyClass {
public:
  static int static_member;

  MyClass() {
    static_member++;
  }

  static void print_static_member() {
    printf("The value of static_member is %d\n", static_member);
  }
};

int MyClass::static_member = 0;

int main() {
  MyClass object1;
  MyClass object2;

  MyClass::print_static_member();
  return 0;
}

在这个实例中,static_member 被 static 修饰,因此它将被存储在类 MyClass 中,并且只能被 MyClass 的对象访问。这意味着 static_member 的值可以在 MyClass 的任何成员函数中访问,即使它所在的块已经结束。此外,static_member 的值在创建了两个 MyClass 对象后变为 2。

结语

static 是 C/C++ 中一个非常有用的修饰符,它可以控制变量的存储方式和可见性。通过合理地使用 static,我们可以提高程序的可读性和可维护性,并防止变量名和函数名冲突。