变量

变量就是程序能操作的命名存储

初始化

初始化(initialization)不是赋值(assignment),它发生在当变量创建时给值,而赋值是使用新值代替现有值。

List初始化

因为初始化形式很多,导致这一问题比较复杂。

下面是int的几种初始化方法:

int i = 0;
int i = {0};
int i(0);
int i{0};

使用花括号(curly brace)的叫List初始化,是C++ 11的新标准。括号的参数列表可以:

  • 任何情况下的初始化
  • 有些时候的赋值

在对内置类型的变量使用List初始化时,有个重要的性质:

编译器不允许发生可能的信息丢失 (cannot be narrowed)

long double d = 3.0;
int a{d}; // error
int c(d); // ok

默认初始化

如果我们没有在定义变量时去使用初始化(initializer),该变量就是默认初始化(default initialization)

默认值取决于变量类型,有时也和初始化的地方有关。

内置类型的默认值取决于初始化位置:在函数外定义的变量初始化为0。 而定义在函数内的内置变量默认是未初始化的(uninitialzed)(以后补上一个例外!)

当然,对于有些编译器的特殊实现,可能在函数内的内置变量即使未初始化也是0。

未初始化的变量的值就是未定义的(undefined),也就是不是确定的。复制或者访问未定义的值都是错误的。 我们建议:

对内置类型始终显式初始化,即使没必要。

对于类,是否默认初始化由类自己控制。比如,string 类告诉我们,如果不提供显式初始化,结果就是空串。

声明与定义

C++支持分别编译(separate compliation),这可能需要使用定义在其他文件的变量。

举个例子,std::cin就是定义库文件某处的,而我们可以使用它。

为了支持分别编译,C++区分声明(declaration)和定义(definition)。

  • 声明:生成一个让程序知道的名字
  • 定义:创建对应的实体

变量的声明指出了其类型以及变量的名字。变量的定义也是一种声明,除了指出类型、变量名,还分配存储空间,提供初值。

为了得到一个不是定义的声明,使用extern关键字,并不提供显示初始化。(不能在函数内部使用)

extern int i; // declares but not define
int j; // define, of course declare
extern double pi = 3.14; // definition

可以声明多次,但只能定义一次。