2015-05-23 4 views
0

для кода ниже в интернет-C++ викторины раздел http://www.interqiew.com/ask?ta=tqcpp02&qn=3 - Я не могу понять, ответ - я добавил печати заявление -Объем переменной и объекта создания

вот что я понимаю

стадия а - создание объекта Б начинается с строитель B для параметра M_X - мы достигаем базового класса A - шаг 1 выполнен выход 0 - и приращения m_i 1

стадия B - код теперь становится M_X (2) - шаг 1 выполнил вывод 2 и увеличил m_i t O 3 создание M_X сделано

Стадия C - код достигает [2] (так что для двух объектов будет происходить ниже) - шаг 1 выполнен выход 0 и приращения m_i до 1 создания А [0] и A [1] сделано

Я визуализируя объект б с 3 контейнерами M_X, A [0] и а [1], каждая со значением m_i

Я не понимаю, ниже выхода - как мы получаем выход 2 - какое значение m_i используется?

Стадия D - входит в область STEP3 - шаг 3 выполнен выход 2

Выход -

шаг 1 --- 0 шаг 1 --- 2 шаг 1 - - 0 шаг 1 --- 0 шаг 3 ---- 2

class A 
{ 
public: 
    A(int n = 0) 
     : m_i(n) 
    { 
     std::cout << "step 1 --- " << m_i << endl; 
     ++m_i; 
     std::cout << m_i << endl; 
    } 

protected: 
    int m_i; 
}; 

class B 
    : public A 
{ 
public: 
    B(int n = 5) : m_a(new A[2]), m_x(++m_i) 
    { 
     std::cout << "step 3 ----" << m_i << endl; 
    } 

    ~B() { delete [] m_a; } 

private: 
    A m_x; 
    A *m_a; 
}; 

int main() 
{ 
    B b; 

    std::cout << std::endl; 

    return 0; 
} 
+0

Должно быть, это шаг 1 и т. Д.? BTW - вы забываете наследование, в соответствии с которым база должна быть построена сначала. –

+1

Конструктор 'B' начинается с построения своего базового класса' A', затем переходит к построению своих членов в порядке их появления в определении класса - 'm_x' first , затем 'm_a'. Еще два экземпляра 'A' ​​строятся в инициализаторе' m_a'. Наконец, выполняется тело конструктора 'B'. –

+0

Ах, а значит, это означает, что это будет что-то вроде ниже. Шаг 0 - Конструктор для b - достигает базового класса - выполняет шаг -1, т.е. 0, и увеличивает его до значения 1 - теперь создается m_x с шагом 2 из 2 и так далее на .. Думаю, я получил его сейчас .. !!! спасибо – oneday

ответ

1

В основной вы строите B

Но B наследует A

Так сделать первый. Таким образом, m_i инициализируется и выполняется std::cout << "step 1 --- " << m_i << endl;.

Обработка продолжается для конструктора B.

Тогда m_x, за которым следует m_a, будет инициализирован - не компилятор переупорядочивает здесь!

m_x Контрактор A вызывается дважды от нового оператора. Т. Е. Один раз для m_a - т. Е. 3 x `` std :: cout < < «этап 1 ---» < < m_i < < endl; `выполнено.

Далее следует остальная часть конструктора, то есть выполняется td::cout << "step 3 ----" << m_i << endl;. Что происходит со Шаг 2, это тайна.

+0

Хорошо, я думаю, что получил это - большой контейнер, т.е. объект b имеет свое значение m_i - спасибо за объяснение – oneday

+0

Существует четыре экземпляра 'A', созданных этой программой, и поэтому четыре независимых копии' m_i' , А именно: 'b.A :: m_i'; 'B.m_x.m_i'; 'B.m_a [0] .m_i'; и 'b.m_a [1] .m_i' - построены в этом порядке. –

Смежные вопросы