Справочное руководство по C++
Шрифт:
Здесь a и p используются как обычные переменные (не члены), но поскольку они входят в одно объединение, их адреса совпадают.
Глобальные безымянные объединения можно описать со спецификацией static. Безымянные объединения не должны содержать частных или защищенных членов (§R.11), а также функций-членов.
Если описаны объекты объединения или указатели на него, то оно не считается безымянным, например,
Здесь присваивание простому имени aa незаконно, т.к. имя члена не привязано ни к какому объекту.
Инициализация объединений, не имеющих конструкторов, описывается в §R.8.4.1.
R.9.6 Битовые поля
Конструкция описатель-члена, имеющая вид,
задает битовое поле, длина которого отделяется от его имени двоеточием. Размещение битовых полей в объекте класса зависит от реализации. Поля упаковываются в некоторые адресуемые элементы памяти. На одних машинах поля могут выходить за границы этих элементов, на других - нет. Выравнивание битовых полей тоже определяется реализацией. На одних машинах значения помещаются в битовые поля справа налево, на других - слева направо.
Чтобы установить заданное расположение полей с помощью дополнения нулями, используют безымянные битовые поля. Особый случай, когда используется безымянное поле нулевой длины. Оно задает выравнивание следующего битового поля по границе элемента памяти, используемого при размещении полей.
Безымянное поле не является членом и не может инициализироваться.
Битовые поля должны иметь целочисленный тип (§R.3.6.1). Их интерпретация зависит от того, считается ли значение поля с обычным типом int (т.е. без явного использования signed или unsigned) знаковым или беззнаковым. Операция взятия адреса & не применима к битовым полям, так что не может быть ни указателей на битовые поля, ни ссылок на них.
R.9.7 Вложенные описания классов
Класс можно описать в описании другого класса. Такой класс называют вложенным. Имя вложенного класса локально по отношению к объемлющему классу. Вложенный класс находится в области видимости объемлющего класса. Если не считать явного использования указателей, ссылок или имен объектов, то в описаниях вложенного класса допустимы только имена типов, статических членов и элементов перечисления из объемлющего класса.
Функции-члены вложенного класса не имеют особых прав доступа к членам объемлющего класса, они подчиняются обычным правилам доступа (§R.11). Аналогично, функции-члены объемлющего класса не имеют особых прав доступа к членам вложенного класса и подчиняются обычным правилам доступа, например:
Функции-члены и представляющие данные, статические члены из вложенного
класса можно определить в глобальной области видимости, например:
Подобно функции-члену дружественная функция, определенная в данном классе, находится в области видимости этого класса. Она подчиняется тем же правилам связывания имен, что и функции-члены (они указаны выше и в §R.10.4), и не имеет так же как они особых прав доступа к членам объемлющего класса и к локальным переменным функций этого класса (§R.11).
R.9.8 Описания локальных классов
Класс можно описать в определении функции, такой класс называется локальным. Имя локального класса считается локальным в объемлющей области видимости, а областью видимости локального класса является объемлющая область видимости. В описаниях локального класса из объемлющей области видимости можно использовать только имена типов, статических переменных, внешних переменных и функций, а также элементы перечисления. Приведем пример:
Объемлющая функция не имеет особых прав доступа к членам локального класса, она подчиняется обычным правилам доступа (§R.11). Функцию-член локального класса следует определять в определении этого класса. Локальный класс не может иметь статических членов, представляющих данные.