为什么输出 alert
等于 <iframe>
?
我建议,当调用src
时,函数foo3
在堆栈上创建3
的副本,因此当返回此值时,它的值等于0 ,bar(foo1)
的复制构造函数再次递增值,因此它应为2?
提前致谢。
这是我的代码:
bar
输出:
foo1
答案 0 :(得分:1)
我相信这里有三个副本构造函数,行foo2 = foo1
,foo1
传递到bar
,foo1
从{{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。