最近学习c++,写点东西记录下学习过程,做点笔记
变量提供一个具名的、可供程序操作的存储空间。这是C++Primer中对变量的描述,这里强调一点,变量是一个存储空间,它就是一个可以供程序员操作的内存。
初始化
在对象被创建时获得一个特定的值,我们说这个对象被初始化。初始化不是赋值,初始化是在创建变量的时候赋予其一个初始值,而赋值的含义是把对象当前值擦除,而用一个新值来替代。
在很多的编程语言中,这两者的区别几乎可以忽略不计,但在c++中这个概念至关重要。
一般在编程时,使用的变量都要初始化,这可以当做一个编程规范。
声明和定义
声明和定义变量是不同的概念,c++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译。将程序分为多个文件,就需要提供在文件之间共享代码的方法(一个文件的代码可能需要使用另一个文件中定义的变量)。为了支持分离式编译,c++将声明和定义变量区分开。
声明:使得变量能被程序所知(简单理解就是告诉编译器这个变量的存在,至于是在哪里定义的,暂时可以先不用考虑)。声明一个变量的方式就是在变量名前添加extern,并且不要显式的初始化变量。
extern int i; //添加extern,不能初始化其值
int j; //声明并定义j
定义:创建变量实体,分配其所需的内存空间(此时可以初始化变量)。任何包含了显式初始化的声明就成了定义。
int i = 1; //声明并定义
extern int i = 1; //声明并定义
变量可以被声明多次,但只能被定义一次。如果要在多个文件中使用同一个变量,就必须将声明和定义分离。此时,变量的定义必须且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,决不能重复定义。
作用域
作用域是程序的一部分,使其中的名字有特定的含义。c++中的作用域大多以花括号分隔。
简单来说,包含全局作用域和块作用域,一旦声明之后,全局作用域的名字可以在整个程序范围内使用,块作用域只能在声明这个变量的作用域块内部使用。作用域可以嵌套,在一个作用域内部可以有另外的作用域,其中变量的含义遵循就近原则。
生命周期
变量的生命周期和其被定义的位置相关(也就是在内存中存储的位置相关)
全局变量:在所有函数之外定义的变量,存储在全局区,在程序运行前由编译器分配内存,在程序运行结束后由编译器负责回收内存。
局部变量:在函数体内部定义的变量(包括形参),存储在栈区,在函数调用时分配内存,在函数调用结束时,由编译器会自动回收。(都是在程序运行过程中动态完成的)