没有默认构造函数的奇怪的 c++ 复制构造函数
Weird c++ copy constructor without 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
的构造调用复制构造函数,而不是赋值运算符
考虑到这一点,会发生以下情况:
Pt pt =
-> 此时,创建了Pt
对象,命名为pt
(此时没有初始化)
= pt;
-> 此时,pt
的复制构造函数被调用,参数为 - 本身 (pt
)
- 因为
pt
已创建但未初始化(在 1.
中),这是(有点)有效 - pt
的复制构造函数(在 2.
中)将被 "properly" 执行,将已经存在且 未初始化的 对象作为右侧参数 pt
(再次来自 1.
)
不久 - 这很糟糕。
值得注意的是,如果 pt
对象是全局的或静态的,它 将 在第 1.
步默认初始化 - 在达到=
.
编辑:关于最初的"puzzle"Pt pt = Pt();
,你可以看到这个问题:Is there a difference in C++ between copy initialization and direct initialization?及其接受的答案。
这个看起来也很有趣:How variable is initialized by default constructor in c++
我和我的一个同事争论过是否
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
的构造调用复制构造函数,而不是赋值运算符
考虑到这一点,会发生以下情况:
Pt pt =
-> 此时,创建了Pt
对象,命名为pt
(此时没有初始化)= pt;
-> 此时,pt
的复制构造函数被调用,参数为 - 本身 (pt
)- 因为
pt
已创建但未初始化(在1.
中),这是(有点)有效 -pt
的复制构造函数(在2.
中)将被 "properly" 执行,将已经存在且 未初始化的 对象作为右侧参数pt
(再次来自1.
)
不久 - 这很糟糕。
值得注意的是,如果 pt
对象是全局的或静态的,它 将 在第 1.
步默认初始化 - 在达到=
.
编辑:关于最初的"puzzle"Pt pt = Pt();
,你可以看到这个问题:Is there a difference in C++ between copy initialization and direct initialization?及其接受的答案。
这个看起来也很有趣:How variable is initialized by default constructor in c++