C++数据类型:结构体(struct)
一. 结构体的定义
基本语法
在C++中,结构体(struct)用于将不同类型的数据组合成一个新的数据类型。结构体的定义以struct关键字开始,后面跟着结构体的名称,然后是花括号内的成员变量列表。例如:
struct Point { int x; int y; };
这里定义了一个名为Point的结构体,它包含两个成员变量x和y,都是int类型。
成员访问权限(默认情况下)
在C++中,结构体成员的默认访问权限是public,这意味着在结构体外部可以直接访问结构体的成员变量。例如:
int main() { Point p; p.x = 10; p.y = 20; return 0; }
二. 结构体的初始化
顺序初始化
可以按照成员变量在结构体中的定义顺序进行初始化。例如:
Point p = {10, 20};
这种初始化方式要求初始化值的顺序和成员变量的顺序一致,并且不能跳过中间的成员变量进行初始化。
指定成员初始化(C++11及以上)
使用指定成员初始化时,可以按照任意顺序初始化结构体的成员变量。例如:
Point p = {.y = 20,.x = 10};
三. 结构体作为函数参数
值传递
当结构体作为函数参数时,可以使用值传递方式。在这种情况下,函数会创建结构体的副本。例如:
void printPoint(Point p) { std::cout << "x: " << p.x << ", y: " << p.y << std::endl; } int main() { Point p = {10, 20}; printPoint(p); return 0; }
值传递的优点是函数内部对结构体的修改不会影响到外部的结构体变量,但对于大型结构体,复制操作可能会导致性能开销。
引用传递
为了避免复制大型结构体带来的性能开销,可以使用引用传递。例如:
void modifyPoint(Point& p) { p.x++; p.y++; } int main() { Point p = {10, 20}; modifyPoint(p); std::cout << "x: " << p.x << ", y: " << p.y << std::endl; return 0; }
在引用传递中,函数内部对结构体的修改会直接影响到外部的结构体变量。
常量引用传递(当函数不需要修改结构体时)
如果函数只需要读取结构体的内容,而不需要修改它,可以使用常量引用传递。例如:
void printPointConst(const Point& p) { std::cout << "x: " << p.x << ", y: " << p.y << std::endl; } int main() { Point p = {10, 20}; printPointConst(p); return 0; }
四. 结构体的嵌套
结构体内部可以包含其他结构体类型的成员变量。例如:
struct Rectangle { Point topLeft; Point bottomRight; }; int main() { Rectangle r; r.topLeft.x = 10; r.topLeft.y = 20; r.bottomRight.x = 30; r.bottomRight.y = 40; return 0; }
在这个例子中,Rectangle结构体包含了两个Point结构体类型的成员变量,用于表示矩形的左上角和右下角坐标。
五. 结构体与类的区别
在C++中,结构体和类非常相似,但有一些区别。结构体成员的默认访问权限是public,而类成员的默认访问权限是private。此外,在语义上,结构体通常用于表示简单的数据集合,而类更多地用于表示具有行为(成员函数)的数据类型,但这种区别并不是绝对的,结构体也可以有成员函数等。例如:
struct PointWithFunction { int x; int y; void print() { std::cout << "x: " << x << ", y: " << y << std::endl; } }; int main() { PointWithFunction p; p.x = 10; p.y = 20; p.print(); return 0; }
C++编程语言基础
- C++:从入门到工作的教程
- 这是我的第一个 C++程序!
- C++中main函数有什么作用?
- C++中 #include 指令的作用
- C++中常用的预处理指令
- C++中 iostream 头文件定义了什么
- C++名称空间(namespace)
- C++标准库中 std 命名空间定义了些什么
- C++常用的头文件
- C++源代码的发布方式
- C++变量名的定义、变量的作用、使用规范
- C++的关键字列表
- C++数据类型:整型(整数类型)
- 二进制补码、原码、反码
- C++数据类型:char字符型(整数类型)
- ASCII码表及C++字符函数库(cctype)
- 计算机汉字编码
- C++数据类型:bool类型(整数类型)
- C++中 const 限定符
- C++数据类型:浮点数
- C++运算符:算术运算符
- C++运算符:类型转换规则
- 计算机数据存储大小端模式
- C++运算符:位运算 与 bitset类库
- C++运算符:关系运算符与逻辑运算符
- C++流程控制:顺序、选择、循环、跳转语句
- C++函数的定义、参数传递、重载、嵌套
- C++数组:一维、二维、多维数组的运用
- C-style字符串、库函数 与 std::string对象
- C++数据类型:结构体(struct)
- C++数据类型:联合体(union)
- C++数据类型:枚举(enum)
- C++数据类型别名:typedef
- C++指针
- C++内存操作符:new分配 与 delete释放
- C++标准模板库(STL)容器、算法、迭代器
- C++标准模板库(STL)vector顺序容器
- C++标准模板库(STL)array固定容器
- C++标准模板库(STL)list双向链表容器
- C++标准模板库(STL)deque双端队列
- C++标准模板库(STL)集合 set 关联容器
- C++标准模板库(STL)map关联容器
- C++标准模板库(STL)unordered_set
- C++标准模板库(STL)unordered_map
- C++标准模板库(STL)algorithm算法库
- C++文件操作
- C++数学库(cmath)数学常量与数学函数
- C++模板:函数模板、类模板
- C++与SQLite3联合打造实用的应用程序
- C++实战开发中常用的库(概述)
- 第二部分:C++面向对象编程
- C++:类的定义与声明、类对象应用
- 第三部分:数据结构与算法(概述)
- 第一部分:C++语言简介与学习路线