Logo成贤计协指南

复合数据类型

了解复合数据类型

复合数据类型是由多个基本数据类型组合而成的数据类型,它们可以帮助我们更好地组织和管理相关的数据。

数组

数组是一个在 C/C++ 中非常常用的复合数据类型,它允许我们存储多个相同类型的元素。数组是存储相同类型数据的集合,所有元素在内存中连续存储。数组的大小在编译时确定,一旦定义后就不能改变大小(如果需要可变的数组,可以使用动态内存分配或者 vector,这在以后会提到)。

创建一个数组的方法如下:

<数据类型> <变量名>[<数组大小>];
array_example.cpp
int main() {
    // 方式1:声明并初始化数组
    int numbers[5] = {1, 2, 3, 4, 5};

    // 方式2:部分初始化,未指定的元素自动初始化为0
    int scores[5] = {90, 85};  // 结果:{90, 85, 0, 0, 0}

    // 方式3:让编译器自动推断数组大小
    int grades[] = {88, 92, 76, 95};  // 编译器推断大小为4

    // 方式4:声明数组后逐个赋值
    string fruits[3];
    fruits[0] = "苹果";
    fruits[1] = "香蕉";
    fruits[2] = "橙子";

    // 方式5:全部初始化为0
    int zeros[5] = {0};  // 所有元素都为0
    // 或者
    // int zeros2[5] = {};  // C++11及以后版本

    return 0;
}

访问数组可以通过索引(下标)进行访问,在数组变量后用 [<索引>] 来,索引从 0 开始:

int arr[5] = {10, 20, 30, 40, 50};

// 访问数组元素
cout << "第一个元素:" << arr[0] << endl;  // 10
cout << "第三个元素:" << arr[2] << endl;  // 30
cout << "最后一个元素:" << arr[4] << endl;  // 50

其中,10 是数组的第一个元素,索引为 020 是第二个元素,索引为 1;依次递推。

在访问之前,请注意索引不要超过 数组的大小 - 1 ,否则会引发未定义行为

有关数组的内容,我们会在后续章节详细提到。

结构体

有时候,我们可能会想要一个类型里面存储多个不同类型内容的项目,例如我想要定义一个存储个人信息的东西,一个人可能有年龄(整数),姓名(字符串),性别(因为只有 两个值,所以可以用布尔型)。在 C++ 中,我们想要定义这种复合类型,可以使用 struct 关键字。(当然,也可以用类,会在以后讲到)

例如,我可以这样定义和使用 Person 结构体:

main.cpp
#include <iostream>
using namespace std;

struct Person {
    int age;
    std::string name;
    bool gender; // 我们规定 0 代表男性,1 代表女性
};

int main() {
    Person person = { 20, "John", true };
    // 也可以先创建,后赋值
    // Person person2;
    // person2.age = 25;
    // person2.name = "Alice";
    // person2.gender = false;

    cout << "Name: " << person.name << endl;
    cout << "Age: " << person.age << endl;
    cout << "Gender: " << (person.gender ? "Female" : "Male") << endl;

    return 0;
}

你可以使用点运算符 . 来访问结构体的成员。

在 C 语言中,直接使用 struct 不会定义一个结构体类型,你需要使用 typedef 关键字来定义一个新的类型名。

typedef struct {
    int age;
    char* name;
    bool gender;
} Person;

而在 C++ 中,我们不需要使用 typedef 关键字来定义一个新的类型名,因为 struct 关键字会定义了一个新的类型名。当然,上述写法在 C++ 中依然有效。

枚举

枚举是一种特殊的类型,它允许你定义一组命名的常量。在 C++ 中,你可以使用 enum 关键字来定义一个枚举类型。

例如,我们可以定义一个表示颜色的枚举类型:

enum Color {
    RED,
    GREEN,
    BLUE
};

现在,我们可以使用 Color 类型来表示颜色:

Color color = RED;

枚举类型可以有初始值,例如:

enum Color {
    RED = 1,
    GREEN = 2,
    BLUE = 3
};

现在,我们可以使用 Color 类型来表示颜色,并且可以使用整数来表示颜色:

Color color = RED;
int colorValue = static_cast<int>(color);

还有很多其他的复杂数据类型,包括标准库的 Union、STL库的 vector 等等,这里就不一一说明。后面在用到的时候我们会进行介绍。