Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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++_Oop_Object_Reference_Destructor - Fatal编程技术网

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

C++ 返回的返回类型是对象的引用?,c++,oop,object,reference,destructor,C++,Oop,Object,Reference,Destructor,这就是我所相信的: 当一个函数返回时,它将创建一个新的临时对象副本,并且这个临时对象将在调用它的语句期间保留在内存中 当函数返回引用时,对象本身也会返回。这意味着该对象不应该是本地对象 所以当我这样做的时候: MyStruct & ReferenceReturn(MyStruct cl) { return cl; } 总的来说我喜欢 此输出显示每个调用只创建一个对象。(有两个电话) 但是为什么没有析构函数它就不能工作呢 谢谢 创建临时对象,将其分配给cl,将引用

这就是我所相信的:

当一个函数返回时,它将创建一个新的临时对象副本,并且这个临时对象将在调用它的语句期间保留在内存中

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

所以当我这样做的时候:

 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }
总的来说我喜欢

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

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

谢谢

创建
临时对象
,将其分配给
cl
,将
引用
返回到对象,销毁对象。所以,它是悬挂参考。编译器可以使用
复制省略
并且不复制对象,但不能。。。用点什么lile

 MyStruct & ReferenceReturn(MyStruct& cl)
 {
         return cl;
 }
创建
临时对象
,将其分配给
cl
,将
引用
返回到对象,销毁对象。所以,它是悬挂参考。编译器可以使用
复制省略
并且不复制对象,但不能。。。用点什么lile

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

对于此类情况,结果是否未定义

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


对于此类情况,结果是否未定义


该函数显示未定义的行为,是的。问题是,
cl
是函数中的一个本地对象,您返回了对它的引用。这是未定义的行为。调用方将创建一个
g
的副本以传递给
ReferenceReturn
,该副本将在
return
之后,即调用方使用引用之前,由
ReferenceReturn
函数销毁。

我发现该对象在语句之后被销毁。当我添加析构函数时,它的输出在cout@ASHISHNEGI之后,在copy-ctor中插入跟踪如何?但在MSVC中,结果并不相同。因此,按照标准,这种用法是不正确的。正如您所看到的,在输出“0”的语句“cout”之后调用传递对象的析构函数输出“d-tor”,这意味着在该语句完成之前,该对象是良好的。所以它起作用了。。但当我移除析构函数和复制构造函数时;垃圾在我的箱子里被打印出来。@ASHISHNEGI这是不正确的。这种情况在complilers中的实现是未定义的。我发现该对象在语句之后被破坏。当我添加析构函数时,它的输出在cout@ASHISHNEGI之后,在copy-ctor中插入跟踪如何?但在MSVC中,结果并不相同。因此,按照标准,这种用法是不正确的。正如您所看到的,在输出“0”的语句“cout”之后调用传递对象的析构函数输出“d-tor”,这意味着在该语句完成之前,该对象是良好的。所以它起作用了。。但当我移除析构函数和复制构造函数时;垃圾在我的箱子里被打印出来。@ASHISHNEGI这是不正确的。在complilers中实现这种情况是未定义的。这种情况下的结果是未定义的吗?这种情况下的结果是未定义的吗?“可能在调用方使用引用之前”没有析构函数,您是对的;当我右解构时,会发生其他情况-->函数的本地副本在cout语句之后被销毁。所以析构函数在这里做了一些事情,或者它像你说的那样是未定义的。@ASHISHNEGI:我不知道如何才能更清楚地说明它:函数表现出未定义的行为。未定义的行为意味着它似乎可以工作,或者可能提供不正确的结果或使应用程序崩溃,但在所有情况下它仍然是未定义的行为;当我右解构时,会发生其他情况-->函数的本地副本在cout语句之后被销毁。所以析构函数在这里做了一些事情,或者它像你说的那样是未定义的。@ASHISHNEGI:我不知道如何才能更清楚地说明它:函数表现出未定义的行为。未定义的行为意味着它似乎可以工作,或者可能提供不正确的结果或使应用程序崩溃,但在所有情况下它仍然是未定义的行为。
myname is destroying
myname
myname
myname is destroying
.... 
 MyStruct & ReferenceReturn(MyStruct cl)
 {
         return cl;
 }
 MyStruct & ReferenceReturn(MyStruct& cl)
 {
         return cl;
 }
 MyStruct & ReferenceReturn(MyStruct cl) {
    return cl;
 }