【2016-08-18】轉載:總結C++中幾種結構體初始化的方法

做者:Ac_Vonhtml

博客地址:http://www.cnblogs.com/vongang/編程

文章地址:http://www.cnblogs.com/vongang/archive/2011/07/30/2122076.html函數

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

當咱們定義一個結構體後,沒有初始化就使用,就會使用到垃圾數據,並且這種錯誤很難發現。spa

在編程時對於定義的任何變量,咱們最好都先初始化。指針

除了使用memsetZeroMemory以外,有沒有更簡單的方法初始化呢?htm

由於有時候每定義一個結構體,就使用一次memset,這樣很繁瑣,同時有時候也須要給結構體中的一些變量賦一些非0的默認值。blog

我這裏總結三種方法,若是你們有什麼好的方法,不妨加上去:繼承

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

總結分析:

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

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

若是用途僅僅限定爲結構體,我建議不要加上構造函數,也不要繼承於那個模板類,由於這個時候結構體實際上已是類了。在定義結構體時,將沒法使用第三種方式去初始化,固然,此時也不須要初始化了。

看看微軟定義的結構體,基本上都沒有構造函數和析構函數。由於結構體的意義很明確,它僅僅是對數據的一個包裝,若是加上了方法,其意義就變了。

相關文章
相關標籤/搜索