結構體能自由組裝數據,是一種很常見的數據打包方法。當我們定義一個結構體后,沒有初始化就使用,就會使用到垃圾數據,而且這種錯誤很難發現。對於定義的任何變量,我們最好都先初始化。
除了使用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填充。
總結分析:
以上三種,是據我所知的初始化結構體方法。
前面兩種,實際上已經把結構體給類化了,和類的使用差不多。第三種,是純粹的結構體的寫法。
如果用途僅僅限定為結構體,我建議不要加上構造函數,也不要繼承於那個模板類,因為這個時候結構體實際上已經是類了。在定義結構體時,將無法使用第三種方式去初始化,當然,此時也不需要初始化了。
看看微軟定義的結構體,基本上都沒有構造函數和析構函數。因為結構體的意義很明確,它僅僅是對數據的一個包裝,如果加上了方法,其意義就變了。