Как ведёт себя компилятор при объявлении классов?

При программировании в процедурном стиле, если мы делаем вот-так:

int main()
{ cout << foo(); }

int foo()
{return 0;}

То компилятор выдает ошибку, т. к. читает код построчно, и не находит функцию foo(), потому что она объявлена после ее вызова. Но у меня возникает вопрос: как ведёт себя компилятор, когда мы объявляем класс?

class MyClass
{
public:
    int foo()
    { cout << a(); }
    
    int a()
    { return ab; }
    
    int ab = 0;
}b;

int main()
{
   b.foo();
}

Тут мы вызываем функцию а() до ее объявления и при этом она возвращает еще не объявленную переменную ab. По идее, если компилятор будет читать этот код построчно, то обязательно выдаст ошибку, но тут не выдает, т. к. это класс. Каким образом компилятор знает какую функцию надо вызывать если она ещё не объявлена?


Ответы (1 шт):

Автор решения: AlexGlebe

Анализ класса идёт в несколько этапов. Сначала анализируется общий состав структуры класса. Чтобы узнать общий размер всей структуры. Увидел структуру и сделал :

class MyClass {
  int ab ; } ;

Затем зарегистрировал функции, которые могут получить доступ к этому классу. Записал весь порядок и тип аргументов.

int MyClass::_foo(MyClass * const this) ;
int MyClass::_a(MyClass * const this);

После всего он уже записывает в код все эти функции. Он уже знает состав структуры и список методов уже есть в таблице. Указатели на эти функции будут уже прописаны позже в процессе линковки.

Инлайн вставка в код это дело индивидуальное. Копилятор может это сделать, а может и нет.

→ Ссылка