有人可以解释这个c ++程序的输出吗?

时间:2016-06-14 15:10:14

标签: c++ rvo nrvo

为什么输出 alert 等于 <iframe> ? 我建议,当调用src时,函数foo3在堆栈上创建3的副本,因此当返回此值时,它的值等于0 ,bar(foo1)的复制构造函数再次递增值,因此它应为2?

提前致谢。

这是我的代码:

bar

输出:

foo1

4 个答案:

答案 0 :(得分:1)

我相信这里有三个副本构造函数,行foo2 = foo1foo1传递到barfoo1从{{1}返回}}

修改代码可以清楚地了解发生了什么:

bar

输出:

#include <iostream>
struct Foo {
    Foo()
        : x(0)
    {
        std::cout << "Constructor called" << std::endl;
    }
    Foo(const Foo& foo)
        : x(foo.x + 1)
    {
        std::cout << "Copy constructor called" << std::endl;
    }
    int x;
};

Foo bar(Foo foo)
{
    std::cout << "B2:" << foo.x << std::endl;
    foo.x++;
    return foo;
}

int main()
{
    Foo foo1;
    Foo foo2 = foo1;
    std::cout << "A:" << foo1.x << std::endl;
    std::cout << "B:" << foo2.x << std::endl;
    Foo foo3 = bar(foo1);
    std::cout << "C:" << foo3.x << std::endl;
}

答案 1 :(得分:0)

创建第一个foo1时,其x为零。对bar的调用会按值传递,因此会被复制 - 因此bar中的参数值为1.函数bar本身会将x进一步递增1,所以它现在是2.最后,return语句再次按值返回,因此还有另一个副本 - 因此最终x为3。

注意RVO在这里不适用,因为Foo没有按值返回局部变量 - 而是返回一个必须实际复制的参数。

从标准[class.copy / 31]中,允许复制省略的情况,具体排除了返回函数参数的情况:

  

- 在具有类返回类型的函数的return语句中,何时   表达式是非易失性自动对象的名称(其他   比函数或catch子句参数)具有相同的cv-unqualified   键入函数返回类型,复制/移动操作即可   通过直接构造自动对象省略   函数的返回值

答案 2 :(得分:0)

  • 0 -> 1您将foo1复制到bar
  • 参数
  • 1 -> 2您在x内增加bar
  • 2 -> 3您将bar复制到临时返回值。

我算三个增量。

答案 3 :(得分:0)

做的时候:

Foo foo2 = foo1;

您正在调用副本ctor,因此foo2.x的值将为1。 然后在打电话时:

Foo foo3 = bar(foo1);

因为你没有通过参考传递&#39; bar&#39;使用copy ctor(x == 1)将foo1的副本创建到bar中。之后,复制的x成员递增(x == 2),最后返回。返回时未创建其他副本,因为&#39;返回值优化&#39;(仍为x == 2)。 最后再次使用copy ctor(x == 3)初始化foo3。