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

除了使用memset和ZeroMemory之外,有没有更简单的方法初始化呢?因为有时候每定义一个结构体,就使用一次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填充。

总结分析:

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

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

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

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

转载于:https://www.cnblogs.com/kalo1111/archive/2013/04/05/3000925.html

总结几种结构体初始化方法 (转)相关推荐

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

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

  2. C++结构体初始化方法

    在 C++ 里可以将结构体看作没有任何成员函数的对象,下面对 C++ 结构体的几种初始化方法进行总结. 文章目录 直接赋值 利用函数赋值 构造函数初始化 直接赋值 #include <bits/ ...

  3. C语言骚操作:结构体初始化方法

    首先定义俩结构体: typedef struct {int a0;int b0; }S0;typedef struct {int a1;int b1;S0 s0; }S1; 首先想到的初始化方法是: ...

  4. Go 结构体初始化:

    Go中的结构体初始化方法示例如下: package mainimport ("fmt" )type ListNode struct {Val intNext *ListNode } ...

  5. C语言结构体初始化的几种方法

    一.介绍 结构体作为数据结构的基础,经常使用,其中初始化也有几种方法,这里详细介绍 二.常规初始化(先定义再初始化) typedef struct {int bandrate;int databits ...

  6. struct结构体初始化3种方法

    From: http://blog.csdn.net/thdxs/article/details/8204118 struct是C中重要的ADT.但是在一般讲C的书中,往往只介绍了struct的定义. ...

  7. C语言的几种结构体Struct的赋值方法

    C语言的几种结构体Struct的赋值方法 1. 定义结构体类型 这里是两个结构体的基本结构. struct Init{int a;float b;double c; }I1; struct SIMPL ...

  8. 嵌套结构体初始化的几种方式

    嵌套结构体初始化的几种方式 #结构体定义 structA define typedef struct {char a;int b;float c; }struct_A_s; structB defin ...

  9. 结构体初始化的几种方式

    结构体初始化的几种方式 无构造方法的结构体初始化 创建一个结构体 struct STUDENT {string name;int age;string sex; } 定义时赋值 // 定义时赋值,通过 ...

最新文章

  1. plt.hist绘制直方图参数density 为True和False分别代表是否归一化 参数orientation决定了是采用纵轴代表频率还是横轴代表频率的展现形式
  2. 用费曼技巧自学编程,香不香?
  3. mysql导入的时候提示“1046-No Database selected”的解决办法
  4. aspose 转pdf表格大小乱了_自己写了一个小工具类:pdf转word,没有页数和大小限制,保真!...
  5. RecycleView实现多布局可展开列表
  6. 基于Swift的简易iOS天气APP
  7. Java集合框架源码解读(3)——LinkedHashMap
  8. 32位计算机怎么安装ps,Ps安装包怎么安装到电脑上,Ps安装本地安装技巧
  9. 电子计算机为什么123安不出来,方正软件常见问题及其解决办法-精.doc
  10. 饿了么客户端透明代理 Samaritan详细介绍
  11. 人在旅途——》张家界之旅:20190420
  12. 【老王的脑科学谬论】为什么盲人的听觉“似乎”比正常人更“灵敏”?
  13. 合金电阻参数选型资料
  14. 2-44钟静雯_day03
  15. 令人愉悦的性能统计分析工具-hiper 【发个copy】
  16. 腾讯手游助手android文件夹,腾讯手游助手安装的apk在哪个文件夹?腾讯手游助手游戏安装目录介绍...
  17. NTP时钟同步原理及误差简析
  18. 辞旧迎新:元旦,春节放假通知
  19. 【呆鸟译Py】数据分析师进阶必备6大数学利器
  20. 【零信任落地案例】指掌易某集团灵犀・SDP零信任解决方案

热门文章

  1. 使用saltstack编译安装nginx
  2. SiteMesh学习入门
  3. tomcat内存溢出(修改catalina.bat后windows启动tomcat服务没有效果) | 王猛的个人主页...
  4. [转]Laravel 4之Eloquent ORM
  5. linux 系统yum下安装vnc
  6. Word2010使用技巧之四:页眉的另类使用
  7. linux /etc/目录_Linux / etc /目录的版本控制
  8. 开发环境与工具部署服务_开发与部署之间的区别
  9. 枚举类型 实现一个enumeration对于类的加工的函数
  10. CSS 背景附着 background-attachment属性