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
. В отличие от таких спецификаторов типа, как 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 //