R Справочное руководство по С++

R.8.4 Инициализаторы.

   


Назад  |  Вперёд

За описателем может идти начальное значение описываемого идентификатора.

           инициализатор:
                 = выражение-присваивания
                 = { список-инициализаторов , opt }
                 ( список-выражений )

           список-инициализаторов:
                 выражение-присваивания
                 список-инициализаторов , выражение-присваивания
                 { список-инициализаторов , opt }

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

           int f(int);
           int a = 2;
           int b = f(a);
           int c(b);

Указатель типа const T*, т.е. указатель на константу T, может инициализироваться указателем типа T*, но инициализация для указателей в обратном порядке незаконна. Объекты типа T можно инициализировать объектами типа T независимо от использования спецификаций const или volatile в типах инициализируемой переменной или инициализатора, например,

           int a;
           const int b = a;
           int c = b;

           const int* p0 = &a;
           const int* p1 = &b;
           int* p2 = &b;        // ошибка: указатель без const
                                // настраивается на объект const
           int *const p3 = p2;
           int *const p4 = p1;  // ошибка: указатель без const
                                // настраивается на объект const
           const int* p5 = p1;

Здесь причина обеих ошибок одна: если допустить подобную инициализацию, она позволит изменять с помощью указателя без соответствующей спецификации значение чего-то, что было описано как const.

На выражения для стандартных значений параметров накладывается больше ограничений, см. $$R.8.2.6.

Инициализация объектов классов с помощью конструкторов описывается в $$R.12.6.1. Копирование объектов классов описывается в $$R.12.8. Порядок инициализации статических объектов определяется в $$R.3.4 и $$R.6.7.

Гарантируется, что переменные статического класса памяти ($$R.3.5), которые не были инициализированы, в качестве начального значения получат 0, приведенный к нужному типу. То же справедливо для статических членов объектов класса. Начальные значения автоматических и регистровых переменных, которые не были инициализированы, неопределены.

Если инициализатор относится к указателю или объекту арифметического типа, он состоит из одного выражения (возможно в скобках). В качестве начального значения объекта берется значение выражения, происходят такие же преобразования типа, как и в случае присваивания.

Заметим, что поскольку () не является инициализатором, описание

           X a();

задает не объект a типа класс X, а является описанием функции без параметров, возвращающей X.

Инициализатор для статического члена принадлежит области видимости члена класса, например,

           int a;

           struct X {
              static int a;
              static int b;
           };

           int X::a = 1;
           int X::b = a;  // X::b = X::a

Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.