Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 43 44 45 [ 46 ] 47 48 49 ... 210


По этим причинам рекомендуется описывать поля как unsigned. К полям не может применяться операция получения адреса &, поэтому нет указателей на поля. Поля не могут быть членами объединения.

Вложенные классы

Класс может быть описан внутри другого класса. В этом случае область видимости имен внутреннего класса его и общих имен ограничивается охватывающим классом. За исключением этого ограничения допустимо, чтобы внутренний класс уже был описан вне охватывающего класса.

Описание одного класса внутри другого не влияет на правила доступа к закрытым членам и не помещает функции члены внутреннего класса в область видимости охватывающего класса.

Например:

int x;

class enclose /* охватывающий */

int x; class inner

int y;

f () { x=1 }

g (inner*);

int inner; /* вложенный */ enclose.g (inner* p) { ... }

В этом примере x в f сс1ается на x, описанный перед классом enclose. Поскольку y является закрытым членом inner, g не может его использовать. Поскольку g является членом enclose, имена, использованные в g, считаются находящимися в области видимости класса enclose.

Поэтому inner в описании параметров g относится к охваченному типу inner, а не к int.



Инициализация

Описание может задавать начальное значение описываемого идентификатора. Инициализатору предшествует =, и он состоит из выражения или списка значений, заключенного в фигурные скобки.

Синтаксис:

= expression

= { список инициализаторов }

= { список инициализаторов ,}

( список выражений )

список инициализаторов:

выражение список инициализаторов,

список инициализаторов

{ список инициализаторов }

Все выражения в инициализаторе статической или внешней переменной должны быть константными выражениями или выражениями, которые сводятся к адресам ранее описанных переменных, возможно со смещением на константное выражение.

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

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

Начальное значение объекта находится из выражения; выполняются те же преобразования, что и при присваивании.

Заметьте, что поскольку () не является инициализатором, то X a(); является не описанием объекта класса X, а описанием функции, не получающей значений и возвращающей X.

Список инициализаторов

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



инициализаторов для членов составного объекта, в порядке возрастания индекса или по порядку членов.

Если массив содержит составные подобъекты, то это правило рекурсивно применяется к членам составного подобъекта. Если инициализаторов в списке меньше, чем членов в составном подобъекте, то составной подобъект дополняется нулями.

Фигурные скобки могут опускаться следующим образом. Если инициализатор начинается с левой фигурной скобки, то следующий за ней список инициализаторов инициализирует члены составного объекта; наличие числа инициализаторов, большего, чем число членов, считается ошибочным.

Если, однако, инициализатор не начинается с левой фигурной скобки, то из списка берутся только элементы, достаточные для сопоставления членам составного объекта, частью которого является текущий составной объект.

Например,

int x[] = { 1, 3, 5 }; описывает и инициализирует x как одномерный массив, имеющий три члена, поскольку размер не был указан и дано три инициализатора.

float y[4][3] = {

{ 1, 3, 5 }, { 2, 4, 6 },

{ 3, 5, 7 } };

является полностью снабженной квадратными скобками инициализацией: 1,3 и 5 инициализируют первый ряд массива y[0], а именно, y[0][2].

Аналогично, следующие две строки инициализируют y[1] и y[2]. Инициализатор заканчивается раньше, поэтому y[3] инициализируется значением 0. В точности тот же эффект может быть достигнут с помощью

float y[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 }; Инициализатор для y начинается с левой фигурной скобки, но не начинается с нее инициализатор для y[0], поэтому



1 ... 43 44 45 [ 46 ] 47 48 49 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика