【问题标题】:Weird c++ copy constructor without default constructor [duplicate]没有默认构造函数的奇怪的c ++复制构造函数[重复]
【发布时间】:2015-07-24 13:18:35
【问题描述】:

我和我的一个同事争论过

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;

【问题讨论】:

  • "我怀疑在第二种情况下可以调用复制分配,但事实证明并非如此。"我怀疑您是从事实是某事没有发生,它不可能发生。这是无效的推理。如果我过马路时不看两边,也没有被车撞到,这是否意味着有人说我可能会被车撞到是不正确的?
  • 有效点。你建议 Pt pt = Pt();在某些情况下可以调用复制构造函数吗?如果是这样 - 你能举个例子吗?
  • @Vorren - 关于这个Pt pt = Pt(),我更新了我的答案。

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


【解决方案1】:

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++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2011-07-15
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多