C++中的Static关键字

C++中的Static关键字

Static关键字主要用法分为面向过程(C)程序设计中的static和面向对象(C++)程序设计中的static,
它被用来控制变量的存储方式和可见性。
面向过程中不涉及到类,static用于修饰静态数据成员及静态成员函数;
面向对象中的static用来修饰静态变量(全局和局部)及静态函数。

面向过程中的static

静态变量

1.静态局部变量
static关键字修饰局部变量时,使得被修饰的变量成为静态变量,存储在静态区。存储在静态区的数据生命周期与程序相同,在main函数之前初始化,在程序退出时销毁。(无论是局部静态还是全局静态)

#include 
using namespace std;

void fun();
void main()
{
	fun();
}
void fun()
{
	static int x = 5;
	//代码
}

2.静态全局变量
全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。
全局变量本来就存储在静态区,因此static并不能改变其存储位置。但是,static限制了其链接属性。被static修饰的全局变量只能被该包含该定义的文件访问(即改变了作用域)。

#include 
void fun();
static int n=10; //定义静态全局变量
void main()
{
   //程序
}

静态函数

    函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。有如下特性:
  • static修饰函数使得函数只能在包含该函数定义的文件中被调用。对于静态函数,声明和定义需要放在同一个文件夹中。
  • 不同的文件可以使用相同名字的静态函数,互不影响。

来用实例说明使用static声明的函数是不能被其他文件引用的:

//文件1
#include 
static void fn(void)
{
    printf("this is fun.\n");
}

int main(void){
    fn();
    fn1();
    return 0;
}
//文件2
#include 
static void fn1(void)
{
    printf("static fn1.\n");
}

在这种情况下是无法编译通过的,但当不在这里使用static关键字时,就可以在另一个函数当中引用该函数了:

//文件1
#include 

void fn(void)
{
    printf("this is fn.\n");
}
//文件2
int main(void)
{
    fn();
    return 0;
}

在无static关键字修饰时,可以在另一文件中引用该函数。

面向对象中的static

静态数据成员

static关键字加在类内数据成员的声明前,该数据成员就是类内的静态数据成员。静态数据成员具有静态生存期。
1.静态局部变量

  • 静态局部变量在全局数据区分配内存,具有全局寿命;
  • 静态局部变量只需在第一次声明时初始化;
  • 静态局部变量,默认初始化为0。
    2.静态全局变量
  • 静态数据成员在全局数据区分配内存;具有全局寿命;静态数据成员在定义时分配存储空间,所以不能在类声明中定义;
  • 静态全局变量未经过初始化时,默认初始化为0;。
  • 全局静态变量,只能在定义的文件中使用,在其他的文件中不可见。

同全局变量相比,使用静态数据成员的特点:

  • 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
  • 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能。

静态成员函数

与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象:

  • 用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针,因而只能访问类的static成员变量;
  • 出现在类体外的函数定义不能指定关键字static;
  • 非静态成员函数可以任意地访问静态成员函数和静态数据成员。

static关键字是C/C++中一个非常有用的关键字,掌握static关键字是必备的。

你可能感兴趣的:(C++)