Как приведенная ниже программа оценивает следующее? 1. Как оценивается параметризованный конструктор? слева направо ?
ZA (int n) 0 —> вызывается конструктор базового класса.
ZA (int n) 2 -> как здесь m_i = 2?
ZA (int n) 0 —-> конструктор для переменной-члена ZA, определенной в Zb, называется
ZA (int n) 0
ZB (int n) 2
#include <iostream>
using namespace std;
class ZA
{
public:
ZA(int n = 0) : m_i(n)
{
std::cout <<"ZA (int n)" <<m_i<<endl;
++m_i;
}
protected:
int m_i;
};
class ZB : public ZA
{
public:
ZB(int n = 5) : m_a(new ZA[2]), m_x(++m_i)
{
std::cout <<"ZB (int n)" <<m_i<<endl;
}
~ZB()
{
delete [] m_a;
}
private:
ZA m_x;
ZA *m_a;
};
int main(void)
{
ZB b;
std::cout << std::endl;
}
Вот что происходит:
ZB(0)
называется но не запускается
базовый конструктор ZA(0)
называется => «ZA (int n) 0» а также m_i = 1
инициализаторы обрабатываются в порядке объявления полей:
m_x(++m_i)
оценивается с ++ 1 = 2 => «ZA (int n) 2» а также m_i = 2
m_a(new ZA[2])
оценивается и создается два экземпляра ZA => «ZA (int n) 0» дважды
наконец, конструктор ZB запускается => «ZB (int n) 2«
Других решений пока нет …