【C/C++知识点】变量存储类型+static关键字小节

【 局部变量 & 全局变量 】

1. 定义在函数内部的变量即为局部变量(包括函数的参数);定义在函数外部的变量即为全局变量(也称外部变量);

2.有效范围:

  局部变量有效范围是从定义处到函数结束(或程序块结束);

      全局变量有效范围是从定义处到所在文件结束,即同一文件的其他函数也可访问使用该变量。

 

【 存储类型 】

程序的局部变量存储在动态存储区中 (栈区),根据变量生命周期的开始和结束,系统会自动分配和释放存储空间。

全局变量存储在静态存储区,程序结束前内存不会被释放。 

 

*【 static 】关键字

静态局部变量:局部变量前加static, 表示该变量可以被函数外部访问(要通过该函数),变量会被存储在静态存储区;静态局部变量只会被初始化一次。

静态外部变量:全局变量前加static, 表示该变量只可以被所在文件访问。(避免不同文件中有相同变量名而引起混乱)

* 静态变量和全局变量要赋初始值。其他类型变量不赋值编译不会报错,但不确定返回值是多少,建议尽量保证定义的变量都被赋初值。

-----------------------------------------------------------------------------------------------------------

* extern 关键字。

在一个源文件中,如果要使用另一个源文件中的全局变量,需要通过extern关键字声明。编译和链接时,系统会知道该变量在别处定义的全局变量,并将该变量的作用域扩展到该源文件。

若一个全局变量定义为static类型,则外部文件中即使使用extern声明,也无法访问该变量。

*变量的声明和定义是不同的含义:

  同一个变量只能被定义一次,但可以被声明无数次。变量声明的作用在于告诉系统此变量在其他文件中。

----------------------------------------------------------------------------------------------------------

【 内部函数 & 外部函数】

一般函数都为外部函数,即可以被其他源文件调用。其他源文件调用此函数时,需要先声明, Eg. extern void swap(int &a, int &b); (extern可省略)

//函数声明的意义,即告诉编译器此函数在之后或其他文件中已定义;函数原型声明可将函数作用于扩展到声明处及之后

函数前加static关键字后,函数变为内部函数,函数便只能被该文件调用。

 

* 【各类变量作用域和存在性小节】

 

变量/函数类型 作用域 生命周期
局部变量 函数内部 函数内部
静态局部变量 函数内部 程序运行期间
全局变量 本文件及extern声明该变量的文件 程序运行期间
静态全局变量 本文件 程序运行期间
外部函数 声明该函数的文件 NA
内部函数 定义该函数的文件 NA

----------------------------------------------------------------------------------------------------------

【 类的静态成员变量和静态函数 】

类中的成员变量和成员函数也可被static修饰,表示该类的对象都共享这些变量和函数;

计算一个对象size时,不包括静态成员变量的大小;

在包含类的静态成员变量的文件中,需要给这些变量声明和赋初值。Eg. static int myClass::myStaticVal = 1;

可以通过某一个对象名或类名调用静态成员;

静态函数只能访问静态成员变量, 也只能调用静态成员函数;

虚函数不可以是静态函数;

类的静态成员变量本质就是全局变量,而静态成员函数本质就是全局函数。之所以写在类中,是为了更好地理解和维护(不是同一类对象不可访问私有成员)。

 

posted @ 2020-04-22 20:00  Yx_xixi  Views(337)  Comments(0)    收藏  举报