c++移动构造函数和作用域

C++ move constructor and scope

本文关键字:作用域 构造函数 移动 c++      更新时间:2023-10-16

如果我有一个在堆栈上声明的对象,并且我返回对它的引用,我相信我将无法再访问它,因为它超出了作用域。正确吗?

如果我只是返回对象本身(不是对它的引用)怎么办?会调用复制构造函数吗?(我听说过术语"移动构造函数",但从我读到的,它似乎是一个新功能。有人能详细说明一下吗?)

在哪些情况下会调用析构函数?

如果我有一个在堆栈上声明的对象,并且我返回对它的引用,我相信我将无法再访问它,因为它超出了作用域。正确吗?

正确,析构函数将在超出作用域时被调用。

如果我只是返回对象本身(不是对它的引用)怎么办?会调用复制构造函数吗?

可以调用复制构造函数和析构函数,但通常编译器将执行返回值优化,而不会进行复制、析构函数或移动操作。

要了解move构造函数,请阅读move语义和右值引用。

如果我有一个在堆栈上声明的对象,并且我返回对它的引用,我相信我将无法再访问它,因为它超出了作用域。正确吗?

正确,许多编译器也会给你警告。

如果我只是返回对象本身(不是对它的引用)怎么办?会调用复制构造函数吗?

它将调用复制构造函数。来自标准的Std::数组没有Std::move构造函数定义为内部使用堆栈内存。因此将调用复制构造函数。

在哪些情况下会调用析构函数?

在这两种情况下都将调用析构函数。只是在move构造函数之后,我们将所有指针/处理到其他对象,因此对象状态将是空的(但一致)。

编译器将尝试优化这些函数以消除复制操作。结果代码将表现得好像对象是在函数返回具有适当生命周期的对象时创建的。参考这里。这取决于编译器,以及代码本身在构造点和使用点的结构。优化也可能是不可能的,在这种情况下,您可能需要调用复制或移动构造函数(如果可用)。

如果编译器优化了函数,那么当使用点的对象超出最近的块作用域时,将调用析构函数。

如果没有优化,则对象将在使用点被复制到另一个对象(一次调用复制/移动构造函数),然后函数中的对象将被销毁(如果复制),最后当复制/移动对象的析构函数在函数返回它的位置(使用点)离开最近的块作用域时将被调用。

但是,如果从函数返回一个临时变量,那么你将返回一个指向已销毁内存的引用或指针,因为你的临时变量将在函数返回时超出作用域而被销毁。