c++ - 奇怪的析构函数调用顺序

标签 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
复制-c 2
复制-c 3
destr copy-c2
destr copy-c3
destr constr1

最佳答案

返回值的拷贝是elided ; f 的返回值直接在 s 的空间中构造。

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

关于c++ - 奇怪的析构函数调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56516057/

相关文章:

c++ - 如何以多态方式初始化 `static` 成员

c++ - C++ 中的委托(delegate)

c++ - 奇怪的 C++ 类型转换

c++ - Raspberry Pi 和 I2C in c++ with wiringPi for PCF8591

c++ - 如何在线程中使用 while true?

c++ - C++ 名称解析(和重载)规则列表

c++ - 无法使用类型为 'Parent' 的表达式初始化类型为 'Derived' 的对象参数

函数的 C++ 模板特化

c++ - 在 GCC 中使用一个 C 函数编译 C++

c++ - Char Star Array 参数未正确终止