c++ 取结构体成员名称_C++结构体完全攻略(超详细)

结构体是一个由程序员定义的数据类型,可以容纳许多不同的数据值。在过去,面向对象编程的应用尚未普及之前,程序员通常使用这些从逻辑上连接在一起的数据组合到一个单元中。一旦结构体类型被声明并且其数据成员被标识,即可创建该类型的多个变量,就像可以为同一个类创建多个对象一样。

虽然今天结构体较少使用,但知道它们是什么,以及如何使用它们仍然很重要,这并不仅仅是因为可以在较老的程序中遇到它们,还因为在某些情况下,类的实例无法使用,这时必须使用结构体。

声明结构体的方式和声明类的方式大致相同,其区别如下:

使用关键字 struct 而不是关键字 class。

尽管结构体可以包含成员函数,但它们很少这样做。所以,通常情况下结构体声明只会声明成员变量。

结构体声明通常不包括 public 或 private 的访问修饰符。

类成员默认情况是私有的,而结构体的成员则默认为 public。程序员通常希望它们保持公开,只需使用默认值即可。

以下是一个结构体声明的示例,该结构体将 5 个变量绑定在一起,保存了员工的工资单数据。这个特殊结构体的名称是 PayRoll。请注意,它以大写字母开头,这和类名使用大写字母开头的约定一样。另外还要注意,与类声明一样,在结构体声明的大括号后面必须有一个分号。

struct PayRoll

{

int empNumber;

string name;

double hours,payRate,grossPay;

};

正如在类的对象被创建之前,类声明不会被实例化一样,结构体声明不会创建任何结构体的实例。本示例中的结构体声明只是告诉编译器PayRoll结构体看起来的样子。它本质上是创建一个名为 PayRoll 的新数据类型。

定义 PayRoll 结构体的变量和定义其他任何变量的方式并无二致,首先列出数据类型,然后是变量名称。以下定义语句创建了 PayRoll 结构体的 3 个变量:

PayRoll deptHead, foreman, associate;

它们每一个都是 PayRoll 结构体的实例,可以被分配和拥有自己的内存,以保存其成员数据。请注意,尽管 3 个结构体变量具有不同的名称,但每个变量都包含具有相同名称的成员,如图 1 所示。

图 1 每个结构体变量都包含具有相同名称的成员

初始化结构体

当定义结构体变量时,可以通过两种方式初始化它:使用初始化列表或构造函数。

初始化列表

初始化结构体变量成员的最简单的方法是使用初始化列表。初始化列表是用于初始化一组内存位置的值列表。列表中的项目用逗号分隔并用大括号括起来。

例如,假设已经声明了以下 Date 结构体:

struct Date

{

int day, month, year;

};

定义和初始化 Date 变量的方式是:先指定变量名,后接赋值运算符和初始化列表,如下所示:

Date birthday = {23, 8, 1983};

该声明定义 birthday 是一个 Date 结构体的变量,大括号内的值按顺序分配给其成员。所以 birthday 的数据成员已初始化,如图 2 所示。

图 2 已经初始化的 birthday 的数据成员

也可以仅初始化结构体变量的部分成员。例如,如果仅知道要存储的生日是8月23日, 但不知道年份,则可以按以下方式定义和初始化变量:

Date birthday = {23,8};

这里只有 day 和 month 成员被初始化,year 成员未初始化。但是,如果某个结构成员未被初始化,则所有跟在它后面的成员都需要保留为未初始化。使用初始化列表时,C++ 不提供跳过成员的方法。以下语句试图跳过 month 成员的初始化。这是不合法的。

Date birthday = {23,1983}; //非法

还有一点很重要,不能在结构体声明中初始化结构体成员,因为结构体声明只是创建一个新的数据类型,还不存在这种类型的变量。例如,以下声明是非法的:

//非法结构体声明

struct Date

{

int d

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中,可以使用反射机制来获取结构体成员名称。具体来说,可以使用模板元编程和宏定义来实现。以下是一个示例代码: ```c++ #include <iostream> #include <string> #include <typeinfo> #define FIELD_NAME(field) #field template <typename T> void print_field_names() { std::cout << "Field names of " << typeid(T).name() << ":" << std::endl; T t; (void)t; // suppress unused variable warning #define FIELD_DEF(field) std::cout << FIELD_NAME(field) << std::endl; T::fields(FIELD_DEF) #undef FIELD_DEF } struct Person { std::string name; int age; std::string address; static void fields(void (*f)(const char *)) { f("name"); f("age"); f("address"); } }; int main() { print_field_names<Person>(); return 0; } ``` 在上面的示例代码中,我们定义了一个 `print_field_names` 函数,它使用模板元编程和宏定义来获取结构体成员名称。具体来说,我们定义了一个 `FIELD_NAME` 宏,它将结构体成员名称转换为字符串。然后,我们定义了一个 `fields` 静态函数,它接受一个函数指针作为参数,将结构体成员名称作为字符串传递给该函数。最后,我们在 `print_field_names` 函数中调用 `fields` 函数,并将一个 lambda 表达式作为参数,该 lambda 表达式将接收到的字符串输出到控制台。 当我们在 `main` 函数中调用 `print_field_names<Person>()` 时,它将输出以下内容: ``` Field names of 6Person: name age address ``` 这里,我们定义了一个 `Person` 结构体,并在其中定义了三个成员变量。然后,我们通过调用 `print_field_names<Person>()` 函数来获取它们的名称

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值