转自:http://blog.csdn.net/ljianhui/article/details/9245661
不久前,在博客上发表了一篇文章——提高程序运行效率的10个简单方法,对于其中最后一点,多使用直接初始化,有很多读者向我提出了疑问,并写了一些测试程序,来说明直接初始化与复制初始化是同一件事。让我了解到大家对于直接初始化与复制初始化的区别的确是不太清楚,无可否认,那篇文章的例子用得的确不太好,在这里表示歉意!所以我觉得还是有必要跟大家详细分享一下我对直接初始化和复制初始化的理解。
一、Primer中的说法
首先我们来看看经典是怎么说的:
“当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象”
还有一段这样说,
“通常直接初始化和复制初始化仅在低级别优化上存在差异,然而,对于不支持复制的类型,或者使用非explicit构造函数的时候,它们有本质区别:
ifstream file1("filename")://ok:direct initialization
ifstream file2 = "filename";//error:copy constructor is private
”
二、通常的误解
从上面的说法中,我们可以知道,直接初始化不一定要调用复制构造函数,而复制初始化一定要调用复制构造函数。然而大多数人却认为,直接初始化是构造对象时要调用复制构造函数,而复制初始化是构造对象时要调用赋值操作函数(operator=),其实这是一大误解。因为只有对象被创建才会出现初始化,而赋值操作并不应用于对象的创建过程中,且primer也没有这样的说法。至于为什么会出现这个误解,可能是因为复制初始化的写法中存在等号(=)吧。
为了把问题说清楚,还是从代码上来解释比较容易让人明白,请看下面的代码:
#include <iostream> #include <cstring> using namespace std; class ClassTest { public: ClassTest() { c[0] = '