亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++初始化列表學習

2020-01-26 15:54:38
字體:
來源:轉載
供稿:網友

何謂初始化列表
與其他函數不同,構造函數除了有名字,參數列表和函數體之外,還可以有初始化列表,初始化列表以冒號開頭,后跟一系列以逗號分隔的初始化字段。在C++中,struct和class的唯一區別是默認的克訪問性不同,而這里我們不考慮訪問性的問題,所以下面的代碼都以struct來演示。

復制代碼 代碼如下:

struct foo
{
    string name ;
    int id ;
    foo(string s, int i):name(s), id(i){} ; // 初始化列表
};

構造函數的兩個執行階段
構造函數的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先于計算階段。

初始化階段
所有類類型(class type)的成員都會在初始化階段初始化,即使該成員沒有出現在構造函數的初始化列表中。

計算階段
一般用于執行構造函數體內的賦值操作,下面的代碼定義兩個結構體,其中Test1有構造函數,拷貝構造函數及賦值運算符,為的是方便查看結果。Test2是個測試類,它以Test1的對象為成員,我們看一下Test2的構造函數是怎么樣執行的。

復制代碼 代碼如下:

struct Test1
{
    Test1() // 無參構造函數
    {
        cout << "Construct Test1" << endl ;
    }

    Test1(const Test1& t1) // 拷貝構造函數
    {
        cout << "Copy constructor for Test1" << endl ;
        this->a = t1.a ;
    }

    Test1& operator = (const Test1& t1) // 賦值運算符
    {
        cout << "assignment for Test1" << endl ;
        this->a = t1.a ;
        return *this;
    }

    int a ;
};

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1)
    {
        test1 = t1 ;
    }
};


調用代碼
復制代碼 代碼如下:

Test1 t1 ;
Test2 t2(t1) ;

輸出



解釋一下,第一行輸出對應調用代碼中第一行,構造一個Test1對象。第二行輸出對應Test2構造函數中的代碼,用默認的構造函數初始化對象test1,這就是所謂的初始化階段。第三行輸出對應Test1的賦值運算符,對test1執行賦值操作,這就是所謂的計算階段。

為什么使用初始化列表
初始化類的成員有兩種方式,一是使用初始化列表,二是在構造函數體內進行賦值操作。使用初始化列表主要是基于性能問題,對于內置類型,如int, float等,使用初始化類表和在構造函數體內初始化差別不是很大,但是對于類類型來說,最好使用初始化列表,為什么呢?由上面的測試可知,使用初始化列表少了一次調用默認構造函數的過程,這對于數據密集型的類來說,是非常高效的。同樣看上面的例子,我們使用初始化列表來實現Test2的構造函數

復制代碼 代碼如下:

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1):test1(t1){}
}

使用同樣的調用代碼,輸出結果如下。

第一行輸出對應 調用代碼的第一行。第二行輸出對應Test2的初始化列表,直接調用拷貝構造函數初始化test1,省去了調用默認構造函數的過程。所以一個好的原則是,能使用初始化列表的時候盡量使用初始化列表。

哪些東西必須放在初始化列表中
除了性能問題之外,有些時場合初始化列表是不可或缺的,以下幾種情況時必須使用初始化列表

常量成員,因為常量只能初始化不能賦值,所以必須放在初始化列表里面
引用類型,引用必須在定義的時候初始化,并且不能重新賦值,所以也要寫在初始化列表里面
沒有默認構造函數的類類型,因為使用初始化列表可以不必調用默認構造函數來初始化,而是直接調用拷貝構造函數初始化。
對于沒有默認構造函數的類,我們看一個例子。

復制代碼 代碼如下:

struct Test1
{
    Test1(int a):i(a){}
    int i ;
};

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1)
    {
        test1 = t1 ;
    }
};


以上代碼無法通過編譯,因為Test2的構造函數中test1 = t1這一行實際上分成兩步執行。

1. 調用Test1的默認構造函數來初始化test1
2. 調用Test1的賦值運算符給test1賦值

但是由于Test1沒有默認的構造函數,所謂第一步無法執行,故而編譯錯誤。正確的代碼如下,使用初始化列表代替賦值操作。

復制代碼 代碼如下:

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1):test1(t1){}
}

成員變量的初始化順序
成員是按照他們在類中出現的順序進行初始化的,而不是按照他們在初始化列表出現的順序初始化的,看代碼。
復制代碼 代碼如下:

struct foo
{
    int i ;
    int j ;
    foo(int x):i(x), j(i){}; // ok, 先初始化i,后初始化j
};

再看下面的代碼
復制代碼 代碼如下:

struct foo
{
    int i ;
    int j ;
    foo(int x):j(x), i(j){} // i值未定義
};

