2016-02-25 7 views
-2
#include <iostream> 
using namespace std; 

class A 
{ 
    int x; 
public: 
    A() { cout << "A's constructor called " << endl; } 
}; 

class B 
{ 
    static A a; 
public: 
    B() { cout << "B's constructor called " << endl; } 
    static A getA() { return a; } 
}; 

A B::a; // definition of a 

int main() 
{ 
    B b1, b2, b3; 
    A a = b1.getA(); 

    return 0; 
} 

Выход:
конструктор назвал
конструктор Б называется
конструктор Б называется
конструктор Б называетсяПочему конструктор статического члена вызывается перед конструктором содержащего класса?

Я не могу понять, как мы получили выше вывод и как объект объявлен в 1-й класс в классе 2-й.

+0

Почему, по вашему мнению, результат неправильный? – drescherjm

+2

Объявление 'static'' A' в классе 'B' вызывает вызов первого конструктора. Компилятор будет генерировать код для инициализации глобальных и * статических * переменных перед вызовом 'main'. –

+4

Если вы пройдете через свой код с помощью отладчика, должно стать довольно понятно, почему он ведет себя так. 'static A a;' является статическим объектом и будет экземпляр один раз для всех экземпляров 'B'. –

ответ

2

Я не могу понять, как мы получили вышеуказанный результат и как объект объявлен 1-го класса в классе 2-го.

static A a; 

является статическим членом class B и будет инстанцирован один раз для всех экземпляров B.

Это происходит еще до того, main() введен, и вам повезло, что

cout << "A's constructor called " << endl; 

работал хорошо, так как static экземпляров не гарантируется быть инициализированы в определенном порядке (обратите внимание, что std::cout просто еще один static объект).

+0

«статические» экземпляры не могут быть инициализированы в определенном порядке »- это не совсем так, см. [Здесь] (http://stackoverflow.com/questions/1421671/when-are-static-c- инициализированные члены класса), но я понимаю дух вашего заявления. «объекты, определенные в одной и той же единице перевода (обычно это означает .cpp-файл), инициализируются в порядке их определений (не деклараций)» –

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