直接初始化和拷貝初始化

2021-08-09 12:17:20 字數 1010 閱讀 5703

定義:

示例:

string dots(10,'.');                //直接初始化

string s(dots); //直接初始化

string s2 = dots; //拷貝初始化

string null_book = "9-999-99999-9"; //拷貝初始化

string nines = string(100,'9'); //拷貝初始化

注:

直接初始化實際上是要求編譯器使用普通的函式匹配來選擇與我們提供的引數最匹配的建構函式

拷貝初始化實際上是要求編譯器將右側運算物件拷貝到正在建立的物件中,通常用拷貝建構函式來完成

拷貝初始化發生的其他情況:

拷貝初始化不僅在用=定義變數時發生,下列情況也發生

拷貝建構函式的形參必須是引用型別的原因:

如果不是引用型別,為了呼叫拷貝建構函式,我們必須拷貝它的實參,但為了拷貝實參,我們又需要呼叫拷貝建構函式,如此無限迴圈,造成錯誤。

拷貝初始化的限制:

當拷貝建構函式前面加了乙個explicit關鍵字時,呼叫拷貝建構函式不能進行隱式型別轉換,但可以進行顯示型別轉換,如:

vector

v1(10); //正確:直接初始化

vector

v2 = 10;//錯誤:接受大小引數的建構函式是explicit的

void f(vector

);//f的引數進行拷貝初始化

f(10);//錯誤:不能用乙個explicit的建構函式拷貝乙個實參

f(vector

(10));//正確:可以進行顯示型別轉換(f的引數必須接收乙個物件)

參考:《c++ primer》

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

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

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

std set和std map都有乙個insert和emplace成員函式,那麼,他們的區別是什麼呢?他們都往 set或map 裡增加乙個元素,區別在於新元素的構造上。emplace 使用直接構造,insert 使用複製 拷貝 構造。那麼直接構造和複製構造有什麼區別呢?認識這兩種初始化 構造 有助於...

c 直接初始化與拷貝初始化

我們常見的幾種初始化的形式 string str1 first 拷貝初始化,編譯器允許把這句話改寫為string str first 但是string類必須有public的拷貝 移動 建構函式 string str2 10,a 直接初始化 string str3 str2 直接初始化 string ...