zoukankan      html  css  js  c++  java
  • 【2016-08-18】转载:总结C++中几种结构体初始化的方法

    作者:Ac_Von

    博客地址:http://www.cnblogs.com/vongang/

    文章地址:http://www.cnblogs.com/vongang/archive/2011/07/30/2122076.html

    结构体能自由组装数据,是一种很常见的数据打包方法。

    当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。

    在编程时对于定义的任何变量,我们最好都先初始化。

    除了使用memsetZeroMemory之外,有没有更简单的方法初始化呢?

    因为有时候每定义一个结构体,就使用一次memset,这样很繁琐,同时有时候也需要给结构体中的一些变量赋一些非0的默认值。

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

    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));

      }
     };

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

    二、继承模板类初始化

    首先定义一个模板基类:
    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]; 
        };

    这样也能实现初始化。

    三、定义时初始化

        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填充。

    总结分析:

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

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

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

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

  • 相关阅读:
    EIGRP-16-其他和高级的EIGRP特性-2-非等价负载分担
    EIGRP-15-其他和高级的EIGRP特性-1-路由器ID
    EIGRP-14-EIGRP的命名模式
    EIGRP-13-弥散更新算法-停滞在活动状态
    EIGRP-12-弥散更新算法-DUAL的FSM(*没写完)
    EIGRP-11-弥散更新算法-EIGRP中的本地计算和弥散计算
    EIGRP-10-弥散更新算法-计算距离,报告距离,可行距离和可行性条件
    EIGRP-9-弥散更新算法-拓扑表
    EIGRP-8-路由器的邻接关系
    EIGRP-7-可靠传输协议
  • 原文地址:https://www.cnblogs.com/dengwenwu/p/5783820.html
Copyright © 2011-2022 走看看