aytony

求古寻论,散虑逍遥。

0%

C++结构化数据类型

struct:结构体

一般用于定义一组不同类型的数据。

定义

1
2
3
4
5
6
struct structure_name
{
int member1;
char member2;
float member3;
};

以上代码声明了一个名为 structure_name 的结构体类型,其拥有三个成员。

结构体的成员可以是其他类型的结构体。

1
2
3
4
5
struct structure_embed
{
int memb1;
structure_name memb2;
};

实例化

定义结构体时可以顺便实例化。

1
2
3
4
5
6
struct structure_name
{
int member1;
char member2;
float member3;
} s;
以上代码在定义结构体时同时实例化对象s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 创建一个 structure_name 类型的对象 s1
structure_name s1;

// 创建对象 s2, s3, s4 并用四种写法分别初始化
structure_name s2{1, 'a', 1.0f};
structure_name s3 = {1, 'a', 1.0f};
structure_name s4;
s4.member1 = 1;
s4.member2 = 'a';
s4.member3 = 1.0f;
structure_name s5{ .member3 = 1.0f };

// 创建指向对象的指针 ps 并初始化
structure_name *ps = new structure_name{1, 'a', 2.0f};
1
2
structure_name s2{1, 'a', 1.0f};
structure_name *ps = new structure_name{1, 'a', 2.0f};

以上写法利用了initializer_list特性,自C++11起受到支持,建议使用此种写法。

1
structure_name s5{ .member3 = 1.0f };

以上写法自C++20起受到支持。

访问对象成员

在结构体对象名后面加上.运算符访问成员。

1
printf("%d\n", s2.member1); // 输出 s2 的 member1 成员

特别地,对于结构体指针,在指针后面可以加上->运算符直接访问指针指向的对象的成员。

1
printf("%d\n", ps->member1);

对象成员赋值

1
2
s1.member1 = 100;
ps->member1 = 100;

结构体赋值运算符

可以用=运算符在同类型结构体间赋值。

1
s1 = s3;

匿名临时结构体

不填写结构体名字,结构体定义+实例化一次完成。

1
2
3
4
5
6
struct
{
int year;
int month;
int day;
} date;

enum:枚举

在一个整型(默认为int)的基础上,定义一系列相关的符号标志。

定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 弱枚举
enum COLORS
{
COLORS_RED, // COLORS_RED = 0
COLORS_GREEN, // COLORS_GREEN = 1
COLORS_BLUE, // COLORS_BLUE = 2
COLORS_ORNAGE, // COLORS_ORNAGE = 4
COLORS_VIOLET = 0xffffffff // COLORS_VIOLET = 0xffffffff
};

// 强枚举
enum class UNIVERSITIES
{
T, // static_cast<int>(UNIVERSITIES::T) = 0
P // status_cast<int>(UNIVERSITIES::P) = 1
};

强枚举类型在 C++11 加入,更加安全严谨,建议使用强枚举代替枚举。

访问枚举

1
2
3
4
5
6
7
8
9
// 访问弱枚举
printf("%d\n", COLORS_RED);

// 直接访问强枚举
printf("%d\n", static_cast<int>(UNIVERSITIES::T));

// 在声明使用强枚举之后,直接访问强枚举
using enum UNIVERSITIES;
printf("%d\n", static_cast<int>(T));
1
using enum UNIVERSITIES;

以上using enum写法自C++20起受到支持。

实例化

强枚举类型不可隐式转换。

1
2
3
4
5
6
7
8
// 弱枚举
colors c_c = COLORS_RED; // valid
int i_c = COLORS_RED; // valid

// 强枚举
universities u_u = UNIVERSITIES::T; // valid
int i_u = UNIVERSITIES::T; // invalid!
int i_u2 = static_cast<int>(UNIVERSITIES::T); // valid

修改枚举基础类型

1
2
3
4
5
6
enum class ADC : short  // 基于 short 类型的强枚举
{
JINX,
MISS_FORTUNE,
LUCIAN
};

union: 共用体

占用相同内存空间的不同变量,曾用于节省空间。现在基本不用,只有很少模块使用,如C++ socket编程。

定义

1
2
3
4
5
6
union value
{
int int_val;
long long_val;
double double_val;
};

占用最大成员大小的空间。

使用

1
2
3
value v;
v.int_val = 15; // v 中存储 int 类型变量
v.double_val = 1.38f; // v 中存储 double 类型变量,int 变量被覆盖