C++Primer快速浏览笔记-复合类型

时间:2023-03-08 15:58:58

C++Primer2.3节介绍了两种复合类型:引用和指针

1.引用

  • 引用并非对象,它只是为一个已经存在的对象所起的别名。
  • 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象,因此引用必须初始化。
  • 定义引用时,程序把引用和它的初始值绑定到一起,而不是将初始值拷贝给引用。
  • 引用本身不是一个对象,所以不能定义引用的引用
  • 引用只能绑定在对象上,而不能与字面值或者某个表达式的结果绑定在一起。
  • 引用的类型必须和与之绑定的对象的类型严格匹配。但是有两种例外情况:

1.初始化常量引用时允许用字面值或任意表达式作为初始值,只要该表达式的结果能通过类型转换成引用的类型即可。
2.可以将基类的引用绑定到派生类对象上。

举几个例子:
int &refVal4 = 10; // 错误:引用类型的初始值必须是一个对象
double dval = 3.14;
int &refVal5 = dval; // 错误:此处引用类型的初始值必须是int型对象
int i = 42;
const int &r1 = i; // 允许将const int&绑定到一个普通int对象
const int &r2 = 42; // 正确:r2是一个常量引用
const int &r3 = r1 * 2; // 正确:r3是一个常量引用
int &r4 = r * 2; // 错误:r4是一个普通的非常量引用


2.指针

指针也能实现对其他对象的间接访问。与引用不同的是。

  • 指针本身就是一个对象,允许对指针赋值和拷贝,在其生命周期内可以先后指向几个不同的对象。
  • 指针无须在定义时赋初值。
    获取对象的地址
    指针存放某个对象的地址,使用取地址符获取地址:
    int ival = 42;
    int *p = &ival;
    指针值
    指针的值(即地址)应属下列4种状态之一:
  1. 指向一个对象。
  2. 指向紧邻对象所占空间的下一个位置。
  3. 空指针,未指向任何对象。
  4. 无效指针。
    利用指针访问对象
    如果指针指向了一个对象(需要是有效指针),则可以使用解引用符*来访问该对象。可以对其进行赋值等操作。
    空指针
    空指针不指向任何对象,在试图使用一个指针前代码可以首先检查它是否为空。生成空指针的方法:
  • int *p1 = nullptr; // 等价于int *p1 = 0;

    c++11新标准,建议使用

  • int *p2 = 0; // 直接p2初始化为字面常量0
  • // 首先#include cstdlib
    int *p3 = NULL; // 等价于 int *p3 = 0;
    直接把值为0的int 变量赋给指针是错误的操作
    int zero = 0;
    pi = zero; // _error: cannot assign an int to a pointer_