结构体能自由组装数据,是一种很常见的数据打包方法。
当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。
在编程时对于定义的任何变量,我们最好都先初始化。
除了使用memset和ZeroMemory之外,有没有更简单的方法初始化呢?
因为有时候每定义一个结构体,就使用一次memset,这样很繁琐,同时有时候也需要给结构体中的一些变量赋一些非0的默认值。
我这里总结三种方法,如果大家有什么好的方法,不妨加上去:
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));
}
};
如果在结构体中分配了指针,并且指针指向一个堆内存,那么就在析构函数中释放,以上便是在构造函数中初始化。
二、继承模板类初始化
首先定义一个模板基类:
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];
};
这样也能实现初始化。
三、定义时初始化
struct Stu
{
int nNum;
bool bSex;
char szName[20];
char szEmail[100];
};
//定义时初始化
Stu stu1 = {0};
#include <iostream>
#include <string.h>
using namespace std;
struct Stu
{
int nNum;
bool bSex;
char szName[20];
char szEmail[100];
};
struct XStu
{
long sum;
Stu sx;
Stu* sP;
};
int main() {
Stu ss;
strcpy(ss.szName,"xx");
strcpy(ss.szEmail,"xx");
for(int i = 0; i < 100; ++i)
{
XStu s = {0};
//XStu s ;
// cout <<"s.nNum=" <<s.nNum << " s.bSex ="<< s.bSex <<" s.szName="<< s.szName << " s.szEmail="<<s.szEmail << endl;
cout << "s.sum=" << s.sum << endl;
cout << "s.sP=" << (s.sP == 0) << endl;
cout << "entq---" << s.sx.szName << endl;
//randomVec.push_back(i);
//
}
}
在有的结构体中,第一个成员表示结构体的大小,那么就可以这样初始化:
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填充。
总结分析:
以上三种,是据我所知的初始化结构体方法。
前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。
如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。
看看微软定义的结构体,基本上都没有构造函数和析构函数。因为结构体的意义很明确,它仅仅是对数据的一个包装,如果加上了方法,其意义就变了。
另,字符数组和string混合成员初始化方法:
struct Stu
{
int nSize; //结构体大小
int nNum;
bool bSex;
char szName[20];
string szEmail;
};
Stu stu1 = {}; 或者 Stu stu1 = {0};
今天的文章总结C++中几种结构体初始化的方法分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/28830.html