• C++之struct匿名结构体实例(二百四十四)


    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

    人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

    更多原创,欢迎关注:Android系统攻城狮

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:理解C++之struct匿名结构体用法。

    2.struct匿名结构体用法介绍

    C++中的“匿名结构体”通常也被称为“无名结构体”或“未命名结构体”,是指在结构体定义时没有给予其一个特定的名称。它与普通的有名结构体相比,在语法上有一些差异和特殊用法。

    1. 定义匿名结构体:
      匿名结构体和有名结构体的定义语法相同,都是使用struct关键字,但不提供名称。定义匿名结构体主要用于临时的数据组织和封装,通常作为其他数据类型(如类、其他结构体)的成员。
    struct {
        int id;
        std::string name;
    } student;
    
    • 1
    • 2
    • 3
    • 4

    在上述代码中,我们使用匿名结构体定义了一个名为student的变量。

    1. 初始化匿名结构体:
      初始化匿名结构体的语法与普通结构体相同,但不能使用结构体名进行初始化。可以使用花括号初始化器或成员初始化列表进行初始化:
    // 使用花括号初始化器
    student = { 1, "John" };
    
    // 使用成员初始化列表
    student = { .id = 2, .name = "Alice" };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 访问匿名结构体的成员:
      访问匿名结构体的成员使用点运算符(.):
    std::cout << "ID: " << student.id << ", Name: " << student.name << std::endl;
    
    • 1
    1. 匿名结构体作为其他数据类型的成员:
      匿名结构体常常被用作其他数据类型(如类或有名结构体)的成员,可以在定义时直接使用匿名结构体来声明成员变量:
    class MyClass {
    public:
        struct {
            int day;
            int month;
            int year;
        } birthdate;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 限定匿名结构体作用域:
      匿名结构体的作用域默认为定义它的代码块,可以使用代码块来限定匿名结构体的作用域。这样可以避免结构体名称与其他结构体冲突。
    {
        struct {
            int id;
            std::string name;
        } student;
        
        student.id = 1;
        student.name = "John";
        
        std::cout << "ID: " << student.id << ", Name: " << student.name << std::endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.实例例子

    v1.0

    #include 
    using namespace std;
    
    struct {
        int x;
        int y;
    } point;
    
    int main() {
        point.x = 3;
        point.y = 4;
    
        cout << "坐标:(" << point.x << ", " << point.y << ")" << endl;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    v2.0

    #include 
    using namespace std;
    
    struct {
        string name;
        int score;
    } student;
    
    int main() {
        student.name = "张三";
        student.score = 90;
    
        cout << "姓名: " << student.name << endl;
        cout << "成绩: " << student.score << endl;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    v3.0

    #include 
    using namespace std;
    
    struct {
        int width;
        int height;
    } rectangle;
    
    int main() {
        rectangle.width = 5;
        rectangle.height = 7;
    
        cout << "宽度: " << rectangle.width << endl;
        cout << "高度: " << rectangle.height << endl;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    v4.0

    #include 
    using namespace std;
    
    struct {
        struct {
            int day;
            int month;
            int year;
        } date;
        struct {
            int hour;
            int minute;
            int second;
        } time;
    } datetime;
    
    int main() {
        datetime.date.day = 10;
        datetime.date.month = 12;
        datetime.date.year = 2021;
    
        datetime.time.hour = 9;
        datetime.time.minute = 30;
        datetime.time.second = 15;
    
        cout << "日期:" << datetime.date.year << "-" << datetime.date.month << "-" << datetime.date.day << endl;
        cout << "时间:" << datetime.time.hour << ":" << datetime.time.minute << ":" << datetime.time.second << endl;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    v5.0

    #include 
    using namespace std;
    
    struct {
        string name;
        int age;
        string department;
    } employee;
    
    int main() {
        employee.name = "李四";
        employee.age = 28;
        employee.department = "销售部门";
    
        cout << "姓名: " << employee.name << endl;
        cout << "年龄: " << employee.age << endl;
        cout << "部门: " << employee.department << endl;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    v6.0

    #include 
    
    typedef void (*HWC2_PFN_CREATE_LAYER)();
    
    struct {
      HWC2_PFN_CREATE_LAYER createLayer;
    } mDispatch = {};
    
    void myCreateLayer() {
      printf("Creating a layer...\n");
    }
    
    int main() {
      mDispatch.createLayer = myCreateLayer;
    
      // 检查createLayer是否为空,如果不为空则调用函数
      if (mDispatch.createLayer != NULL) {
        printf("Calling createLayer function...\n");
        mDispatch.createLayer();
      } else {
        printf("createLayer function is not assigned.\n");
      }
    
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    力扣(LeetCode)16. 最接近的三数之和(C++)
    什么是私有云?您应该知道的 6 个优势
    PHPEXCEL解决行数超过65536不显示问题
    腾讯云轻量2核4G5M服务器双11优惠价166元一年可选三年
    极米十年巅峰之作极米Z7X,能带走的百吋大屏
    SpringBoot SpringBoot 基础篇 3 SpringBoot 整合第三方技术 3.3 SpringBoot 整合 Mybatis
    掌握递归调用栈思想 由浅入深研究递归
    基于php食堂外卖系统
    LeetCode:每日一题【第一周】
    开启新的旅途啦~
  • 原文地址:https://blog.csdn.net/u010164190/article/details/133968665