2017-01-28 56 views
3

以下內容摘自第13.1.1節。從書「C++總理」,第5版:如何理解直接初始化和複製初始化之間的區別

enter image description here

爲了驗證上述段落,尤其是聲明強調用紅色,我寫了下面的代碼:根據我的理解

#include<iostream> 
using namespace std; 

class TestClass { 
public: 
    TestClass() :a(7) { 
     cout << "Default constructor"; 
    } 
    TestClass(int aa) : a(aa) { 
     cout << "Constructor" << endl; 
    } 
    TestClass(const TestClass & t): a(t.a) { 
     cout << "Copy constructor" << endl; 
    } 
    TestClass & operator=(const TestClass & rhs) { 
     a = rhs.a; 
     return *this; 
    } 
    int a; 
}; 

int main() { 
    TestClass t1(1); 
    TestClass t2 = t1; 
} 

在書中對複製初始化的描述中,代碼首先應該使用默認初始化器創建t2,然後使用operator=函數複製右側操作數t1。但是當我在Visual Studio 2015中逐行調試時,代碼直接進入拷貝構造函數TestClass(const TestClass & t)。這表明直接初始化和複製初始化實際上在做同樣的事情,沒有區別。那麼,我的理解錯了還是這本書是錯的?如果我錯了,直接初始化和複製初始化之間區別的正確理解是什麼?你能給我一個示例代碼來展示這種差異嗎?非常感謝。

編輯:別人說我的問題可以在this thread回答。但是這個線程只是我所摘錄的文本的一個(詳細和延長的)重複。它沒有回答爲什麼在實踐中(例如,Visual Studio 2015)它不是真的。

+1

http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-direct-initialization – cpplearner

回答

1

這本書只是說「複製」,這不僅僅意味着複製分配。請注意「創建」一詞,copy initialization意味着構建,而不是分配。

對於TestClass t2 = t1;t2將通過複製構造函數直接拷貝構建而不是默認構造,然後分配。

如果T是一個類類型和other類型的CV-不合格版本是T或從T派生的類,的T非顯式的構造進行檢查和最佳匹配是由過載分辨率來選擇。然後調用構造函數來初始化該對象。

是的,複製初始化和直接初始化在大多數情況下都具有相同的效果,但它們之間存在差異。

複製初始化不如直接初始化容許:顯式構造函數不轉換構造函數,也不考慮複製初始化。

例如,

class TestClass { 
public: 
    // the copy constructor is declared explicit now 
    explicit TestClass(const TestClass & t): a(t.a) { 
     cout << "Copy constructor" << endl; 
    } 
    TestClass(int aa) : a(aa) { 
     cout << "Constructor" << endl; 
    } 
    int a; 
}; 

然後

int main() { 
    TestClass t0(1); 
    TestClass t1(t0); // fine; explicit constructor works fine with direct initialization 
    TestClass t2 = t0; // error; explicit constructor won't be considered for copy initialization 
} 
+0

我認爲我的問題與明確無關。另外,我正在問如何理解書中兩種初始化類型的區別。我看不到你的答案和我的問題之間的任何聯繫。 – user5280911

+0

@ user5280911看來你誤解了本書中的「複製」一詞的意思是「賦值」,所以我在第一部分解釋了「複製初始化」的含義。關於「顯式」的部分,這是因爲你說直接初始化和複製初始化是做同樣的事情。 – songyuanyao

+0

我說他們正在做同樣的事情,因爲他們正在執行相同的代碼。對於「將 右側操作數拷貝到正在創建的對象中」,我很抱歉無法解釋您的解釋。 – user5280911

相關問題