C ++类变量析构函数

法罗克斯

我对C ++中的类变量和作用域有疑问。假设我有以下课程:

class TestClass {
public:
    std::vector<int> v;

    void foo()
    {
        v = std::vector<int>(10);
    }
}

现在,说我调用以下代码:

TestClass c;
c.foo();

向量(分配给v)的析构函数何时被调用?当foo()返回或c超出范围时会调用它吗?

4个

调用TestClass对象析构函数时,将调用成员向量的析构函数。当TestClass对象超出范围时会发生

{
  TestClass c;
  c.foo();
} // destructor for c calls destructor for v

这是因为C ++标准12.6.2 § 10:

在非委托的构造函数中,初始化按以下顺序进行:

—首先,并且仅对于最派生类(1.8)的构造函数,虚拟基类按照它们在基类的有向无环图的深度优先从左到右遍历时出现的顺序进行初始化,其中“左“从右到右”是基类在派生类base-specifier-list中的出现顺序。

—然后,直接基类按照它们出现在base-specifier-list中的声明顺序进行初始化(与mem-initializers的顺序无关)。

—然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样,无论mem-initializer的顺序如何)。

—最后,执行构造函数主体的复合语句。11 [注意:声明顺序是强制性的,以确保以相反的初始化顺序销毁基础和成员子对象。—尾注]

在该行中v = std::vector<int>(10),还将调用临时对象的析构函数,因为std::vector<int>(10)正在创建临时向量只是为了进行初始化v,然后将其销毁。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章