程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++復習筆記---初始化列表

C++復習筆記---初始化列表

編輯:C++入門知識

很久沒有碰C++,下個項目要開始使用C++,所以很多東西需要撿起來重新看看。從今天起記錄一些筆記,方便自己今後查閱。言歸正傳,先從構造函數的初始化列表說起。我把這個知識點細化成3個問題,1.為什麼要有初始化列表,它和構造函數中初始化有什麼不一樣。2.初始化的順序。3.一些注意的細節。
      先說第一個問題。我們有兩個東西,是必須在初始化列表裡完成的,一個是const修飾的變量,一個是引用。這點我就不細說了,查閱資料的都可以找到。下面我具體說說類成員。
class Test1
{
public:
 Test1()
 {
  cout << "Test1 default constructor" << endl;
 }
 Test1(int i)
 {
  cout << "Test1 value constructor" << endl;
 }
 Test1(const Test1 &obj)
 {
  cout << "Test1 copy constructor" << endl;
 }
 Test1& operator = (const Test1 &obj)
 {
  cout << "Test1 = constructor" << endl;
  return *this;
 }
 ~Test1()
 {
  cout << "Test1 destructor" << endl;
 }
};
 我定義一個類,然後再定義一個類,其中包含Test1
class Test2
{
public:
    Test2()
    {
        t1 = Test1(1);
    }

private:
    Test1 t1;
};
我們在構造函數中初始化Test1,我們看看運行結果
Test1 default constructor
Test1 value constructor
Test1 = constructor
Test1 destructor
Test1 destructor
我們分析下這個輸出。Test1 default constructor,這說明在進入Test1構造函數之前,已經初始化了t1成員,並且調用的是無參構造函數。Test1 value constructor這個是Test1(1)創建出來的對象。Test1 = constructor,這個表示條用了拷貝構造函數,Test1 destructor這個表示Test1(1)這個臨時對象的析構,Test1 destructor這個表示是t1這個成員對象的析構。從上面的結果來看,構造函數中t1 = Test1(1);其實並不是真正意義是上的初始化,而是一次拷貝賦值。當進入構造函數內部之前,類成員會被默認構造函數初始化。如果說Test1是個很大的對象,這塊會造成性能上的開銷。所以,這點也是使用初始化列表的原因之一。
      第二我們再來說下順序問題。簡單的原則是初始化列表裡的會先於構造函數中,初始化列表裡會按照變量聲明的順序。我們具體看看下面的例子。
class Test3()
{
public:
    Test3(int x,int y,int z):_z(z),_y(y)
    {
        _x = x;
    }

private:
    int _x,_y,_z;
};
按照上面的說法,賦值的順序是_y,_z,_x。
      第三個是注意問題,每個成員只能在初始化列表裡出現一次。
class Test3 www.2cto.com
{
public:
    Test3(int x,int y,int z):_z(z),_y(y),_z(x)
    {
        _x = x;
    }

private:
    int _x,_y,_z;
};
比如這種就是問題的。_z被初始化了2次。


作者:yg2362

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved