I was looking for some tests to improve my C++ knowledge. Here is one of the exercises: What is the output of the following program?
#include <iostream>
class A
{
public:
A(int n = 0) : m_i(n)
{
std::cout << m_i;
++m_i;
}
protected:
int m_i;
};
class B : public A
{
public:
B(int n = 5) : m_a(new A[2]), m_x(++m_i) { std::cout << m_i; }
~B() { delete [] m_a; }
private:
A m_x;
A *m_a;
};
int main()
{
B b;
std::cout << std::endl;
return 0;
}
Well, I tried this code, and the answer is 02002. I come here to have some explanation because I don't understand why 02002 is the result.
I will explain my reasoning, but could some tell me where am I wrong please?
Let's call "str" the current string to print. When the b object is built:
- The constructor of
Ais called. str =>0,m_i=>1 - Construction of
m_a(new A[2]). str =>000 - Construction of
m_x(++m_i). str =>0002,m_i=>3 - Last update of str (in
B's constructor) => str =>00023
Here are my questions:
- Why is the final value of
m_i2and not3? - Why is the construction of
m_x(++m_i)done before the one ofm_a(new A[2])? I tried to exchange the position of the initialization of m_x and m_a and the answer is still the same :02002.
Aucun commentaire:
Enregistrer un commentaire