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

除了使用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填充。

总结分析:

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

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

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

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

总结几种结构体初始化的方法相关推荐

  1. 总结几种结构体初始化方法 (转)

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

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

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

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

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

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

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

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

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

  6. Go 学习笔记(33)— Go 自定义类型 type(自定义结构体、结构体初始化、结构体内嵌、自定义接口)

    1. 自定义类型格式 用户自定义类型使用关键字 type ,其语法格式是: type newType oldType oldType 可以是自定义类型.预声明类型.未命名类型中的任意一种. newTy ...

  7. WIN7 UAC/结构体的Equals方法/C# 开发wince程序,窗口上总留有一块空白区域/静态构造函数...

    1. vs2005在win7下通过IIS7调试时,调用dll失败,但在XP下正常.相信是权限问题,请问应该如何解决?能不能设置dll默认以管理员身分运行? 备注:此DLL已注册成功! 回复引用 全部回 ...

  8. c++ 结构体初始化_【干货】c语言基础语法——结构体

    1.关于C语言结构体的引入 学习环境搭建1_Linux C语言_嵌入式开发工程师-创客学院​www.makeru.com.cn 在实际问题中有时候我们需要几种数据类型一起来修饰某个变量. 例如一个学生 ...

  9. c++ 结构体初始化_STM32入门系列-使用库函数点亮LED,LED初始化函数

    要点亮LED,需要完成LED的驱动, 在工程模板上新建一个led.c和led.h文件,将其存放在led文件夹内.这两个文件需要我们自己编写. 通常xxx.c文件用于存放编写的驱动程序,xxx.h文件用 ...

最新文章

  1. flux读取不到数据_spring-webflux两种开发模式,获取不到使用ajax的post提交的数据?...
  2. Elasticsearch的或且非及其组合
  3. 你所忽略的DNS---DNS实战及深度解读
  4. vant 索引城市不对_Vant Area 省市区选择
  5. Translation
  6. 【算法学习】B-Tree编程实现(C++模板类封装)
  7. [转]Mysql explain用法和性能分析
  8. 将python程序打包成可执行文件exe
  9. 用python画大白圣诞快乐呦
  10. ffmpeg 最简单的转码封装mp4文件
  11. visio2016下载与安装
  12. 如何将ppt压缩到最小?
  13. Python人脸识别 Python3.7+OpenCV+Dlib+罗技C920摄像头 实现离线实时摄像头画面人脸检测+识别
  14. 防火墙阻止了IE服务器未响应,ie防火墙如何禁用
  15. # 杂谈偶感 × 基于QFD方法的质量屋构建
  16. QDockWidget增加边框
  17. Android color.xml设置透明度
  18. 安装python3.x解释器步骤,Windows下使Python2.x版本的解释器与3.x共存的方法
  19. win10安装sshpass_安装sshpass
  20. 软件测试Bug评测 之Serverity(严重程度)、Priority(优先级)

热门文章

  1. 利用oc门或od门实现线与_OD门、OC门和三态门的主要作用和应用
  2. 读《一个叫欧维的男人决定去死》
  3. 修改Chrome谷歌浏览器默认安装路径
  4. 【大数据开发运维解决方案】hadoop fs常用命令案例解释
  5. 技术,不要做成孤胆英雄
  6. Oracle数据备份(服务器端)——expdp
  7. 织梦塔扇风扇空调扇等制冷设备展示公司网站模板(带手机端)
  8. 开好会议的方法 会议达成共识 明确目标,促成共识 单向会议 互动会议 会议讨论,文档先行 会前文档 会中 3D法则讨论 同步会议,跟进代办 举个栗子 企业管理
  9. 【Web】JavaScript——基础语法入门篇
  10. (kuangbin带你飞--最短路径)MPI Maelstrom(dijstra模板题)