gpt4 book ai didi

c++ - 函数调用完成返回对象后无法解释析构函数调用

转载 作者:行者123 更新时间:2023-11-28 02:24:48 25 4
gpt4 key购买 nike

我尝试运行下面的代码,但我不明白析构函数何时以及为何在 myA=foo(myOtherB) 行被调用。

我的问题是,在 foo 函数返回 A 对象之后,从 'input' 复制构造它并打印 A copyctor,operator= 被调用打印 'Aop' 然后调用析构函数打印驱动程序。

为什么此时调用析构函数而不是在 operator= 调用之前的返回之后立即调用?

我遇到的另一个问题是,如果我使用 return A(2) 而不是 return input构造函数 A 不会被调用打印 A ctor...

谁能解释一下?我很抱歉代码有点复杂。

#include <iostream>

using namespace std;

class A
{
public:
int x;
A(){ cout<<"A ctor"<<endl; }
A(const A& a){cout<<"A copyctor"<<endl; }
virtual~A(){ cout<<"A dtor"<<endl;}
virtual void foo(){ cout<<"Afoo()"<<endl;}
virtual A& operator=(const A&rhs){cout<<"Aop="<<endl; }
A(int _x)
{
x=_x;
}
};


class B:public A
{
public:
B(){ cout<<"B ctor"<<endl; }

virtual~B(){ cout<<"B dtor"<<endl; }
virtual void foo(){ cout<<"B foo()"<<endl; }
protected:
A mInstanceOfA;

};

A foo(A& input)
{ input.foo(); return input; //return A(2); does not call the A constructor }



int main()
{

B myOtherB;
A myA;
myA=foo(myOtherB);

}

最佳答案

return A();

这叫做 most vexing parse .
您不是在调用 A 的构造函数(不是创建新实例),而是声明一个返回 A 的函数(阅读链接以获取进一步且可能更正确的解释)。

您可以通过以下方式调用构造函数:

return A{2};

这叫做 Uniform initialization syntax (C++ 11 及更高版本)


A myA;
myA=foo(myOtherB);

在这种情况下,您首先创建一个新的 A 对象 (myA),然后将变量分配给 foo 的返回值> 函数。
由于第二行,这将调用赋值运算符。
您将 foo 返回的值复制到 myA 变量。

当已经创建的myA变量被重新赋值时,旧值将被销毁,从而调用析构函数

我认为您所追求的是以下内容:

A myA = foo(myOtherB);

关于c++ - 函数调用完成返回对象后无法解释析构函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31098282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com