变量
变量提供一个具名的,可供程序操作的存储空间。
C++中的每个变量都有数据类型,数据类型决定了变量所占用的空间和布局方式,该空间能存储值的范围,以及该变量能够参与的运算。
变量定义
变量定义的基本形式:类型说明符后紧跟一个或多个变量名组成的列表,变量名以逗号分隔,最终以分号结束。
列表中每个变量名的类型都是由类型说明符指定。
定义时可以为一个或多个变量赋值。
初始值
当变量在创建时获得了一个指定的值,我们就说这个对象被初始化。
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替。
列表初始化
C++ 语言中初始化的形式分为很多种,例如:
int i = 0;
int i = {0};
int i{0};
int i(0);
用花括号括起来初始化变量的方式称为列表初始化,是C++11中新标准的一部分。
列表初始化用于内置类型的时候,如果初始值存在丢失信息的风险,编译器将会报错:
int i{ 3.14 }; //错误,转换存在数据丢失的风险
int i = { 3.14 }; //错误,转换存在数据丢失的风险
int i(3.14); //正确,数据丢失部分值
int i = 3.14; //正确,数据丢失部分值
默认初始化
如果定义变量时没有指定初值,则变量将执行默认初始化。默认值由变量的类型和变量定义的位置相关。
对于内置类型,如果未被显示初始化,它的值由定义的位置决定,定义于任何函数体之外的变量被初始化为0,定义于函数体内部的内置类型不被初始化,一个未被初始化的内置类型的变量的值是未定义的,试图拷贝和以其它形式访问此类值时将引发错误。
每个类各自决定其初始化对象的方式,如果没有显示初始化,其值由类确定。
变量声明与定义的关系
C++ 支持分离式编译,该机制允许将程序分割为若干个文件,每个文件可以独立编译。将程序分割为多个文件就要考虑文件之间的代码共享。为了支持分离式编译,C++语言将声明和定义区分开来,声明使得名字为程序所知,而定义负责创建与名字关联的实体。
- 变量声明规定了变量的类型和名字,这一点与变量定义相同。
- 变量定义执行了存储空间的申请,甚至会为变量赋初值。
- 如果想声明一个变量而不是定义一个变量,就在变量名前加
extern
关键字,并且不要显示的初始化该变量。 - 任何包含了显示初始化的声明都称为定义:
extern double pi = 3.14; //这是定义,不是声明
- 在函数体内部初始化一个由
extern
关键字标记的变量,将引发错误。 - 变量只能被定义一次,但是可以被声明多次。
标识符
- C++ 标识符由字母,数字,下划线构成,其必须以字母或者下划线开头。
- 标识符没有长度限制,但是大小写敏感。
- C++保留的一些名字不能作为标识符。
变量命名规范
- 标识符要体现实际含义。
- 变量名一般用小写字母。
- 自定义的类名一般以大写字母开头。
- 如果标识符存在多个单词组成,则单词之间应该有明显的区分,可以使用
_
加以区分。
名字的作用域
- C++中大多数作用域以花括号分分隔。
- 同一个名字在不同的作用域中可能指向不同的实体,名字的有效区域始于名字的声明语句,以声明语句所在的作用域末端为结束。
- 定义于所有花括号之外的名字拥有全局作用域,全局作用域的名字在整个程序中有效。
- 定义于花括号之内的名字拥有块作用域,超出花括号的末尾就不能再访问它。
- 嵌套作用域中,内层作用域将覆盖外层作用域中的名字。