我試着運行下面的代碼,我不明白何時以及爲什麼析構函數在myA=foo(myOtherB)
處被調用。函數調用完成後無法解釋析構函數返回對象
我的問題是,在foo函數返回A對象後,從'input'複製構造它並打印一個複製函數operator=
被調用打印'Aop',然後析構函數被調用打印A dtor。
爲什麼析構函數在此時調用而不是在operator=
調用之前的返回之後?
另一個問題,我有是,如果我使用return A(2)
代替return input
構造函數不會被調用打印的男星......
誰能解釋一下嗎?我的代碼是一個有點複雜遺憾。
#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);
}
我想我理解構造函數的一部分,但我沒有實際分配任何東西給myA,因爲operator =只是執行一個cout ...所以爲什麼析構函數被調用,因爲沒有重新賦值myA?Does =總是意味着重新賦值no你在運算符=函數中做什麼? –