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; }