C 直接初始化和複製初始化

2021-06-08 11:38:05 字數 1957 閱讀 6706

在c++裡,物件初始化是乙個非常重要但又容易令人混淆的問題。這裡是自己的一些總結。

一。初始化與賦值的含義:

初始化:包括建立(或說定義)物件並且賦給初值。(如果乙個物件只被建立而沒有被初始化,則該變數只能用於被賦值)。

賦值: 擦除物件的當前值並用新值代替。

二。內建型別:

(一)直接初始化:

1.空初始化:即無引數無括號形式

如int i,new int,new int[10].當在所有函式之外時,初始化為0;當在某一函式中時,沒初始化。

2.值初始化:即無引數有括號形式,且括號只能在型別名後,而不能在變數名之後,即只能創無名物件。

物件被值初始化為0.

如:int() //建立了乙個無名物件,其被值初始化為0.一般將該無名物件初始化化或賦值給某有名物件,或直接作為無名物件使用

new int();

new int[10]();//建立了乙個無名物件,其被值初始化為0.一般將該無名物件初始化化或賦值給某有名物件

vectorvi();//這是vector類等容器定義的乙個特殊的建構函式。

3.顯式初始化:即有引數有括號形式,且當為有名物件時括號在物件名之後,為無名物件時括號在類型別名之後。

如:int i(5);

new int(5);

(二)複製初始化:

1.形式1:int i=5;

2.形式2:int i1=5;

int i2(i1)或int i2=i1;

3.形式3:int i(int(5))或int i=int(5);

三。類型別:

(一)直接初始化:

1.空初始化:即無引數無括號形式

classa obj或new classa,new classa[10].當classa有預設的建構函式時,用該預設建構函式初始化;

若classa無缺省的建構函式時,則不能這樣定義。

2.值初始化:即無引數有括號形式,且括號只能在型別名後,而不能在變數名之後,即只能創無名物件或者在類的初始化列表中。

若有預設建構函式,則用這個預設建構函式初始化

若無任何建構函式,則會使用值初始化,具體產生什麼樣的初始值,我有疑問??????

若無缺省建構函式,但有自定義的建構函式,則不能用值初始化。

如:classa(); //建立了乙個無名物件,一般將該無名物件初始化化或賦值給某有名物件,或直接作為無名物件使用

new classa();

new classa[10]();

vectorvi(10);//這是vector類等容器定義的乙個特殊的建構函式。

3.顯式初始化:即有引數有括號形式,且當為有名物件時括號在物件名之後,為無名物件時括號在類型別名之後

如:classa obj(paralist);

new classa(paralist);

(二)複製初始化:

1.形式1: classa obj=onepara;//classa中有乙個非explicit的只有乙個形參或其引用(onepara與其能匹配)的建構函式才行。

2.形式2: classa obj1=onepara或classa obj1(paralist);

classa obj2(obj1)或classa obj2=classa obj1;

3.形式3: classa obj2(classa(paralist))或classa obj2=classa(paralist);

注意1:在初始化式中符號「=」不是賦值操作符,它能呼叫複製建構函式;

注意2:複製建構函式就是指僅有乙個形參且該形參是本身類型別的const引用的建構函式;

注意3:const物件的初始化同上,只是初始化後其值不能再更改;

注意4:引用型別物件的初始化:若不初始化,則其沒有意義;

非const引用只能指向 同型別的 非const的 物件

const引用能指向 相關型別的 const或非const的 物件或字面值,但不可以通過該引用去修改其繫結的物件。

直接初始化和複製初始化

關於這個問題,國內外都有許多爭論,但我至今未找到滿意的答案,至於為為什麼,這就是今天要說明的。可能大家都有看過c primer,我看的是第四版,中文版,英文水平不怎麼樣。其中第13章,描述說,複製建構函式可用於 1.根據另乙個同型別的物件顯式或隱式初始化乙個物件 2.複製乙個物件,將它作為引數傳遞給...

直接初始化和複製初始化

1 classtest ct1 ab 這條語句屬於直接初始化,它不需要呼叫複製建構函式,直接呼叫建構函式classtest const char pc 所以當複製建構函式變為私有時,它還是能直接執行的。2 classtest ct2 ab 這條語句為複製初始化,它首先呼叫建構函式classtest ...

直接初始化與拷貝 複製 初始化

認識這兩種初始化有助於我們加深對語言的理解,可以更好的優化 我們常見的幾種初始化的形式 string str1 first 拷貝初始化,編譯器允許把這句話改寫為string str first 但是string 類必須有 public 的拷貝 移動 建構函式 string str2 10,a 直接初...