Я думаю, что вы должны различать «этот синтаксический анализ», «этот компилятор», «этот линк» и «это работает», и попытаться думать как синтаксический анализатор / компилятор / компоновщик C ++ самостоятельно, чтобы увидеть, что первый пример
Example e1(); // function prototype
выглядит как объявление функции. Синтаксический анализатор поймет это таким образом, поэтому вы не можете вызвать, например, функция-член на e1
. Компилятор сгенерирует символ, относящийся к некоторой функции (он пока не видит), но, поскольку функция нигде не используется, он не будет жаловаться. Если вы добавите этот код, он будет:
e1.f();// since e1 is a function, it has no member 'f' => compiler error
(в качестве sidenote: этот код также будет компилироваться:
int a_function_prototype(int); // another prototype.
e1(); // should work!
a_function_prototype(5);
но после завершения работы компилятора компоновщик начнет поиск реальных тел функций и не найдет их.)
Теперь, так как линия
Example* e = new Example();
содержит ключевое слово new
, которое распознает компилятор, и он знает, что его можно найти только при выделении + построении нового объекта, он сгенерирует код для этого.