typedef
:
typedef double wages; //
typedef wages base, *p; //
Ключевое слово typedef
может быть частью базового типа в объявлении (см. раздел 2.3). Объявления, включающие ключевое слово typedef
, определяют псевдонимы типа, а не переменные. Как и в любое другое объявление, в это можно включать модификаторы типа, которые определяют составные типы, включающие базовый тип.
=
.
using SI = Sales_item; //
Объявление псевдонима задает слева от оператора =
имя псевдонима типа, который расположен справа.
Псевдоним типа — это имя типа, оно может присутствовать везде, где присутствует имя типа.
wages hourly, weekly; //
SI item; //
Объявления, использующие псевдонимы типа, представляющие составные типы и константы, могут приводить к удивительным результатам. Например, следующие объявления используют тип pstring
, который является псевдонимом для типа char*
.
typedef char *pstring;
const pstring cstr = 0; //
const pstring *ps; //
//
Базовым типом в этих объявлениях является const pstring
. Как обычно, модификатор const
в базовом типе модифицирует данный тип. Тип pstring
— это указатель на тип char
, a const pstring
— это константный указатель на тип char
, но не указатель на тип const char
.
Заманчиво, хоть и неправильно, интерпретировать объявление, которое использует псевдоним типа как концептуальную замену псевдонима, соответствующим ему типом:
const char *cstr = 0; //
Однако эта интерпретация неправильна. Когда используется тип pstring
в объявлении, базовым типом объявления является тип указателя. При перезаписи объявления с использованием char*
, базовым типом будет char
, а *
будет частью оператора объявления. В данном случае базовый тип — это const char
. Перезапись объявляет cstr
указателем на тип const char
, а не константным указателем на тип char
.
auto
auto
. В отличие от таких спецификаторов типа, как double
, задающих определенный тип, спецификатор auto приказывает компилятору вывести тип из инициализатора. Само собой разумеется, у переменной, использующей спецификатор типа auto
, должен быть инициализатор.
//
auto item = val1 + val2; //
Здесь компилятор выведет тип переменной item
из типа значения, возвращенного при применении оператора +
к переменным val1
и val2
. Если переменные val1
и val2
— объекты класса Sales_item
(см. раздел 1.5), типом переменной item
будет класс Sales_item
. Если эти переменные имеют тип double
, то у переменной item
будет тип double
и т.д.
Подобно любому другому спецификатору типа, используя спецификатор auto
, можно определить несколько переменных. Поскольку объявление может задействовать только один базовый тип, у инициализаторов всех переменных в объявлении должны быть типы, совместимые друг с другом.
auto i = 0, *p = &i //