总结几种结构体初始化的方法
结构体能自由组装数据,是一种很常见的数据打包方法。当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。对于定义的任何变量,我们最好都先初始化。
除了使用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填充。
总结分析:
以上三种,是据我所知的初始化结构体方法。
前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。
如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。
看看微软定义的结构体,基本上都没有构造函数和析构函数。因为结构体的意义很明确,它仅仅是对数据的一个包装,如果加上了方法,其意义就变了。
总结几种结构体初始化的方法相关推荐
- 总结几种结构体初始化方法 (转)
结构体能自由组装数据,是一种很常见的数据打包方法.当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现.对于定义的任何变量,我们最好都先初始化. 除了使用memset和Z ...
- C语言结构体初始化的几种方法
一.介绍 结构体作为数据结构的基础,经常使用,其中初始化也有几种方法,这里详细介绍 二.常规初始化(先定义再初始化) typedef struct {int bandrate;int databits ...
- C语言的几种结构体Struct的赋值方法
C语言的几种结构体Struct的赋值方法 1. 定义结构体类型 这里是两个结构体的基本结构. struct Init{int a;float b;double c; }I1; struct SIMPL ...
- 嵌套结构体初始化的几种方式
嵌套结构体初始化的几种方式 #结构体定义 structA define typedef struct {char a;int b;float c; }struct_A_s; structB defin ...
- 结构体初始化的几种方式
结构体初始化的几种方式 无构造方法的结构体初始化 创建一个结构体 struct STUDENT {string name;int age;string sex; } 定义时赋值 // 定义时赋值,通过 ...
- Go 学习笔记(33)— Go 自定义类型 type(自定义结构体、结构体初始化、结构体内嵌、自定义接口)
1. 自定义类型格式 用户自定义类型使用关键字 type ,其语法格式是: type newType oldType oldType 可以是自定义类型.预声明类型.未命名类型中的任意一种. newTy ...
- WIN7 UAC/结构体的Equals方法/C# 开发wince程序,窗口上总留有一块空白区域/静态构造函数...
1. vs2005在win7下通过IIS7调试时,调用dll失败,但在XP下正常.相信是权限问题,请问应该如何解决?能不能设置dll默认以管理员身分运行? 备注:此DLL已注册成功! 回复引用 全部回 ...
- c++ 结构体初始化_【干货】c语言基础语法——结构体
1.关于C语言结构体的引入 学习环境搭建1_Linux C语言_嵌入式开发工程师-创客学院www.makeru.com.cn 在实际问题中有时候我们需要几种数据类型一起来修饰某个变量. 例如一个学生 ...
- c++ 结构体初始化_STM32入门系列-使用库函数点亮LED,LED初始化函数
要点亮LED,需要完成LED的驱动, 在工程模板上新建一个led.c和led.h文件,将其存放在led文件夹内.这两个文件需要我们自己编写. 通常xxx.c文件用于存放编写的驱动程序,xxx.h文件用 ...
最新文章
- flux读取不到数据_spring-webflux两种开发模式,获取不到使用ajax的post提交的数据?...
- Elasticsearch的或且非及其组合
- 你所忽略的DNS---DNS实战及深度解读
- vant 索引城市不对_Vant Area 省市区选择
- Translation
- 【算法学习】B-Tree编程实现(C++模板类封装)
- [转]Mysql explain用法和性能分析
- 将python程序打包成可执行文件exe
- 用python画大白圣诞快乐呦
- ffmpeg 最简单的转码封装mp4文件
- visio2016下载与安装
- 如何将ppt压缩到最小?
- Python人脸识别 Python3.7+OpenCV+Dlib+罗技C920摄像头 实现离线实时摄像头画面人脸检测+识别
- 防火墙阻止了IE服务器未响应,ie防火墙如何禁用
- # 杂谈偶感 × 基于QFD方法的质量屋构建
- QDockWidget增加边框
- Android color.xml设置透明度
- 安装python3.x解释器步骤,Windows下使Python2.x版本的解释器与3.x共存的方法
- win10安装sshpass_安装sshpass
- 软件测试Bug评测 之Serverity(严重程度)、Priority(优先级)
热门文章
- 利用oc门或od门实现线与_OD门、OC门和三态门的主要作用和应用
- 读《一个叫欧维的男人决定去死》
- 修改Chrome谷歌浏览器默认安装路径
- 【大数据开发运维解决方案】hadoop fs常用命令案例解释
- 技术,不要做成孤胆英雄
- Oracle数据备份(服务器端)——expdp
- 织梦塔扇风扇空调扇等制冷设备展示公司网站模板(带手机端)
- 开好会议的方法 会议达成共识 明确目标,促成共识 单向会议 互动会议 会议讨论,文档先行 会前文档 会中 3D法则讨论 同步会议,跟进代办 举个栗子 企业管理
- 【Web】JavaScript——基础语法入门篇
- (kuangbin带你飞--最短路径)MPI Maelstrom(dijstra模板题)