C++ 变量声明 定义 作用域 链接性总结

变量定义

变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。

变量声明

用于向程序表明变量的类型和名字。程序中变量可以声明多次,但只能定义一次。

变量的类型

(1)自动存储变量: 在函数定义中声明的变量(包括函数参数)。当函数或代码块执行时创建变量,当函数或代码块执行完时,这些变量的内存被释放。这类变量在 栈 中分配内存。
(2)静态持续变量: 在函数定义外定义的变量和使用关键字 static 定义的变量,简称 静态变量。这类变量在程序整个运行过程中都存在
(3)动态存储变量: 由 new 运算符分配内存的变量,直到使用delete运算符将其释放或程序结束。这类变量在 堆(自由存储区) 中分配内存。
(4)线程存储变量: 此变量生命周期和线程一样长。这里不做过多解释。

​ 5种变量储存方式

存储描述 持续性 作用域 链接性 如何声明
自动 自动 代码块 无 在代码块中
寄存器 自动 代码块 无 在代码块中,使用关键字 register
静态,无链接性 静态 代码块 无 在代码块中,使用关键字 static
静态,外部链接性 静态 文件 外部 不在任何函数内
静态,内部链接性 静态 文件 内部 不在任何函数内,使用关键字 static

述了名称在文件的多大范围内可见。

(1)全局作用域:从变量定义到文件结尾都可用,所以也叫 文件作用域。
(2)局部作用域:如自动变量的作用域在函数内部。

链接性

(1)外部链接性:可在其它文件中访问。
(2)内部链接性:只能在当前文件中访问。
(3)无链接性:只能在当前函数或代码块中访问。

静态持续变量初始化

(1)如果没有显示的初始化静态变量,编译器将把它设置为0
(2)在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0

例:

int global = 1000;
static int one_file = 50;
int main()
{
 ...
}
void fun(int n)
{
	static int count = 0;
	int llama = 0;
...	
}

分析:global和one_file的作用域都为整个文件,global的链接性为外部,所以可以在程序的其他文件使用它,而 one_file的链接性为内部,只可以在本文件中使用它。(程序是多文件)
count和llama作用域是局部的,没有链接性,也就是说只能在fun()中用它们。因为count变量是静态变量,所以count变量一直存在,即使fun()函数没有执行。而llama变量是当fun()函数执行时被创建,当fun()函数执行完后被释放内存。

多文件使用外部链接性变量

只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他所有文件中,都必须使用关键字 extern 声明它。
例:

//file1.cpp
int cat = 20;  //在file1.cpp中定义cat变量

//file2.cpp
extern cat;	   //在file2.cpp中使用cat变量要先用extern声明
cout << cat << endl;

结束

现在读者应该对变量有了更深刻的认识了

posted @ 2020-11-27 15:30  FreeK0x00  阅读(330)  评论(0)    收藏  举报