精品理论电影在线_日韩视频一区二区_一本色道精品久久一区二区三区_香蕉综合视频

計算機二級C++函數:類成員的初始化

發布時間:2011-08-29 共1頁

  學習過C++已經好長時間了,但是一直都沒機會去寫C++代碼,所以很多東西都已經給遺忘了。下面是關于類的static,const,static const , const static成員的初始化問題的學習筆記。
  1.類里的const成員初始化:
  在一個類里建立一個const時,不能給它初值。像
  class foo
  {
  private:
  const int i = 100;
  public:
  foo(){}
  ......
  };
  這樣的初始化方式是不能通過編譯的,因為在類對象里進行了存儲空間分配,編譯器不能知道const的內容是什么,所以不能把它用作編譯期間的常量。這意味著對于類里的常數表達式來說,const就像它在C中一樣沒有作用。因此這個初始化工作必須發生在構造函數里,并且,要在構造函數的某個特別的地方。因為const必須在建立它的地方被初始化,所以在構造函數的主體里,const必須已初始化了,否則,就只有等待,直到在構造函數主體以后的某個地方給它初始化,這意味著過一會兒才給const初始化。當然,無法防止在在構造函數主體的不同地方改變const的值。
  構造函數初始化表達式
  class foo
  {
  private:
  const int i = 100;
  public:
  foo(){......}
  ......
  };
  如果構造函數是在類外定義,則可以這樣寫:
  class foo
  {
  private:
  const int i;
  public:
  foo();
  ......
  };
  foo::foo(): i(100){......}
  2.類里的static成員初始化:
  類中的static變量是屬于類的,而不是屬于某個對象,它在整個程序的運行過程中只有一個副本,因此不
  能在定義對象時對變量初始化,就是不能用構造函數來初始化。其正確的初始化方式是:
  <數據類型><類名>::<靜態數據成員名>=<值> ,例如
  class foo
  {
  private:
  const int i;
  public:
  foo();
  ......
  };
  int foo::i=100;
  這表明:
  (1)初始化在類體外進行,而前面不加static,以免與一般靜態變量或對象相混淆。
  (2)初始化時不加該成員的訪問權限控制符private,public等。
  (3)初始化時使用作用域運算符來標明它所屬類,因此,靜態數據成員是類的成員,而不是對象的成員。
  3.類里的static const 和const static成員初始化:
  在找static成員的初始化學習資料時,筆者發現了網上有很多關于 static const 成員,也就是全局的靜態常量的初始化的資料。const成員要在構造函數初始化,而static成員在需要在在類體外初始化,那么static const 和 const static 的成員應該在哪里進行初始化呢?這兩個寫法又會有什么不一樣嗎?這引起了筆者的興趣。在網上查閱了相關資料和做了相關實驗后,筆者確認了只要用static關鍵字修飾的成員的初始化方式和只有static關鍵字修飾的成員一樣,都必須在類體外初始化,而無論static在const前面還是后面。比如:
  class Test{
  public:
  static const int MASK1;
  static const int MASK2;
  };
  const int Test::MASK1 = 0xFFFF;
  const int Test::MASK2 = 0xFFFF;
  至于兩種方式的區別,我還不知道,下面是在網上找到的一個關于它們區別的說法,僅供家參考:
  沒有區別。
  一個是靜態常量,
  一個是常量靜態,
  靜態都將存儲在全局變量區域,其實最后結果都是一樣的。
  可能在不同編譯器內,不同處理,但是最后結果是一樣的。
  

百分百考試網 考試寶典

立即免費試用