## 第2章 变量和基本类型
### 2.2.1 变量定义
定义于任何函数之外的变量将被初始化为0。
定义在函数体内部的内置类型变量将不被初始化。
### 2.2.4 名字的作用域
当作用域操作符(:: )的左侧为空时,即视为向全局作用域发出请求获取作用域操作符右侧名字对应的变量。
### 2.3.1 引用
除以下两种例外情况,其他所有引用的类型都要与之绑定的对象严格匹配,而且,匹配只能绑定在对象上,而不能与字面值或者某个表达式的计算结果绑定在一起:
A) 初始化常量引用时允许用任意表达式作为初始值;
B) 基类的引用可以绑定到派生类对象上。
### 2.3.2 指针
除以下两种例外情况,其他所有指针的类型都要与它所指向的对象严格匹配:
A) 允许令一个指向常量的指针指向一个非常量对象;
B) 基类的指针可以绑定到派生类对象上。
---
C++11新标准引入字面值**nullptr**,它可被转换成任意其他的指针类型,例如可以用来初始化指针。
### 2.4 const限定符
用extern加以限定,可使其能被其他文件使用。
建议:对于const变量不管是声明还是定义都应该添加extern关键字。
### 2.4.4 constexpr和常量表达式
**constexpr**把它所定义的对象置为了**顶层const**。即用来修饰指针时,仅对指针本身有效。
### 2.5.2 auto类型说明符
**auto**一般会忽略掉**顶层const**,而保留**底层const**。
### 2.5.3 decltype类型指示符
**decltype**不会忽略顶层const和引用 。
如果表达式的内容是解引用指针,则**decltype**将得到引用类型。
`decltype((variable))`得到的结果一定是引用。
```cpp
/* 练习2.37 —— 赋值表达式会生成引用类型 */
int a = 3, b = 4;
decltype(a = b) d = a;//此处d是a的引用
```
### 2.6.3 编写自己的头文件
预处理变量无视c++语言中关于作用域的规则。