• 总结几种结构体初始化的方法


    结构体能自由组装数据,是一种很常见的数据打包方法。当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。对于定义的任何变量,我们最好都先初始化。

     

    除了使用memsetZeroMemory之外,有没有更简单的方法初始化呢?因为有时候每定义一个结构体,就使用一次memset,也会觉得很繁琐。

     

    我这里总结三种方法,如果大家有什么好的方法,不妨加上去。

     

    1、结构体的构造函数中初始化。

     

    2、继承模板类初始化

     

    3、定义时初始化

    在C++中,结构体与类在使用上已没有本质上的区别了,所以可以使用构造函数来初始化。如下代码所示:

      struct Stu
     {
      int  nNum;
      bool bSex;
      char szName[20];
      char szEmail[100];

      //构造函数初始化
      Stu()
      {
       nNum = 0;
       bSex = false;
       memset(szName,0,sizeof(szName));
       memset(szEmail,0,sizeof(szEmail));

      }
     };

    你可能已经发现了,如果结构体中有大量成员,一个个赋值,相当麻烦。那么你可以这样写:

     struct Stu
     {
      int  nNum;
      bool bSex;
      char szName[20];
      char szEmail[100];

      //构造函数初始化
      Stu()
      {
        memset(this,0,sizeof(Stu));
        //或者是下面的格式
        //memset(&nNum,0,sizeof(Stu));

      }
     };

    如果在结构体中分配了指针,并且指针指向一个堆内存,那么就在析构函数中释放。以上便是在构造函数中初始化。

    2、继承模板类初始化

    首先定义一个模板基类:
    template <typename T>
    class ZeroStruct
    {
    public:
        ZeroStruct()
        {
            memset(this,0,sizeof(T));
        }
    };

    之后定义的结构体都继承于此模板类。 

        struct Stu:ZeroStruct<Stu>
        {
            int        nNum;
            bool    bSex;
            char    szName[20];
            char    szEmail[100];
        };

    这样也能实现初始化。

    3、定义时初始化。

        struct Stu
        {
            int        nNum;
            bool    bSex;
            char    szName[20];
            char    szEmail[100];
        }; 

    //定义时初始化
    Stu stu1 = {0};

    在有的结构体中,第一个成员表示结构体的大小,那么就可以这样初始化:

     struct Stu
     {
    int nSize; //结构体大小
      int  nNum;
      bool bSex;
      char szName[20];
      char szEmail[100];
     };


     Stu stu1 = {sizeof(Stu),0};

    后面的0,可以省略掉,直接写成:Stu stu1 = {sizeof(Stu)};后面自动会用0填充。

    总结分析:

    以上三种,是据我所知的初始化结构体方法。

    前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。

    如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。

    看看微软定义的结构体,基本上都没有构造函数和析构函数。因为结构体的意义很明确,它仅仅是对数据的一个包装,如果加上了方法,其意义就变了。

  • 相关阅读:
    智慧养老民政监管平台建设方案
    CF600E Lomsat gelral dsu on tree
    dsu on tree详解
    【Spring 从0开始】Spring5 新功能,整合日志框架 Log4j2
    【Spring 从0开始】JdbcTemplate 数据库事务管理
    【Spring 从0开始】JdbcTemplate 数据库事务参数
    【Spring 从0开始】JdbcTemplate 数据库事务管理
    【Spring 从0开始】JdbcTemplate 操作数据库
    【Spring 从0开始】AOP 操作
    【Spring 从0开始】AOP 操作中的相关术语、环境准备
  • 原文地址:https://www.cnblogs.com/vongang/p/2122076.html
Copyright © 2020-2023  润新知