总结几种结构体初始化方法 (转)
结构体能自由组装数据,是一种很常见的数据打包方法。当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。对于定义的任何变量,我们最好都先初始化。
除了使用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
总结几种结构体初始化方法 (转)相关推荐
- 总结几种结构体初始化的方法
结构体能自由组装数据,是一种很常见的数据打包方法.当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现.对于定义的任何变量,我们最好都先初始化. 除了使用memset和Z ...
- C++结构体初始化方法
在 C++ 里可以将结构体看作没有任何成员函数的对象,下面对 C++ 结构体的几种初始化方法进行总结. 文章目录 直接赋值 利用函数赋值 构造函数初始化 直接赋值 #include <bits/ ...
- C语言骚操作:结构体初始化方法
首先定义俩结构体: typedef struct {int a0;int b0; }S0;typedef struct {int a1;int b1;S0 s0; }S1; 首先想到的初始化方法是: ...
- Go 结构体初始化:
Go中的结构体初始化方法示例如下: package mainimport ("fmt" )type ListNode struct {Val intNext *ListNode } ...
- C语言结构体初始化的几种方法
一.介绍 结构体作为数据结构的基础,经常使用,其中初始化也有几种方法,这里详细介绍 二.常规初始化(先定义再初始化) typedef struct {int bandrate;int databits ...
- struct结构体初始化3种方法
From: http://blog.csdn.net/thdxs/article/details/8204118 struct是C中重要的ADT.但是在一般讲C的书中,往往只介绍了struct的定义. ...
- 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; } 定义时赋值 // 定义时赋值,通过 ...
最新文章
- plt.hist绘制直方图参数density 为True和False分别代表是否归一化 参数orientation决定了是采用纵轴代表频率还是横轴代表频率的展现形式
- 用费曼技巧自学编程,香不香?
- mysql导入的时候提示“1046-No Database selected”的解决办法
- aspose 转pdf表格大小乱了_自己写了一个小工具类:pdf转word,没有页数和大小限制,保真!...
- RecycleView实现多布局可展开列表
- 基于Swift的简易iOS天气APP
- Java集合框架源码解读(3)——LinkedHashMap
- 32位计算机怎么安装ps,Ps安装包怎么安装到电脑上,Ps安装本地安装技巧
- 电子计算机为什么123安不出来,方正软件常见问题及其解决办法-精.doc
- 饿了么客户端透明代理 Samaritan详细介绍
- 人在旅途——》张家界之旅:20190420
- 【老王的脑科学谬论】为什么盲人的听觉“似乎”比正常人更“灵敏”?
- 合金电阻参数选型资料
- 2-44钟静雯_day03
- 令人愉悦的性能统计分析工具-hiper 【发个copy】
- 腾讯手游助手android文件夹,腾讯手游助手安装的apk在哪个文件夹?腾讯手游助手游戏安装目录介绍...
- NTP时钟同步原理及误差简析
- 辞旧迎新:元旦,春节放假通知
- 【呆鸟译Py】数据分析师进阶必备6大数学利器
- 【零信任落地案例】指掌易某集团灵犀・SDP零信任解决方案
热门文章
- 使用saltstack编译安装nginx
- SiteMesh学习入门
- tomcat内存溢出(修改catalina.bat后windows启动tomcat服务没有效果) | 王猛的个人主页...
- [转]Laravel 4之Eloquent ORM
- linux 系统yum下安装vnc
- Word2010使用技巧之四:页眉的另类使用
- linux /etc/目录_Linux / etc /目录的版本控制
- 开发环境与工具部署服务_开发与部署之间的区别
- 枚举类型 实现一个enumeration对于类的加工的函数
- CSS 背景附着 background-attachment属性