1.引用变量需要初始化,绑定(bind)到某个对象,并且一旦初始化之后无法再重新绑定到其他变量。引用变量只是已经存在的对象的一个别名,不是对象。
2.指针变量用于其他对象的间接访问(保存的是其他对象的地址)。指针对象本身是一个对象,可以被赋值/复制,可以指向不同的对象,不一定需要初始化。
3.空指针不指向任何对象。三种方法初始化。nullptr是一种特殊的类型可以转换为其他指针类型。NULL是cstdlib头文件中的变量,值为零。在编译代码前,预处理器变量会被预处理器替换为其特定的值。
int *p = nullptr; //一般用这种方式初始化空指针
int *p = 0;
int *p = NULL; //NULL会在编译前被替换为值0
4.每个变量定义是由基础类型(base type)+一组声明符(类型修饰符 type modifier)组成的。当有多个类型修饰符时 ,以逻辑的形式组合。理解复杂指针/引用变量声明的方法:从右向左读定义.
int a, *p = &a, &r = a; //a是int, p是指向int的指针, r是int的引用. 这里int是基础类型, p前面的*和r前面的&都是类型修饰符 int* p; int *p; //和上面一样,两种写法 int* p1, p2; //p1是指向int的指针, p2是int. *是p1的类型修饰符,与其他变量无关 int *p1, *p2; //p1, p2都是指向int的指针 int val = 42; //val是int int *pi = &val; //pi是指向int的指针 int **ppi = π //ppi是指向指向int的指针的指针 int i = 42; int *p; int *&r = p; //r是指针p的引用. 引用不是一个对象, 因此没有指向引用的指针. 指针是一个对象, 因此有指针的引用. 这里理解r的类型的方法:从右向左读定义. r最左边是&, 因此r是i一个引用, 剩下部分表示r引用的类型是指向int的指针. r = &i; *r = 0; cout << i; //i的值被改为0
5.要在多个文件中共享const对象,必须声明为extern。
6.引用和const。
“const reference” as the abbr. of“reference to const” 没有常量引用(const reference)的说法,因为引用变量一旦初始化之后,bind to an object,就不可改变,bind to another object。 引用“引用”(refer to)的是const类型还是非const类型影响的是/是否可以通过引用名对原对象进行操作,而不会影响是否可以更改引用本身的绑定(不可更改)。 可以将“引用”常量的引用绑定到任何非const的对象,字面值,或一般的表达式,只要该表达式可以转换到引用的类型。 dobule dval = 3.14; const int &ri = dval;
7.指针和const。
指向常量的指针(pointer to const)并不表明指针指向的对象是否是常量,只是说明是否可以通过该指针改变指向的对象。 常量指针(const pointer)必须初始化,并且初始化后值不可更改。指针本身是常量并不说明是否能通过指针改变指针指向的对象,只是说明该指针的值(指针存的地址)不可以改变。 top-level const:指针本身是常量。应用于对象本身。 low-level const:指针指向常量对象。(该对象可以不是常量,指向常量对象只是不能通过指针改变该对象) 上面两个的区别主要在于拷贝对象的时候:top-level const可以忽视,low-level const不可以忽视,必须有相同的low-level const或者non-const可以拷贝给const对象。 int i = 0; int *const p1 = &i; const int ci = 42; const int *p2 = &ci; const int * const p3 = p2; const int &r = ci; i = ci; //ok p2 = p3; //ok int *p = p3; // error: p3有low-level const, p没有 int &r = ci; // error: 不能将一般的int&引用绑到常量对象上
8.constexpr 变量。
通过声明对象为constexpr,可以让编译器来确认变量是否是常量表达式。
constexpr修饰指针变量时,施加的是top-level const的影响。
const int *p = nullptr; // p是一个指向const int的指针 constexpr int *q = nullptr; // q是一个指向int的常量指针
9.类型别名(Type Aliases)。
typedef type new_type_name; using new_type_name = type;
10.typedef 和 const。
出现在base类型中的const修饰的是给定类型。
typedef char *pstring; const pstring cstr = 0; // base type: pstring(pointer to char). cstr is a constant pointer to char. 这里把pstring看做和int一样的基础类型. 这里的const是top-level. const pstring *ps; // ps is a pointer to constant pointer to char. 这里的const是low-level.