我知道,当我将一个对象传递给一个带有不带参数的参数的函数时,会调用复制构造函数;当我在函数中返回一个对象时,当我尝试将该函数分配给一个函数时也会出现问题本地对象。析构函数的顺序不常见,我不知道为什么。
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
答案 0 :(得分:3)
返回值的副本为elided; f
的返回值直接在s
的空间中构造。
因此,constr 1
是ob
的构造函数。 copy-c 2
是传递给f
的临时文件。 copy-c 3
是f
返回值的构造函数,它也是s
的构造函数。在分号处,临时copy-c 2
被销毁。在main
的末尾,s
和ob
以此顺序被破坏。