C++ 如何在函数中创建局部变量?
假设我有以下代码:C++ 如何在函数中创建局部变量?,c++,variables,constructor,scope,compilation,C++,Variables,Constructor,Scope,Compilation,假设我有以下代码: #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() { cou
#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);
}
现在我很难理解函数“func”中发生了什么
当a1被发送到函数时,函数不通过byRef接收它,而是“创建”它自己的a1版本,即“a”
这就是为什么当函数结束时,对象“死亡”并进入析构函数
那么,为什么不首先将它交给构造器呢?(假设确实在那里创建了本地对象) 有没有在幕后进行的复制 提前谢谢
void main(){
A a1; -- > Normal constructor
A a2 = func(a1); --> Copy(a1 to a), Move(a to a2), destructor(a)
} --> destructor a1, a2
这就是为什么你会看到输出的顺序 func通过副本传递(即没有引用,也不是指针等)。这就是调用复制构造函数的原因。创建后,它被移动到a2的位置,从而移动构造函数。移动后,a将被销毁(因为func返回并且超出范围),然后a1和a2都被销毁(因为main返回) 你问为什么它不进入构造函数,但它进入了。对于您创建的每一个A,都会调用一个不同的构造函数,首先是a1(通常),然后是func中的A(通过复制),最后是a2(通过移动)。下面是发生的情况(您的程序的打印输出和说明):
- 在正常情况下-这发生在
a1中代码>的
main
- 在cpy ctor中-当
的func
从A
main的
初始化时会发生这种情况a1
- 在move ctor-当
的func
和a
的副本被设置到a1
中时会发生这种情况(请参见返回)a2
- 在dtor-
的副本被销毁a1
- 在dtor-
中被销毁a2
- 在dtor-
中被销毁a1
我认为这里的关键是理解move构造函数在创建
a2
中的作用。您的func
按值返回A
,该值应复制到a2
。但是C++编译器意识到,在分配后,程序无法使用原始值,因此通过调用移动构造函数来优化调用。“为什么它不也去构造器”它在CPY CCTO/<代码>代码>中编写<代码>,而是“创建”它自己的版本,是的,它被称为复制构造,您可以在cpy-ctor的中看到它,但它不是复制,因为“A a2=func(a1)”?它不在房间里function@Martin不,这个赋值优化为move-construction,在move-ctor
@freakish哦,我明白了,复制构造函数是因为函数中的“创建”而发生的?而这一举措实际上是主要的?(因为它是右值)非常感谢!现在我看到了我所犯的错误,我认为复制构造函数发生在主函数中,当它实际发生在函数中时,它实际上创建了“a”!
void main(){
A a1; -- > Normal constructor
A a2 = func(a1); --> Copy(a1 to a), Move(a to a2), destructor(a)
} --> destructor a1, a2