【2016-08-18】转载:总结C++中几种结构体初始化的方法

做者:Ac_Vonhtml

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

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

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

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

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

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

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

我这里总结三种方法,若是你们有什么好的方法,不妨加上去:继承

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

2、继承模板类初始化

3、定义时初始化

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

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

总结分析:

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

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

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

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

相关文章
相关标签/搜索