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;
}