作者:白如冰 链接:https://www.zhihu.com/question/22241269/answer/20737865 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class X
{
public:
X() : m_data(0)
{
std::cout<<"Direct construct!"<<std::endl;
}
public:
X(const X &rhs) : m_data(1)
{
std::cout<<"Copy construct!"<<std::endl;
}
private:
int m_data;
};
我这里的复制构造是错误的,目的是通过data的值确定是否进行了调用。
X a=X();
按照理论上说,执行的顺序是先X()构造临时对象,然后调用copy constructor,但是实际上copy constructor并未执行。 如果上述代码中我们把copy constructor声明为private,则上述代码无法通过编译。 也就是说,理论上说复制这一关是必须的,不过编译器进行了优化忽略了而已。
C++ Primer第四版中说的比较模糊:支持初始化的复制形式主要是为了和C的用法兼容,当情况许可时,允许编译器跳过复制构造函数直接初始化对象,但是编译器没有义务这样做。 通常直接初始化和复制初始化仅在低级别的优化上存在着差异,对于不支持复制的类型,或者非explicit构造函数,它们有着本质区别。
C++ Primer第五版说的比较明确了:During copy initialization, the compiler is permitted to skip the copy constructor, and create the object directly, even if the compiler omits the call to copy constructor, the copy constructor must exitst and must be accessible.