【C++】static与extern关键字

一、static关键字

   通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存,但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但是有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现,但变量不属于函数本身,不只受函数的控制,给程序的维护带来不便。使用静态局部变量正好可以解决这个问题。

(1)静态局部变量
   静态局部变量在全局区存储,静态局部变量只被初始化一次,下次使用依据上一次保存的值。生存周期为整个源程序,作用域与普通局部变量相同,该变量只能在定义该变量的函数内使用。对于基本类型的静态局部变量,若在定义时未赋以初值,则系统自动赋予0值。对于普通局部变量,若在定义时未赋以初值,则其值是未定义。把局部变量改变为静态局部变量后是改变了它的存储方式,改变了它的生存周期。

(2)静态全局变量
   静态全局变量在全局区存储,静态全局变量只被初始化一次。非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而static关键字限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。 把全局变量改变为静态全局变量是改变了它的作用域,限制了它的使用范围。

(3)静态函数
   静态函数和外部函数的作用域不同,static关键字限制了其作用域仅局限于本文件,在同一源程序的其它源文件中不能使用它。使用内部函数的好处是,不同的人编写不同的源文件时,不用担心自己定义的函数会与其它文件中的函数同名。

(4)类的静态成员和函数
   静态数据成员只能被定义一次,为类的各个对象共享。静态数据成员不能在类内初始化,也不能在类的构造函数中初始化,否则每次创建一个类的对象静态数据成员都要被重新初始化。静态成员函数中没有this指针,因此只能访问类的静态数据成员,在类外实现静态成员函数时,不加static关键字,否则是错误的。

二、extern关键字

   extern关键字修饰变量或函数,表示变量或函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用。extern可以声明无数次,但只能定义一次,否则会出现链接错误。

// test.cpp
#include 
using namespace std;
// 定义为外部变量
extern int num = 100;
// 定义为外部函数
extern void fun() {
	cout << "test.cpp - fun()" << endl;
}
// main.cpp
#include 
using namespace std;

extern void fun();
extern int num;

void test() {
	fun();	// test.cpp - fun()
	cout << num << endl;	// 100
}

int main()
{
	test();
	system("pause");
	return 0;
}

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