c++ - 没有默认构造函数的奇怪的 c++ 复制构造函数

标签 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;

最佳答案

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

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

  1. Pt pt = ->此时,Pt对象被创建,命名为pt(此时什么都没有初始化)<
  2. = pt; -> 此时,pt 的复制构造函数被调用,参数为 - 本身 (pt)
  3. 作为 pt 创建但未初始化(在 1. 中),这是(有点)有效 - pt 的复制构造函数(在 2. 中)将被“正确地”执行,将已经存在且未初始化的对象 pt 作为右侧参数(来自 1. 再次)

不久 - 这很糟糕。

值得注意的是,如果 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++

关于c++ - 没有默认构造函数的奇怪的 c++ 复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30211668/

相关文章:

oop - MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?)

c++ - 在函数中传递 ifstream 迭代器

c++ - mbed OS 5 项目中链接了哪些文件?

C++ - 在创建时调用赋值运算符而不是复制构造函数

c++ - 如何有效地并行设置位 vector 的位?

c++ - 在继承的对象中切片

具有空主体的 C++ 私有(private)默认构造函数

Java:声明空构造函数以从另一个类初始化对象的替代方法

c++ - sed 中用于替换 C++ 的正则表达式包括

c++ - 如何通过引用或值或指针在 C++ 中传递数组?