返回的返回类型是对象的引用?

时间:2012-08-25 18:06:51

标签: 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,一旦函数完成就会被销毁,或者对语句结束后被销毁的临时对象的引用。但是既然如果真的会被创造出来,它就会以正确的方式克服d。所以我相信它是传递值的本地复制的参考。

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

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

输出:

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

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

但是为什么没有析构函数就无法工作?

由于

2 个答案:

答案 0 :(得分:2)

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

创建temporary object,将其分配给cl,将reference返回给对象,销毁对象。所以,它是dangling reference。编译器可以使用copy-elision并且不复制对象,但不能......使用lile

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

答案 1 :(得分:1)

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

这种情况的结果是否未定义?

该函数表现出未定义的行为,是的。问题是cl是函数中的本地对象,并且您将返回对它的引用。这是未定义的行为。调用者将创建一个g的副本以传递给ReferenceReturn,该副本将在ReferenceReturn之后被return函数销毁,可能在调用者到达之前使用参考。