析构函数的奇怪调用顺序

时间:2019-06-09 15:50:37

标签: c++

我知道,当我将一个对象传递给一个带有不带参数的参数的函数时,会调用复制构造函数;当我在函数中返回一个对象时,当我尝试将该函数分配给一个函数时也会出现问题本地对象。析构函数的顺序不常见,我不知道为什么。

class myClass{
  int x;
  static int y;
  string name;
public:
    myClass(int i=10):x(i){ y++;cout<<"constr "<<y<<"\n"; name= "constr" +to_string(y) +'\n';}
    myClass(const myClass&ob){y++; x= ob.x; cout<<"copy-c "<<y<<" \n"; name= "copy-c" +to_string(y) +'\n';}
    ~myClass(){cout<<"destr " +name +'\n'; }

};
int myClass::y;
myClass f(myClass ob)
{
    return ob;
}
//main
myClass ob;
myClass s=f(ob);

输出:
构造1
copy-c 2
复制C 3
销毁复制C2
销毁复制C3
destr constr1

1 个答案:

答案 0 :(得分:3)

返回值的副本为elidedf的返回值直接在s的空间中构造。

因此,constr 1ob的构造函数。 copy-c 2是传递给f的临时文件。 copy-c 3f返回值的构造函数,它也是s的构造函数。在分号处,临时copy-c 2被销毁。在main的末尾,sob以此顺序被破坏。