首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++默认复制构造函数

c++默认复制构造函数
EN

Stack Overflow用户
提问于 2013-06-29 08:41:09
回答 5查看 1.6K关注 0票数 0

我有以下代码:

代码语言:javascript
复制
#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“。你能解释一下是怎么回事吗?

谢谢

EN

回答 5

Stack Overflow用户

发布于 2013-06-29 08:46:09

发生的事情是这样的:

代码语言:javascript
复制
Uno k = u;

是一个(copy-)initialization,,它从Uno object k复制构造Uno object u。复制构造意味着调用复制构造函数(在本例中是由编译器隐式生成的),而不是默认构造函数。

这就是为什么您输出的消息在k初始化期间不会打印出来:您的构造函数不会被调用;相反,会调用另一个(隐式生成的)构造函数。

另请注意,上述声明通常并不等同于此:

代码语言:javascript
复制
Uno k;
k = u;

在最后这段代码中,表达式k = u是一个赋值,而不是一个初始化。尽管这两个构造都使用=符号,但您不应该对此感到困惑。

票数 3
EN

Stack Overflow用户

发布于 2013-06-29 08:45:10

k是使用不输出X的默认复制构造函数创建的。

尝试添加以下内容:

代码语言:javascript
复制
Uno(const Uno&) { cout << "Y"; }

您应该看到的是XY输出。

票数 1
EN

Stack Overflow用户

发布于 2013-06-29 08:45:10

在这种情况下,我认为构造函数不会被调用,因为您不是在创建新对象;而是在将旧对象复制到不同的位置。

但是,由于您没有使用指针,因此它们应该是独立的;对其中一个的更改不会影响另一个。

代码不会再次运行构造函数,因为它不是在构建新的内容。想象一下,在创建u字段后,您对它进行了一些更改。再次调用构造函数不会生成u的副本,因此C++不会这样做。这有点像复制一张照片-这样做不会让你的相机响两次,因为那可能会产生不同的照片;相反,你通过复印机运行它,这是不同的东西。

EDIT:据我所知,它确实运行了一个构造函数,只是不是你写的那个。假设我比喻中的相机有一个内置的复印机,它当然不会触发闪光灯。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17375576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档