c++ - 使用析构函数时清除成员变量

标签 c++ inheritance destructor

我正在参加一些关于 C++ 的在线测验,下面是我遇到的问题

http://www.interqiew.com/ask?ta=tqcpp01&qn=3

class A
{
public:
    A(int n = 2) : m_i(n) { }

    ~A() { std::cout << m_i; }

protected:
    int m_i;
};

class B
    : public A
{
public:
    B(int n) : m_a1(m_i + 1), m_a2(n) { }

public:
    ~B()
    {
        std::cout << m_i;
        --m_i;
    }

private:
    A m_a1;
    A m_a2;
};

int main()
{
    { B b(5); }

    std::cout << std::endl;

    return 0;
}

答案是“2531” -

我期望答案是“21” - 基本原理如下(这似乎是错误的):

对象 B 使用三个成员变量创建,起始值为 2 - 253

因此,当调用析构函数时,将以相反的顺序删除。

对于这种情况,析构函数将调用继承的部分 - 我们打印 2,我们递减值并转到 1,然后打印基数,同时删除 - 所以答案 21

变量 m_a2 和 m_a1 是如何打印的 - 无法理解。 它还在基础部分(即 A 类)中打印(值 53)

最佳答案

让我们考虑一下构造函数

B(int n) : m_a1(m_i + 1), m_a2(n) { }

相当于

B(int n) : A(), m_a1(m_i + 1), m_a2(n) { }

因此,首先 m_i 由构造函数 A 的默认参数初始化,并且等于 2。 然后m_a1将被m_i + 1初始化,即等于3。最后调用B(5)时m_a2将等于5

然后,当 B 的析构函数被调用时,它会输出

std::cout << m_i;

那就是

2

然后减少m_i

--m_i;

数据成员的析构函数以与其构造相反的顺序调用。所以首先会调用m_a2的析构函数并输出

5

然后会调用m_a1的析构函数并输出

3

最后将调用基类的析构函数,输出

1

所以你会得到

2531

至于你的问题,A 的析构函数被调用三次:两次是在类 B 的数据成员 m_a1 和 m_a2 被销毁时(因为它们具有类型类 A),一次是在调用基类构造函数时。

关于c++ - 使用析构函数时清除成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30404397/

相关文章:

c++ - 如何在 OpenCV 的 cvShowImage() 函数调用的窗口中显示中文文本?

c++ - Minimax 算法中的线程

java - 如何跳过扩展抽象类的类中的一个方法?

python - 这是Python继承中的一个错误吗?

c++ - 子类的静态成员变量

c++ - 结构对象析构函数

javascript - JS字符串解构: rest parameter returning inconsistent data

c++ - Eigen :如何检查矩阵是否可逆

c++ - 这个单向链表析构函数是如何导致死循环的?

c++ - unique_ptr 和带有 C API 的库,带有指向指针函数参数的指针