1、为了支持分离式编译,C++程序将声明和定义区分开来。声明使得名字呗程序所知,一个文件如果想使用别处定义的名字则必须包含那个名字的声明。而定义负责创建与名字关联的实体。
变量声明规定了变量的类型和名字,在这一点上定义与之相同,但是除此之外,定义还申请存储空间,也可能为变量赋一个初始值。如果想声明一个变量而非定义它,就在变量名前添加关键字extern, 而且不要显示的初始化变量
extern int i; //声明i而非定义i
任何包含了显示初始化的声明即成为定义。我们能给有extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用:
extern int i = 4; //定义
注意:在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。
2、C++的标识符由字母、数字和下划线组成,其中必须以字母或下划线开头。
3、复合类型是指基于其他类型定义的类型,其中两种:引用和指针。
引用为对象起了另外一个名字。引用必须被初始化。
int ival = 1024;
int &refval ; //报错,没有初始化
int &refval = ival; //refval 指向ival,是ival的另一个名字
为引用赋值,实际上是把值赋给了与引用绑定的对象。引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定,而且绑定时必须与绑定对象严格匹配。
4、空指针最直接的方法就是用字面值 nullptr 来初始化指针,nullptr 是一种特殊类型的字面值,他可以被转化成任意其他的指针类型。过去还会用到一个名为NULL的预处理变量来个指针赋值,这个变量在头文件 cstdlib 中定义,他的值就是 0.建议:初始化所有指针。
5、引用本身不是对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:
int i = 42;
int *p;int *&r = p; // r 是一个对指针p的引用
从右向左阅读r的定义。r 是一个引用,引用的是一个指针,而且是一个int型指针。