如果我在我的函数中 return a class,它存储在哪里?

if I return a class in my function, where does it store?

看看我的代码:

#include <iostream>
using namespace std;
class MyClass{
public:
    char ch[50] = "abcd1234";
};
MyClass myFunction(){
    MyClass myClass;
    return myClass;
}
int main()
{
    cout<<myFunction().ch;
    return 0;
}

我不明白我的 return 值存储在哪里?它存储在堆栈中吗?在堆?在我的程序完成之前它是否保留在内存中?

如果它存储在堆栈中,我可以确保我的 class 值永远不会改变吗?

请解释这些return的机制。如果 returning 结构与 returning class?

不同

找到一个合理的位置来存储该值取决于实现。虽然它通常在堆栈上,但语言定义并不对其实际存储位置强加任何要求。返回值是一个临时对象,它在创建它的完整语句结束时被销毁;也就是说,它在调用 myFunction().

行末尾的 ; 处被销毁

当您在任何函数中创建一个对象时,它会在函数执行完成后立即销毁,就像在变量中一样。 但是,当您 return 来自函数的对象时,编译器首先在堆中创建该对象的本地实例,称为 unnamed_temporary 然后销毁您创建的对象。并复制unnamed_temporary随叫随到的内容。然后它也销毁了这个未命名的_temporary。 您创建的任何不使用关键字 new 的内容都将在堆栈中创建。 是的,你的变量 ch 的内容不会改变,除非你访问那个变量并自己改变它。

MyClass myClass; 存储在堆栈中。 myFunction() 退出后立即销毁。

当你return它时,会在堆栈上创建一个副本。此副本一直存在到封闭表达式的末尾:cout << myFunction().ch;


请注意,如果您的编译器足够聪明,则根本不应创建第二个对象。相反,第一个对象将一直存在到封闭表达式的末尾。这叫做NRVO命名return值优化

另请注意,标准未定义 "stack"。但是在这种情况下,任何常见的实现都会使用堆栈。


if returning structure is different to returning class?

C++中没有结构;关键字 struct 创建 类。 classstruct 之间的唯一区别是默认成员访问权限,因此答案是 "no"。

myFunction返回的实例是临时的,当它停止有用时它就消失了,所以在cout <<...之后它就不存在了。只需添加一个析构函数,您就会看到它何时被调用。

我能确定我的 class 值永远不会改变吗? 是什么意思?您获得实例的 副本

返回结构与返回 class? 不同:struct 类似于 class 默认情况下都是 public,这是唯一的区别。

您的函数正在返回一个对象的副本。它将存储在内存中的堆栈中。 返回的对象。将存在直到该功能的范围。之后,它将被销毁。然后,您的表达式 cout<<function(); 也将具有该对象的副本。由函数返回。在这个cout<<function();表达式的运行之后IT将被完全销毁。