這里i的值是未定義的因為雖然j在初始化列表里面出現在i前面,但是i先于j定義,所以先初始化i,但i由j初始化,此時j尚未初始化,所以導致i的值未定義。所以,一個好的習慣是,按照成員定義的順序進行初始化。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人激情小视频| 日韩有码在线播放| 日韩国产高清污视频在线观看| 欧美孕妇毛茸茸xxxx| 成人亚洲欧美一区二区三区| 日韩视频在线免费观看| 欧美激情视频三区| 久久久999国产精品| 日韩中文av在线| 国产精品日韩精品| 久久影视电视剧凤归四时歌| 国产一区二区三区日韩欧美| 亚洲第一av网站| 日韩电影大片中文字幕| 亚洲欧洲在线看| 国产欧美一区二区白浆黑人| 在线观看久久久久久| 国产精品视频播放| www.日韩系列| 欧美丰满老妇厨房牲生活| 欧美高清视频免费观看| 日韩精品极品视频免费观看| 国产精品爽黄69天堂a| 久热国产精品视频| 在线观看91久久久久久| 欧美午夜精品久久久久久久| 亚洲第一网站免费视频| 有码中文亚洲精品| 国产亚洲精品综合一区91| 最新国产成人av网站网址麻豆| 欧洲亚洲免费视频| 日韩国产在线播放| 精品久久久久久| 欧美一区二区三区免费观看| 成人a视频在线观看| 国产精品视频午夜| 亚洲第一二三四五区| 色综合久久久久久中文网| 日韩中文有码在线视频| 久久99视频免费| 国产手机视频精品| 亚洲欧美日韩成人| 日韩中文字幕视频| 久久久久久香蕉网| 黄色91在线观看| 91豆花精品一区| 国产精品久久久久av免费| 久久久欧美一区二区| 福利视频一区二区| 久久中国妇女中文字幕| 亚洲欧美成人精品| 欧美一级高清免费| 色一区av在线| 国内精品免费午夜毛片| 国产综合久久久久久| 久久久久久久久爱| 欧美剧在线观看| 成人中心免费视频| 亚洲精品视频二区| 日韩在线资源网| 日韩亚洲第一页| 中文字幕在线视频日韩| 久久网福利资源网站| 欧美性猛交xxxx偷拍洗澡| 精品欧美国产一区二区三区| 国产精品自产拍在线观看中文| 欧美福利在线观看| 国产精品久久久久久婷婷天堂| 九九久久久久99精品| 亚洲激情在线观看视频免费| 精品亚洲精品福利线在观看| 国产精品18久久久久久首页狼| 国产亚洲欧美视频| 热99精品里视频精品| 欧美人与性动交| 欧美风情在线观看| 欧美精品午夜视频| 欧美又大粗又爽又黄大片视频| 亚洲国产精品一区二区三区| 国产精品美乳一区二区免费| 亚洲成人av片在线观看| 日韩一区二区久久久| 国产精品劲爆视频| 亚洲аv电影天堂网| 亚洲国产精久久久久久久| 4438全国成人免费| 成人免费淫片视频软件| 国产精品毛片a∨一区二区三区|国| 国产精品久久一区| 国模gogo一区二区大胆私拍| 日韩在线免费观看视频| 亚洲视频电影图片偷拍一区| 久久青草精品视频免费观看| 欧美性猛交xxxx免费看漫画| 国产91露脸中文字幕在线| 国产在线视频不卡| 久热精品视频在线| 久久国产视频网站| 国产美女搞久久| 国产精品久久久一区| 视频直播国产精品| 岛国av一区二区三区| 精品久久久av| 亚洲国产精品久久91精品| 日韩精品视频在线观看免费| 久久久久久久激情视频| 狠狠躁夜夜躁人人爽天天天天97| 欧美大片免费观看| 欧美黑人又粗大| 亚洲性无码av在线| 亚洲香蕉av在线一区二区三区| 啪一啪鲁一鲁2019在线视频| 欧美亚洲成人免费| 国产一区二区欧美日韩| 亚洲人精品午夜在线观看| 爽爽爽爽爽爽爽成人免费观看| 日韩欧美999| 日韩免费在线电影| 国产suv精品一区二区三区88区| 成人精品一区二区三区| 欧美一级大片在线免费观看| 精品国产网站地址| 欧美性一区二区三区| 精品无人区太爽高潮在线播放| 欧美高清视频一区二区| 亚洲丝袜在线视频| 国产精品99久久久久久久久| 亚洲电影免费观看高清完整版| 久久久999精品免费| 国产精品揄拍一区二区| 韩日精品中文字幕| 亚洲精品永久免费| 91影视免费在线观看| 欧美大学生性色视频| 91日韩在线播放| 成人黄色av网站| 51久久精品夜色国产麻豆| 亚洲成人av片| 91po在线观看91精品国产性色| 日韩久久午夜影院| 亚洲一区二区三区香蕉| 国产成人高潮免费观看精品| yellow中文字幕久久| 精品性高朝久久久久久久| 国产精品一区二区久久| 日韩电影大片中文字幕| 国产精品一区二区三| 欧美大尺度激情区在线播放| 国产亚洲aⅴaaaaaa毛片| 亚洲美腿欧美激情另类| 国产精品999999| 亚洲精品一区二区网址| 亚洲电影第1页| 日韩中文字幕视频在线观看| 成人精品久久一区二区三区| 日韩精品极品毛片系列视频| 高清一区二区三区日本久| 亚洲精品小视频在线观看| 欧美日韩成人精品| 日韩女优人人人人射在线视频| 中文字幕久热精品视频在线| 午夜精品久久久久久久久久久久| 日本韩国欧美精品大片卡二| 亚洲深夜福利视频|