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

杰诺里夫

我遇到的问题是,在构造类时会调用我的类析构函数。考虑以下测试程序:

#include <iostream>
#include <vector>

using namespace std;

class X
{
public:
    X()  { cout << "X::X()" << endl; };
    ~X() { cout << "X::~X()" << endl; };
};

class Y : public X
{
public:
    Y() : X() { cout << "Y::Y()" << endl; };
    ~Y()      { cout << "Y::~Y()" << endl; };
};

int main() {
    vector<Y> a;
    a.resize(10);
    while(true) ;
    return 0;
}

输出(从循环之前开始)是

X::X()
Y::Y()
Y::~Y()
X::~X()

我不了解上述片段的行为:

  1. 为什么只构造一个元素?
  2. 为什么要调用析构函数?
罗德里戈

的原型std::vector::resize()是:

void resize( size_type count, T value = T() );

因此,它将创建一个临时默认值以插入到向量中(您的构造函数调用),然后将其复制构造到向量中10次(您不记录这些值),然后销毁该临时值(您的析构函数调用)。

请注意,C ++ 11发生了变化。现在有两个重载:

void resize( size_type count );
void resize( size_type count, const value_type& value);

因此,如果使用正确的C ++ 11编译器,则将调用第一个重载,并且值将被初始化,即它将使用默认构造函数。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++类变量析构函数

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

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

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

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

在模板类的构造函数末尾调用的模板的析构函数

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

C ++破坏顺序:在类析构函数之前调用字段析构函数

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

内部类析构函数在基类析构函数之后被调用

模板类的构造函数和析构函数声明语法

类构造函数或析构函数之后的分号(;)

从基类析构函数调用派生类方法

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

为什么此析构函数不必删除类对象?

析构函数调用

C++ 可以使析构函数不调用类成员的析构函数和基类的析构函数吗?

为什么 C++ 中类字段的默认初始化需要析构函数调用?

调用类型嵌套在类内部的对象析构函数?

类和成员析构函数调用两次

是否在作业中调用了类析构函数?

未按预期的相反顺序调用类析构函数

模板类(N)调用的析构函数过多

为什么类的默认构造函数和析构函数是内联的?

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

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

C ++ Qt基类虚拟析构函数

C ++ 11在派生类中删除的析构函数

如何正确实现C ++类的析构函数