C++ 结构体声明(定义)以及不同写法的差异

C++ 结构体声明(定义)以及不同写法的差异_第1张图片


定义方式总结

在C++中,结构体(struct)的定义主要有多种形式,,你还可以在定义结构体时直接初始化它的成员,或者在定义后创建结构体的实例。以下是一些例子:

  1. 定义并初始化结构体:
struct Polygon {
  Point points[4] = {}; // 初始化为默认值
  Point normal = {0, 0, 0};
  Point orientation = {0, 0, 0};
  float edgeline_width = 0.0f;
};
  1. 定义结构体并创建实例:
struct {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
} polygon1, polygon2; // 创建了两个Polygon实例,polygon1和polygon2
  1. 使用typedef定义结构体:
typedef struct {
  Point points[4];
  Point normal;
  Point orientation;
  float edgeline_width;
} Polygon;

在这种情况下,Polygon是类型的名称,你可以用它来声明对象,就像你在第一种写法中所做的那样。

  1. 在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对象(normalorientation)以及一个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类型的变量normalorientation,以及一个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可以为类型定义一个新的名字,使得代码更清晰,更易于理解。


你可能感兴趣的:(C/C++,编程世界:,探索C/C++的奥妙,c++,开发语言,qt,linux,c语言)