C++ 总结几种结构体初始化的方法
来源:互联网 发布:梯度下降算法 matlab 编辑:程序博客网 时间:2024/05/17 04:36
当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。对于定义的任何变量,我们最好都先初始化。
除了使用memset和ZeroMemory之外,有没有更简单的方法初始化呢?因为有时候每定义一个结构体,就使用一次memset,也会觉得很繁琐。
我这里总结三种方法:
1、结构体的构造函数中初始化。
2、继承模板类初始化
3、定义时初始化
1、结构体的构造函数中初始化
在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填充。
总结分析:
前面两种方法,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。
如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。
看看微软定义的结构体,基本上都没有构造函数和析构函数。因为结构体的意义很明确,它仅仅是对数据的一个包装,如果加上了方法,其意义就变了。
转载自http://www.cnblogs.com/vongang/archive/2011/07/30/2122076.html
0 0
- 总结几种结构体初始化方法
- 总结几种结构体初始化方法
- 总结几种结构体初始化的方法
- C++ 总结几种结构体初始化的方法
- 总结几种结构体初始化的方法(转)
- 结构体初始化的几种方法
- (转载)总结C++中的几种结构体初始化的方法
- C语言结构体初始化的三种方法
- C语言结构体初始化的三种方法
- C语言中定义结构体的几种方法
- C语言中定义结构体的几种方法
- Objective-C NSString 创建初始化的几种方法
- 总结C++中几种结构体初始化的方法
- 总结C++中几种结构体初始化的方法
- 结构体的三种初始化方法
- 结构体的三种初始化方法
- linux c结构体更合理的初始化方法
- Linux下C结构体初始化[总结]
- 分布式计算开源框架Hadoop入门实践
- JavaScript -- 对象
- Minicom的使用
- 欢迎使用CSDN-markdown编辑器
- 一句话说明策略模式
- C++ 总结几种结构体初始化的方法
- Android--SQLite事务
- bzoj 1101: [POI2007]Zap 莫比乌斯反演
- yii2框架实现文件上传
- 设计模式-抽象工厂模式
- 225. Implement Stack using Queues
- 常用Linux和Oracle命令
- Mysql间隔取数据,实现sqlserver的row_number()函数
- 关于Angular2.0 in-memory-web-api的GET http://localhost:3000/traceur 404 (Not Found)等错误的解决方法之一