gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:43 25 4
gpt4 key购买 nike

我正在做一些关于 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。最后m_a2等于5,用于B(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com