我知道当我将一个对象传递给一个没有引用的参数的函数时,复制构造函数被调用;当我在一个函数中返回一个对象时,问题也出现了,当我试图将函数分配给一个本地对象。析构函数的顺序不是通常的顺序,我不明白为什么。
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
复制-c 2
复制-c 3
destr copy-c2
destr copy-c3
destr constr1
最佳答案
返回值的拷贝是elided ; f
的返回值直接在 s
的空间中构造。
因此,constr 1
是ob
的构造函数。 copy-c 2
是临时传递给f
。 copy-c 3
是f
返回值的构造函数,也是s
的构造函数。在分号处,临时 copy-c 2
被销毁。在 main
的末尾,s
和 ob
按此顺序销毁。
关于c++ - 奇怪的析构函数调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56516057/