作者:右心1477 | 来源:互联网 | 2024-12-01 19:18
在之前的教程中,我们探讨了C++编程中的选择结构和循环结构。现在,我们将进一步学习如何通过自定义数据类型来增强程序的功能性和灵活性。自定义数据类型允许程序员根据实际需求创建新的数据类型,这对于处理复杂的数据结构尤其重要。
自定义数据类型主要包括枚举类型、结构体、联合体、数组和类。本文将详细介绍枚举类型、结构体和联合体的使用方法,其他类型将在后续教程中逐一讲解。
1. 枚举类型
枚举类型是一种用户自定义的数据类型,用于表示一组固定的值。例如,一周的七天或者比赛结果(胜利、失败、平局、取消)。使用枚举类型可以避免使用整数表示时可能出现的错误,因为它限制了变量的取值范围。
枚举类型的定义格式如下:
enum 枚举类型名 { 变量值列表 };
例如,定义一周的七天可以这样写:
enum Weekday { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
在这个例子中,Sun 的值默认为 0,Mon 为 1,以此类推。你也可以显式地指定每个枚举值的整数值,例如:
enum Weekday { Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat };
这里,Sun 的值为 7,Mon 为 1,Tue 为 2,依此类推。枚举值一旦定义后就不能改变,只能在定义时赋值。
枚举类型的变量可以像普通变量一样使用,但需要进行类型转换才能赋值整数。
下面是一个示例程序,展示如何使用枚举类型表示比赛结果:
#include
using namespace std;
enum GameResult { Win, Lose, Tie, Cancel };
int main() {
GameResult result;
for (int count = Win; count <= Cancel; ++count) {
result = static_cast(count);
if (result == Cancel) {
cout <<"The game was cancelled\n";
} else {
cout <<"The game was played ";
if (result == Win) {
cout <<"and we won!\n";
} else if (result == Lose) {
cout <<"and we lost.\n";
} else {
cout <<"and it was a tie.\n";
}
}
}
return 0;
}
运行结果如下:
The game was played and we won!
The game was played and we lost.
The game was played and it was a tie.
The game was cancelled
2. 结构体
结构体是一种复合数据类型,允许将不同类型的数据组合在一起。例如,一个学生的信息可以包含学号、姓名、年龄和成绩等不同的数据类型。
结构体的定义格式如下:
struct 结构体名 {
数据类型 成员名1;
数据类型 成员名2;
...;
};
例如,定义一个学生信息的结构体可以这样写:
struct Student {
int num; // 学号
char name[20]; // 姓名
char sex; // 性别
int age; // 年龄
float score; // 成绩
char addr[30]; // 住址
};
定义了结构体类型后,可以使用它来定义结构体变量。结构体变量的定义方式类似于基本数据类型:
Student s;
结构体变量占用的内存大小可以通过 `sizeof` 函数计算。定义结构体变量时可以直接赋初值,例如:
Student stu = {97001, "Lin Lin", 'F', 19};
结构体成员的访问方式为:结构体变量名.成员名。下面是一个示例程序,展示如何使用结构体:
#include
using namespace std;
struct Student {
int num; // 学号
char name[20]; // 姓名
char sex; // 性别
int age; // 年龄
};
int main() {
Student stu = {97001, "Lin Lin", 'F', 19};
cout < return 0;
}
3. 联合体
联合体是一种特殊的复合数据类型,允许多个不同类型的变量共享同一块内存。这在某些情况下可以节省内存空间。
联合体的定义格式如下:
union 联合体名 {
数据类型 成员名1;
数据类型 成员名2;
...;
};
例如,定义一个联合体可以这样写:
union UArea {
char c_data;
short s_data;
long l_data;
};
联合体占用的内存大小是其最大成员所需的内存大小。联合体中同时只能存储一个成员的值。例如,`UArea` 占用的内存大小为 `long` 类型所需的 4 个字节。
联合体也可以没有名称,称为无名联合体。无名联合体的成员共享同一块内存,可以直接通过成员名访问。例如:
union {
int i;
float f;
};
在程序中可以直接使用 `i` 和 `f` 访问联合体的成员。下面是一个示例程序,展示如何使用联合体:
#include
using namespace std;
union MyUnion {
int k;
struct { int x; int y; int z; } u;
};
int main() {
MyUnion a;
a.u.x = 4;
a.u.y = 5;
a.u.z = 6;
a.k = 0;
cout < return 0;
}
这个程序的输出结果是 `0 5 6`,因为联合体的成员共享同一块内存,`a.k` 的赋值操作覆盖了 `a.u.x` 的值。
4. 类型定义语句 -- typedef
`typedef` 关键字用于为现有的数据类型创建别名。这可以提高代码的可读性和简洁性。`typedef` 的语法格式如下:
typedef 现有类型名 新类型名;
例如,为 `double` 类型创建两个别名 `length` 和 `width`:
typedef double length, width;width b;
通过 `typedef`,你可以为复杂的类型创建更易读的别名,从而简化代码。
以上介绍了几种常见的自定义数据类型。结构体在实际编程中应用广泛,而联合体则在特定场景下非常有用。希望这些内容能帮助你更好地理解和使用C++中的自定义数据类型。