目录
- 引言
- 结构体
- 结构体类型声明方法
- 有名字
- 无名字
- 结构体变量的声明方法
- 初始化
- 成员赋值
- 成员调用方法
- 取成员运算符
- .
- ->
- 取成员运算符
- 结构体大小
- 内存对齐
- 结构体类型声明方法
- 链表
- 单向链表
- 双向链表
- C++独有特性
- 声明变量可以不用struct关键字
- 可以放函数成员
- 结论
- 参考资料
1. 引言
在C++语言中,结构体(struct)是一种用于组织数据的复合类型。它可以包含不同类型的成员变量和函数成员,并且可以通过成员运算符来访问和操作这些成员。本篇博客将详细介绍C++中结构体的各种特性,并提供具体的代码示例。
2. 结构体
2.1 结构体类型声明方法
在C++中,结构体可以通过有名字或无名字的方式进行类型声明。有名字的结构体可以在声明时定义成员变量和函数成员,而无名字的结构体通常用于定义匿名对象或作为其他结构体的成员。
有名字的结构体类型声明
struct Person
{
std::string name;
int age;
};
无名字的结构体类型声明
struct
{
std::string name;
int age;
} anonymousPerson;
2.2 结构体变量的声明方法
结构体变量可以通过初始化或成员赋值的方式进行声明。
初始化结构体变量
Person person = {"John", 25};
成员赋值
Person person;
person.name = "John";
person.age = 25;
2.3 成员调用方法
可以使用成员运算符.
和->
来调用结构体的成员变量和成员函数。
使用.
操作符
std::cout << person.name << std::endl;
使用->
操作符
如果结构体变量是指针类型,则需要使用->
操作符来访问成员。
Person* personPtr = &person;
std::cout << personPtr->name << std::endl;
2.4 结构体大小
结构体的大小由其成员变量的大小累加而成,但在内存中的存储可能会存在对齐的问题。
内存对齐
为了提高访问效率和内存对齐的要求,编译器通常会在结构体成员之间添加额外的填充字节,使得结构体在内存中的起始地址和每个成员变量的
地址都满足对齐要求。对齐方式和字节对齐的具体规则可能因编译器和平台而异。
3. 链表
链表是一种常见的数据结构,用于存储和组织具有相同类型的数据。在C++中,可以使用结构体来定义和操作链表。
单向链表
单向链表每个节点包含一个数据元素和一个指向下一个节点的指针。
struct Node
{
int data;
Node* next;
};
双向链表
双向链表的节点除了包含数据元素和指向下一个节点的指针外,还包含一个指向前一个节点的指针。
struct Node
{
int data;
Node* prev;
Node* next;
};
4. C++独有特性
在C++中,结构体相比于C语言具有一些独有的特性。
声明变量可以不用struct关键字
在C++中,可以省略struct
关键字直接声明结构体变量。
Person person;
可以放函数成员
C++的结构体中可以包含函数成员,这使得结构体更加灵活,可以封装数据和操作函数于一体。
struct Node
{
int data;
void printData()
{
std::cout << "Data: " << data << std::endl;
}
};
可以通过结构体变量调用函数成员。
Node node;
node.printData();
5. 结论
本篇博客介绍了C++中结构体的各种特性和用法。通过结构体,我们可以灵活地组织数据和操作,实现复杂的数据结构和算法。同时,C++独有的特性使得结构体更加强大和灵活,为编程提供了更多的选择和便利。