C 11初始化與構造

2021-08-14 16:59:51 字數 1420 閱讀 5802

研究vector容器使用方法時,初始化與構造需要區分

初始化不是賦值,初始化的含義是建立變數時賦予其初始值,賦值,則是將物件當前值擦除,用新值替代

拷貝初始化與直接初始化是一對概念,特徵為使用等號是拷貝初始化(copy initialization),把等號右側的值賦值到新建物件中去,(右側是值,一般在花括號內,若為物件,會先呼叫)不使用等號,是直接初始化(direct initialization)

初始化時,三原則

1.拷貝初始化只能提供乙個初始值,其真正含義為,初始值只有乙個時,直接初始化或者拷貝初始化均可

string s5 = "richard";

string s6 ("richard");

為多個值時,只能使用直接初始化

string s7(10,』c』);

而 string s8 = stirng(10,』c』);

的寫法看似是拷貝初始化,但是是顯示地建立了乙個(臨時)物件用於拷貝

本質為

string temp(10,』c』);

string s8 = temp;

2.提供類內初始值,即,提供的引數為構造物件的類內的初始值,只能使用拷貝初始化(=)或者引數列表{}形式初始化

規則為:建立物件時,類內初始值用於初始化資料成員,沒有初始值的成員將被預設初始化,(內建型別(程式語言自定義型別:c++ int double e.g.)未被顯示初始化,預設初始化的規則為,由定義的位置決定,定義於任何函式體之外的變數被初始化為0,函式體內,內建型別變數不被初始化,未被初始化的內建型別變數是未定義的,試圖拷貝或其他形式訪問將引發錯誤)

p403.如果提供的是初始元素值的列表,只能把初始值放在花括號裡進行初始化,而不是放在圓括號裡面

即vector v1;

作為 c++11新標準的一部分,花括號初始化變數得到全面應用,,該種方式稱之為列表初始化. c++11 p39

vactor容器的值初始化(元素數量,具體值),可以只提供元素數量,vector元素物件型別不支援預設初始化,就必須提供相應的值,內建型別int為0,string為空

vector列表初始化一一對應

想要使用列表初始化vector物件,花括號元素值必須與元素型別相同

vector

(10); //10個0

vector

; //1個10

vector

(10,1); //10個1

vector

; //兩個元素10,1

p89

結論:

圓括號就是構造,(個數,具體值)

花括號就是列表初始化

reference: c++primer

C 11 就地初始化與列表初始化

在 c 11 之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c or int b c 11 only int c 7 error 注意,小括號初始化方式不能用於就地初始化。c 11 支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,也就...

c 11 就地初始化與列表初始化

還可以看看 在c 11之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c 或int b c 11 only int c 7 error 1.2就地初始化與初始化列表的先後順序 c 11標準支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,...

C 11之列表初始化

c 98使用 對陣列初始化 int arr int arr 4 但對於自定義型別會報錯 vectorv 內建型別 int x1 int x2 int x3 1 2 int x4 int x5 陣列 int arr1 5 int arr2 動態陣列 c 98不支援 int arr3 new int 5...