变量定义

用最简单的话说,变量就是一个固定内存区域在程序中的代号,这个内存区域的大小是由变量的数据类型决定的。C++中的变量在使用前必须先声明,声明格式为数据类型 变量名,例如int a。C++声明变量时可以同时声明多个变量,变量间只需要使用逗号隔开。

C++中的变量在声明时不一定需要赋予一个初始值,即进行初始化操作。但没有被赋予初始值的变量在直接进行访问操作时可能会出现内存泄漏的情况,所以在访问变量的值时,最好先确认变量已被赋值。

左值与右值

在很多教材中经常会看到左值和右值的称呼。左值一般是指向内存位置的表达式,例如变量名,左值可以出现在赋值等号的任何一边。右值是指存储在内存中某个地址的确实的值。右值不能被赋值,只能出现在赋值等号的右边。

作用域

变量一般可以在三个位置进行声明:

  1. 在函数或者代码块内部,称为局部变量
  2. 在函数定义中声明的变量,称为形式参数
  3. 在函数外声明的变量,称为全局变量

其中,局部变量只能在声明它们的函数或者代码块内部使用。全局变量通常在程序头部定义,在整个程序的生命周期中起效。在程序中,局部变量可以和全局变量名称相同,在局部变量起效的函数或者代码块内,局部变量会遮蔽全局变量的值;但是在函数或者代码块内可以在没有声明局部变量的情况下改变全局变量的值。

局部变量在声明时,系统不会对其进行初始化,而全局变量在声明时,系统将自动使用下表中的默认值对其进行初始化。

数据类型默认值
int0
char\0
float0
double0
指针NULL

变量修饰符

变量修饰符用于定义变量的可见范围和生命周期以及行为特性,修饰符放在变量声明的类型之前。C++中可以使用的变量修饰符有以下这些:

  • auto,根据初始化表达式的值自动推断变量的类型。C++11 标准中已经删除了自动变量的用法,目前仅用于自动推断。
  • register,指示将变量存储于寄存器中。C++11 中此关键字已经弃用。
  • static,指示变量在整个程序的生命周期内存在。
    • 用于修饰局部变量时,可以在不同的作用域间维持局部变量的值。
    • 用于修饰全局变量时,会将全局变量的作用域限制在声明全局变量的文件中。
    • 用于类的数据成员时,会使该成员在所有类实例中共享。
  • extern,用于提供一个全局变量的引用。
    • 全局变量对于所有的程序文件都是可见的,当使用extern时,会将被修饰的变量指向之前已经定义过的同名变量的位置。
    • 当有多个文件并且定义了一个可以在其他文件中使用的全局变量或者函数,可以在其他文件中使用extern来得到已经定义的全局变量或者函数的引用,即extern是用来在另一个文件中声明一个全局变量或函数的。
  • volatile,用于通知编译器不需要优化被修饰的变量,程序可以直接从内存中读取变量,多用于多线程间数据共享。经过编译器优化的变量会将其值放入寄存器来加速读写。
  • mutable,仅用于类的实例,允许被修饰的成员通过 const 成员函数修改。
  • thread_local,指示被修饰的变量仅可以在其被创建的线程上可见,每个线程都将拥有被修饰的变量的副本。thread_local不能用于函数声明或定义。