为什么析构函数比构造函数调用得更多?

qtreez

在以下代码中,析构函数被调用两次,而构造函数仅被调用一次:

enum TFoo
{
    VAL1,
    VAL2
};

class CFoo
{

public:
    TFoo mf;

    CFoo()
    {
        cout<<"hi c'tor1\n";
        //mf = f;
    }
    CFoo(TFoo f)
    {
        cout<<"hi c'tor2\n";
        mf = f;
    }
    CFoo(TFoo &f)
    {
        cout<<"hi c'tor3\n";
        mf = f;
    }
    ~CFoo()
    {
        cout<<"bye\n";
    }
};

int main()
{
    vector<CFoo> v;
    //v.assign(1, VAL1);
    v.push_back(VAL1);
}

代码输出:

hi c'tor2
bye
bye

我发现了一个类似的问题,其中提到了复制构造函数,因此我添加了它们,但结果相同。取消注释该行//v.assign(1, VAL1);也不会更改任何内容。

鞋子

它最初是在TFooCFoo之间使用隐式转换运算符构造的CFoo(TFoo f),然后使用该临时对象将其传递给它,push_back以使用默认的复制构造函数或move构造函数构造容器中的对象,具体取决于您使用的是C ++ 11(不会显示任何内容)。然后临时对象被销毁,最后是容器中的对象(容器本身)。

甚至可以在这里这里(C ++ 11)看到它

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能在析构函数可以的同时显式调用构造函数?

为什么调用从对象移出的析构函数?

为什么析构函数被调用两次?

为什么析构函数调用两次表单?

为什么要调用派生类的析构函数?

为什么在执行复制之前调用析构函数?

当析构函数调用构造函数时会发生什么?

为什么要调用析构函数

为对象分配值时为什么调用构造函数和析构函数

为什么要在std :: vector :: push_back(T object)方法中构造对象时调用析构函数?

为什么在Friend函数中调用析构函数

为什么不调用继承类的析构函数?

为什么代码两次调用析构函数?

为什么析构函数被调用两次而构造函数仅被调用一次?

为什么std :: vector的构造函数调用自定义类的析构函数?

为什么在构造时调用C ++类的析构函数?

为什么我的类析构函数立即被调用?

为什么在复制分配期间调用析构函数?

当将对象作为参数传递时,为什么要调用析构函数但不调用构造函数?

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

C ++为什么在堆栈中构造完对象后立即调用析构函数?

为什么构造函数调用取决于默认析构函数的存在?

析构函数调用

为什么在“返回 0”后调用析构函数?

为什么 C++ 线程多次调用析构函数?

为什么同一个类对象的构造函数和析构函数被隐式调用多次

为什么在父类之前调用子类的析构函数?

从子构造函数/析构函数调用纯虚函数

为什么不调用析构函数?