c++ - 返回的返回类型是对象的引用?

标签 c++ oop object reference destructor

这是我的看法:

当一个函数返回时,它会创建该对象的一个​​新的临时拷贝,并且这个临时对象会在调用它的语句的时间保留在内存中。

当函数返回引用时,对象本身也被返回。这意味着该对象不应该是本地的。

所以当我这样做时:

 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }

在 main() 中我做

MyStruct d("notmyname"),g("myname");
d = ReferenceReturn(g);
cout << d.name;
cout << ReferenceReturn(g).name;

它在两者中打印垃圾。

返回什么? : 对 g 的本地拷贝的引用,即 cl 在函数完成后立即被销毁,或者对在语句结束后被销毁的临时对象的引用。但是因为如果 temp 已经被创建,它就会以正确的方式被覆盖。所以我相信返回的是传递值的本地拷贝的引用。

但是一旦我在结构中创建析构函数,它就完美地运行了,具有以下代码和特定输出。

 ~MyStruct()
 {
   cout << name << " is destroying";
  }

输出:

myname is destroying
myname
myname
myname is destroying
.... 

此输出显示每次调用只创建一个对象。 (有两个调用)

但为什么没有析构函数它就不能工作?

谢谢

最佳答案

 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }

创建临时对象,将其分配给cl,返回对象的引用,销毁对象。所以,它是悬挂引用。编译器可以使用 copy-elision 并且不复制对象,但不能...使用一些东西 lile

 MyStruct & ReferenceReturn(MyStruct& cl)
 {
         return cl;
 }

关于c++ - 返回的返回类型是对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12124412/

相关文章:

c++ - 什么是 'undeclared identifier' 错误,我该如何解决?

C++ 指针和动态内存

c++ - 带有节点迭代器的链表构造函数给出无效指针的错误

java - 如果提供了字段名称,如何一般填充对象?

c++ - 没有成员可用于声明为类变量的对象

JAVA:根据变量的值调用类方法

将具有相同属性的构造函数对象推送到数组的 JavaScript 函数

c++ - 线程连接挂起

java - 跟踪 Swing 组件的正确方法是什么?

javascript - 如何在javascript中将对象作为键值对进行迭代