1. 程式人生 > >總結C++中幾種結構體初始化的方法

總結C++中幾種結構體初始化的方法

部落格地址:http://www.cnblogs.com/vongang/

結構體能自由組裝資料,是一種很常見的資料打包方法。


當我們定義一個結構體後,沒有初始化就使用,就會使用到垃圾資料,而且這種錯誤很難發現。


在程式設計時對於定義的任何變數,我們最好都先初始化。


除了使用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};


在有的結構體中,第一個成員表示結構體的大小,那麼就可以這樣初始化:


 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填充。


總結分析:


以上三種,是據我所知的初始化結構體方法。


前面兩種,實際上已經把結構體給類化了,和類的使用差不多。第三種,是純粹的結構體的寫法。


如果用途僅僅限定為結構體,我建議不要加上建構函式,也不要繼承於那個模板類,因為這個時候結構體實際上已經是類了。在定義結構體時,將無法使用第三種方式去初始化,當然,此時也不需要初始化了。


看看微軟定義的結構體,基本上都沒有建構函式和解構函式。因為結構體的意義很明確,它僅僅是對資料的一個包裝,如果加上了方法,其意義就變了。