2017-01-28 143 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

相关问题