繁体   English   中英

如何在函数中创建局部变量?

[英]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。

那么它为什么不首先去建设者呢? (假设那里真的创建了一个本地对象)

幕后发生了什么抄袭?

提前致谢!

这是发生了什么(您的程序的打印输出与解释):

  • 在正常的ctor中 - 这发生在A a1; main
  • 在cpy ctor中 - 当A a of funcmain a1初始化时会发生这种情况
  • 在移动ctor中 - 当a funca1的副本)被设置为a2时会发生这种情况(请参阅copy elision作为回报)
  • 在dtor - a1的副本被销毁
  • 在dtor - a2被摧毁
  • 在dtor - 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM