Определение типа typedef
Описания, содержащие спецификатор_описания typedef, определяют идентификаторы, которые позднее могут использоваться так, как если бы они были ключевыми словами типа, именующее основные или производные типы.
typedef-имя: идентификатор
Внутри области видимости описания, содержащего typedef, каждый идентификатор, возникающий как часть какого-либо описателя, становится в этом месте синтаксически эквивалентным ключевому слову типа, которое именует тип, ассоциированный с идентификатором таким образом, как описывается в #8.4. Имя класса или перечисления также является typedef-именем. Например, после
typedef int MILES, *KLICKSP; struct complex { double re, im; };
каждая из конструкций
MILES distance; extern KLICKSP metricp; complex z, *zp;
является допустимым описанием; distance имеет тип int, metricp имеет тип "указатель на int".
typedef не вводит новых типов, но только синонимы для типов, которые могли бы быть определены другим путем. Так в приведенном выше примере distance рассматривается как имеющая в точности тот же тип, что и любой другой int объект.
Но описание класса вводит новый тип. Например:
struct X { int a; }; struct Y { int a; }; X a1; Y a2; int a3;
описывает три переменных трех различных типов.
Описание вида
описание_имени: агрег идентификатор ; enum идентификатор ;
определяет то, что идентификатор является именем некоторого (возможно, еще не определенного) класса или перечисления. Такие описания позволяют описывать классы, ссылающихся друг на друга. Например:
class vector; class matrix { ... friend matrix operator* (matrix,vector); };
class vector { ... friend matrix operator* (matrix,vector); };