說明一下幾個詞的關係:拷貝 複製 賦值 初始化
因為以前一直沒深究它們的區別,直到拜讀了c++ primer 5和c++ primer plus 6之後,發現前者使用的是「拷貝建構函式」,後者則是「複製建構函式」,再聯想到c++中經常出現的拷貝、賦值、複製這三個詞語,所以這裡進行乙個個人總結。
拷貝和複製這兩個詞語本身語義或許有差別,但是在c++語言中可以認為二者是等價的,即拷貝建構函式和複製建構函式是乙個意思,通常說對乙個物件進行拷貝,也可以說對乙個物件進行複製,二者等價,未免歧義,後文全部使用拷貝。至於賦值和初始化的區別是個老生常談的問題,對於單個變數而言,初始化表示現在建立乙個新的變數,它的初始值來自乙個已經存在的物件,即原來沒有值,現在第一次給它乙個初值就叫初始化(注意變數在宣告的時候就需要初始化)。賦值是兩個變數已經有值的情況下,將乙個變數值去替換另乙個變數值。現在將普通變數物件換成類物件來理解,類物件也有初始化和賦值操作,只是物件變得複雜一點而已。類的初始化分為直接初始化和拷貝初始化,這裡只講拷貝初始化(直接初始化是類的建構函式做的事),即類物件的拷貝初始化是呼叫拷貝建構函式來完成的,而類物件的賦值操作是呼叫類的拷貝賦值運算子。也就是說「=」運算子,作用於普通變數物件和類物件間都叫賦值操作,只不過類物件將「=」進行了過載,使之變為自己特有的賦值操作,僅此而已。
初始化 賦值 拷貝
折騰我挺長一段時間,基本挺明白了,先來個區別說明 賦值操作是在兩個已經存在的物件間進行的,而初始化是要建立乙個新的物件,並且其初值 於另乙個已存在的物件。編譯器會區別這兩種情況,賦值的時候呼叫過載的賦值運算子,初始化的時候呼叫拷貝建構函式。如果類中沒有拷貝建構函式,則編譯器會提供乙個預設的。這個預設...
直接初始化與拷貝 複製 初始化
認識這兩種初始化有助於我們加深對語言的理解,可以更好的優化 我們常見的幾種初始化的形式 string str1 first 拷貝初始化,編譯器允許把這句話改寫為string str first 但是string 類必須有 public 的拷貝 移動 建構函式 string str2 10,a 直接初...
直接初始化與拷貝 複製 初始化
std set和std map都有乙個insert和emplace成員函式,那麼,他們的區別是什麼呢?他們都往 set或map 裡增加乙個元素,區別在於新元素的構造上。emplace 使用直接構造,insert 使用複製 拷貝 構造。那麼直接構造和複製構造有什麼區別呢?認識這兩種初始化 構造 有助於...