【C/C++】static 关键字的作用与优势

572 阅读2分钟

在C语言中的作用

  • 如果一个变量被声明为静态的,那么该变量可以被当前文件内所有函数访问,但不能被其他文件中的函数访问。
  • 一个被声明为静态的变量只会被初始化一次,在这一函数被调用的过程中其值维持不变。

在C++中的作用

  • 包含了在C语言中的作用
  • 类内数据成员的也可以被定义为static,在这种情况下,该数据成员就是类的静态数据成员
    • 静态数据成员被当作是类的成员,只会存在唯一的副本,且被所有对象共享
    • 静态成员变量属于类而不属于对象,即使没有实例化的对象,也可以使用静态变量
    • 静态数据成员和普通数据成员一样遵从public、protected、private访问规则
    • 被private或protected修饰的static成员可以在类外初始化,但是不能在类外被访问
    • 被static修饰的函数是类的静态成员函数,静态成员函数属于类,而不属于某一个特定对象,被所有对象共享。静态成员函数没有this指针,所以无法访问对象成员,也无法访问普通成员函数,它只能访问静态成员函数或静态成员

静态数据成员的优势

  1. static变量的作用范围是这个变量所在的文件。static变量与全局变量(全局变量的作用范围是整个工程)相比,减少了命名冲突的可能性。
  2. 可以实现信息隐藏。静态数据成员可以被private修饰,而全局变量不能

能否在头文件中定义静态变量?

不能。如果在头文件中定义静态变量,使用了该头文件的每个C语言文件,按照编译的步骤,都会单独存在一个静态变量,从而会引起空间浪费或者程序错误。

举个栗子

#include <stdio.h>

void func(int v){
    static int snum = 1;  // 定义一个静态变量并初始化
    snum += v;
    printf("%d\n", snum);
}

int mian() {
    func(1);  // 输出 2,静态变量被创建并初始化
    func(2);  // 输出 4,静态变量已经存在,func 中第一个语句不再执行
    func(3);  // 输出 7
}