跳到主要内容

复合类型

一、左值引用

  • 将声明符写作&name的形式,即可声明一个引用变量name

    int a = 10;
    int &ra = a; // 声明了引用变量 ra,和变量 a 绑定
  • 引用类型无字面值,与引用变量所引用的类型完全相同的对象都可以做引用变量的初始值。

  • 引用变量必须初始化,且无法再赋值,引用变量从用户角度来说不存在实体,不占有内存,仅仅是其所绑定对象的别名,故无法创建引用的指针或数组等要求根类型必须是实体的类型。

  • 多数时候对引用变量的操作实际上是对其所绑定对象的操作

二、右值引用

三、指针

  • *name做声明符将声明一个指针变量name

    int a = 10;
    int *p;
    int *pn = nullptr;
    int *pa = &a;
  • 指针类型的字面值仅有 1 个nullptr,其类型为std::nullptr_t

  • 指针类型和引用不同的是指针变量具有实体,既可以对指针本身进行操作,也可以通过指针对其所指对象进行间接操作

四、数组

  • name[constexpr]做声明符将声明一个数组name

    int arr[10];
    int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int arr2[] = { 1, 2, 3, 4, 5 }; // 包含 5 个元素的数组
    char str1[] = "hello world!";
    char str2[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\0'}; // 等价于上一句
  • 数组是一组其他实体类型对象的集合,这组对象按顺序连续排列在内存中

  • 数组没有明确的字面值类型,但我们可以认为以下两种是数组字面值。其一是字符串字面值,其二是其他字面值组成的列表,该列表应该用花括号包围

  • 数组不允许拷贝操作,要实现拷贝功能只能逐元素拷贝