我有以下代码:
#include <iostream>
#include <string>
using namespace std;
class Uno {
public: Uno() { cout << "X"; }
};
int main()
{
Uno u;
Uno k=u;
return 0;
}所以据我所知,代码Uno k=u;会创建一个u的副本,似乎构造函数被调用了两次。我期望的是"XX",但程序只输出"X“。你能解释一下是怎么回事吗?
谢谢
发布于 2013-06-29 08:46:09
发生的事情是这样的:
Uno k = u;是一个(copy-)initialization,,它从Uno object k复制构造Uno object u。复制构造意味着调用复制构造函数(在本例中是由编译器隐式生成的),而不是默认构造函数。
这就是为什么您输出的消息在k初始化期间不会打印出来:您的构造函数不会被调用;相反,会调用另一个(隐式生成的)构造函数。
另请注意,上述声明通常并不等同于此:
Uno k;
k = u;在最后这段代码中,表达式k = u是一个赋值,而不是一个初始化。尽管这两个构造都使用=符号,但您不应该对此感到困惑。
发布于 2013-06-29 08:45:10
k是使用不输出X的默认复制构造函数创建的。
尝试添加以下内容:
Uno(const Uno&) { cout << "Y"; }您应该看到的是XY输出。
发布于 2013-06-29 08:45:10
在这种情况下,我认为构造函数不会被调用,因为您不是在创建新对象;而是在将旧对象复制到不同的位置。
但是,由于您没有使用指针,因此它们应该是独立的;对其中一个的更改不会影响另一个。
代码不会再次运行构造函数,因为它不是在构建新的内容。想象一下,在创建u字段后,您对它进行了一些更改。再次调用构造函数不会生成u的副本,因此C++不会这样做。这有点像复制一张照片-这样做不会让你的相机响两次,因为那可能会产生不同的照片;相反,你通过复印机运行它,这是不同的东西。
EDIT:据我所知,它确实运行了一个构造函数,只是不是你写的那个。假设我比喻中的相机有一个内置的复印机,它当然不会触发闪光灯。
https://stackoverflow.com/questions/17375576
复制相似问题