[英]How is a local variable created in functions?
让我说我有这个代码:
#include <iostream>
using namespace std;
class A{
public:
A() { cout << "In normal ctor\n"; }
A(const A& a) { cout << "In cpy ctor\n"; }
A(A&& a) { cout << "In move ctor\n"; }
~A() { cout << "In dtor\n"; }
};
A func(A a) {
return a;
}
void main(){
A a1;
A a2 = func(a1);
}
输出如下:
In normal ctor
In cpy ctor
In move ctor
In dtor
In dtor
In dtor
现在我无法理解函数''func''中发生的事情。
当a1被发送到函数时,函数不会通过ref接收它,而是“创建”它自己的a1版本'a'。
这就是为什么当函数结束时,对象''死''并且它会进入destractor。
那么它为什么不首先去建设者呢? (假设那里真的创建了一个本地对象)
幕后发生了什么抄袭?
提前致谢!
这是发生了什么(您的程序的打印输出与解释):
A a1;
main
A a
of func
从main
a1
初始化时会发生这种情况 a
func
( a1
的副本)被设置为a2
时会发生这种情况(请参阅copy elision作为回报) a1
的副本被销毁 a2
被摧毁 a1
被摧毁 我认为关键在于理解移动构造函数在创建a2
。 你的func
按值返回A
,它应该被复制到a2
。 但是,C ++编译器意识到您的程序在赋值后无法使用原始值,因此它通过调用移动构造函数来优化调用。
void main(){
A a1; -- > Normal constructor
A a2 = func(a1); --> Copy(a1 to a), Move(a to a2), destructor(a)
} --> destructor a1, a2
这就是您按顺序查看输出的原因。
func通过副本传递A(IE没有引用,它不是指针等)。 这就是调用复制构造函数的原因。 创建它之后,它将移动到a2的位置,从而移动构造函数。 移动后,a被销毁(因为func返回并且超出范围),然后是a1和a2(因为main返回)。
你问为什么它不会进入构造函数,但确实如此。 对于每个A,你创建一个不同的构造函数被调用,首先是a1(通常)然后是func(通过复制),然后是a2(通过移动)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.