Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在函数中创建局部变量?_C++_Variables_Constructor_Scope_Compilation - Fatal编程技术网

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