定义方式总结
在C++中,结构体(struct)的定义主要有多种形式,,你还可以在定义结构体时直接初始化它的成员,或者在定义后创建结构体的实例。以下是一些例子:
- 定义并初始化结构体:
struct Polygon {
Point points[4] = {}; // 初始化为默认值
Point normal = {0, 0, 0};
Point orientation = {0, 0, 0};
float edgeline_width = 0.0f;
};
- 定义结构体并创建实例:
struct {
Point points[4];
Point normal;
Point orientation;
float edgeline_width;
} polygon1, polygon2; // 创建了两个Polygon实例,polygon1和polygon2
- 使用typedef定义结构体:
typedef struct {
Point points[4];
Point normal;
Point orientation;
float edgeline_width;
} Polygon;
在这种情况下,Polygon
是类型的名称,你可以用它来声明对象,就像你在第一种写法中所做的那样。
- 在C++11及以后的版本中,你还可以使用列表初始化(也称为花括号初始化)来初始化结构体的成员:
struct Polygon {
Point points[4];
Point normal;
Point orientation;
float edgeline_width;
};
Polygon polygon = {{0, 0, 0, 0}, {0, 0, 0}, {0, 0, 0}, 0.0f};
在这个例子中,我们使用一个初始化列表来设置polygon
的成员的值。
不同写法的对比一
在C++中,这两种写法有着不同的含义,该结构体包含一个Point
数组(包含4个元素)、两个Point
对象(normal
和orientation
)以及一个float
类型的edgeline_width
。
第一种写法:
struct Polygon {
Point points[4];
Point normal;
Point orientation;
float edgeline_width;
};
第二种写法:
struct {
Point points[4];
Point normal;
Point orientation;
float edgeline_width;
} Polygon;
在这两种情况下,你都可以创建一个Polygon
类型的对象,如下所示:
Polygon polygon;
第一种写法定义了一个名为Polygon
的结构体类型。这个类型包含了四个Point
类型的数组points
,两个Point
类型的变量normal
和orientation
,以及一个float
类型的变量edgeline_width
。这个定义并没有分配任何内存,它只是定义了一个类型。你可以使用这个类型来声明变量,如Polygon p;
,这时候才会为变量p
分配内存。
第二种写法定义了一个匿名结构体,并立即声明了一个该匿名结构体类型的变量Polygon
。这个变量Polygon
的类型是匿名的,你不能再声明其他同类型的变量(除非你复制这个匿名结构体的定义)。这个声明会为变量Polygon
分配内存。
所以,第一种形式只是声明了类型,而第二种形式声明了一个变量并为它分配了内存。
不同写法的对比二
这两种写法的区别在于typedef
的使用。
在C和C++中,typedef
是一个关键字,用于为类型定义一个新的名字。这可以使代码更清晰,更易于理解。
struct {
Point points[4];
Point normal;
Point orientation;
float edgeline_width;
} Polygon;
这段代码定义了一个匿名结构体,并声明了一个这种类型的变量Polygon
。你不能使用Polygon
作为类型来声明其他变量,因为Polygon
是一个变量名,而不是类型名。
typedef struct {
Point points[4];
Point normal;
Point orientation;
float edgeline_width;
} Polygon;
这段代码使用typedef
定义了一个新的类型名Polygon
,这个类型是一个结构体。你可以使用Polygon
作为类型来声明其他变量,例如Polygon p;
。
所以,主要的区别在于typedef
的使用。使用typedef
可以为类型定义一个新的名字,使得代码更清晰,更易于理解。