总结C++中的几种结构体初始化的方法

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

 

 

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

 

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

 

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

 

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

 

2、继承模板类初始化

 

3、定义时初始化

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

 

 
  1. struct Stu

  2. {

  3. int nNum;

  4. bool bSex;

  5. char szName[20];

  6. char szEmail[100];

 

 

  //构造函数初始化

 

 
  1. Stu()

  2. {

  3. nNum = 0;

  4. bSex = false;

  5. memset(szName,0,sizeof(szName));

  6. memset(szEmail,0,sizeof(szEmail));

  7.  
  8. }

  9. };


 

 

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

 
  1. struct Stu

  2. {

  3. int nNum;

  4. bool bSex;

  5. char szName[20];

  6. char szEmail[100];

  7.  
  8. //构造函数初始化

  9. Stu()

  10. {

  11. memset(this,0,sizeof(Stu));

  12. //或者是下面的格式

  13. //memset(&nNum,0,sizeof(Stu));

  14.  
  15. }

  16. };


 

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

2、继承模板类初始化

首先定义一个模板基类:

 
  1. template <typename T>

  2. class ZeroStruct

  3. {

  4. public:

  5. ZeroStruct()

  6. {

  7. memset(this,0,sizeof(T));

  8. }

  9. };


 

 

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

 

 
  1. struct Stu:ZeroStruct<Stu>

  2. {

  3. int nNum;

  4. bool bSex;

  5. char szName[20];

  6. char szEmail[100];

  7. };


 

 

这样也能实现初始化。

3、定义时初始化。

 

 
  1. struct Stu

  2. {

  3. int nNum;

  4. bool bSex;

  5. char szName[20];

  6. char szEmail[100];

  7. };



//定义时初始化 

Stu stu1 = {0};

 

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

 

 
  1. struct Stu

  2. {

  3. int nSize; //结构体大小

  4. int nNum;

  5. bool bSex;

  6. char szName[20];

  7. char szEmail[100];

  8. };

 

 

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

 

 

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

总结分析:

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值