C++11系列學習之列表初始化_第1頁
C++11系列學習之列表初始化_第2頁
C++11系列學習之列表初始化_第3頁
C++11系列學習之列表初始化_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第C++11系列學習之列表初始化目錄前言:舊標準初始化方式C++11標準初始化方式初始化列表技術細節(jié)總結

前言:

由于舊標準初始化方式太過繁雜,限制偏多,因此在新標準中統(tǒng)一了初始化方式,為了讓初始化具有確定的效果,于是提出了列表初始化概念。

舊標準初始化方式

普通數(shù)組初始化:

inti_arr[3]={1,2,3}

POD類型初始化(即plainolddata類型,可以直接使用memcpy復制的對象):

structA

intx;

structB

inti;

intj;

}a={1,{2,3}};

拷貝初始化:

inti=0;

classFoo

public:

Foo(int){}

}foo=123

直接初始化:

intj(0)

Foobar(123)

C++11標準初始化方式

C++11標準中{}的初始化方式是對聚合類型的初始化,是以拷貝的形式來賦值的。

C++11標準中對非聚合類型則以構造函數(shù)來進行初始化的。

聚合類型:

類型是一個普通的數(shù)組類型是一個類,

并且滿足以下條件:

無用戶自定義的構造函數(shù)無私有或保護的非靜態(tài)數(shù)據(jù)成員無基類無虛函數(shù)不能有{}和=直接初始化的非靜態(tài)數(shù)據(jù)成員

初始化列表技術細節(jié)

觀察下面這兩個:

intarr[]{1,2,3}

std::setintss={1,2,3}

之所以可以實現(xiàn)STL中不指定個數(shù)進行初始化,依賴的就是與i個輕量級的類模板,也是C++11中的新特性std::initializer_listinitializer_list使用

classFooVector

std::vectorintcontent_;

public:

FooVector(std::initializer_listintlist){//重要技術點

for(autoit=list.begin();it!=list.end();++it){

content_.back(*it)

FooVectorfoo_1={1,2,3,4,5}//不僅可以這樣

FooVectorfoo_2({1,2,3,4,5})//還可以傳一個同種類型數(shù)據(jù)集合

initializer_list的特點:

它是一個輕量級的容器類型,內(nèi)部定義了iterator等容器必需的概念對于std::initializer_list來說,它可以接收任意長度的初始化列表,但要求元素類型必須是同種類型T(或者可轉換為T)它有3個成員接口:size()、begin()、end()它只能被整體初始化或賦值

注意:std::initializer_list是非常高效的,因此內(nèi)部并不負責保存初始化列表中的元素的拷貝,而是僅僅存儲列表中元素的引用!因此不能用來返回臨時變量!

避免類型收窄:

C++有隱式類型轉換的特性,比如將一個浮點數(shù)賦值給一個整數(shù),精度會丟失,小數(shù)點后會被直接截斷。初始化列表可以幫助避免隱式類型轉換。因為其不允許這種轉換發(fā)生。

但是也會隨著編譯器的不同而不同:

floatff=1.2

floatff={1.2}

在gcc4.8下沒有警告和錯誤,但MicrosoftVisualC++2013中,收到編譯錯誤。因為1.2默認是double類型,由double轉換成float會發(fā)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論