没有默认构造函数的奇怪的c ++拷贝构造函数

时间:2015-05-13 10:07:59

标签: c++ copy-constructor default-constructor

我和我的一位同事讨论过关于他人的问题

Pt pt;

Pt pt = Pt(); 

是等价的。我怀疑在第二种情况下可以调用复制作业,但事实证明并非如此。

当我们进行我们的小实验时,我决定测试一个奇怪的位,我的同事认为甚至无法编译:

//here the compiler calls a copy constructor and doesn't call the default constructor prior to that
// O_o
Pt pt = pt;

以下是工作示例:http://ideone.com/XmJSz7

所以,问题是 - 发生了什么:

Pt pt = pt;

1 个答案:

答案 0 :(得分:5)

type object = something之类的构造调用复制构造函数,而不是赋值运算符

考虑到这一点,以下是发生的事情:

  1. Pt pt = - >此时,创建了Pt个对象,名为pt(此时没有任何内容被初始化)
  2. = pt; - >此时,使用参数调用pt的复制构造函数 - 本身(pt
  3. 创建pt但未初始化(在1.中),这是(有点)有效 - pt的复制构造函数(在2.中)将是“正确地“执行”,将现有的未初始化的对象pt(再次来自1.)视为右侧参数
  4. 很快 - 这很糟糕。

    值得注意的是,如果pt对象是全局或静态的,那么 将在步骤1.默认初始化 - 在到达=之后

    编辑:关于最初的“谜题”Pt pt = Pt();,您可以看到此问题:Is there a difference in C++ between copy initialization and direct initialization?及其接受的答案。 这一点似乎也很有趣:How variable is initialized by default constructor in c++