Пространство имен позволяет именовать группу переменных и методов.
Создание пространства имен указывается ключевым словом namespace.
Пример:
namespace S // Пространство имен S{ int i; }void main(){ S::i++; // Обращение к переменной // i из пространства имен S}
В языке C++ объявляемые пространства имен могут быть иерархически вложены друг в друга.
Например:
namespace Outer { int iOuter1= 111; int func(int j); namespace Inner { int iInner1 = 222; }}
Для традиционных приложений можно использовать стандартную библиотеку C++, которая определяет дополнительный набор типов. Пространство имен стандартной библиотеки обозначается идентификатором std.
Для того чтобы иметь возможность обращаться к переменным или методам из пространства имен, можно использовать один из следующих способов:
· имя соответствующей переменной или метода должно быть квалифицировано названием пространства имен (пространство имен указывается перед именем через два символа двоеточия). Например:
std::string s="Это строка";
· имя библиотеки должно быть установлено как доступное оператором using. Например:
· using namespace std; // ... · string s1="Строка s1";
Оператор using можно указывать как до метода main, так и внутри метода main (в этом случае переменные и методы пространства имен будут доступны без квалификации их имени сразу после выполнения оператора using).
Для управляемых расширений используются библиотеки среды NET Framework, реализованные как пространства имен. Пространство имен System предоставляет большой набор типов, реализованных как классы или структуры.
Лекция #8: Производные типы данных языка С++. Структуры, объединения и перечисления Рассматривается синтаксис и семантика объявления структуры, выделение памяти под структуру, доступ к элементам структуры, передача структур в качестве параметров. Приводится определение объединений и описывается размещение их в памяти. Рассматривается работа с перечислимыми типами.
Структуры
Объявление структуры
Структуры языка C++ представляют поименованную совокупность компонентов, называемых полями, или элементами структуры. Элементом структуры может быть:
переменная любого допустимого типа;
битовое поле;
функция.
Объявление структуры имеет следующее формальное описание:
struct [имя_структуры] { тип_элемента_структуры имя_ элемента1; тип_элемента_структуры имя_ элемента2; ... тип_элемента_структуры имя_ элементаN;} [список_объявляемых_переменных]; Объявление структуры с битовыми полями имеет следующее формальное описание:
struct [имя_структуры] { тип_элемента_структуры [имя_ элемента1] : число_бит; тип_элемента_структуры [имя_ элемента2] : число_бит; ... тип_элемента_структуры [имя_ элементаN] : число_бит;} [список_объявляемых_переменных]; Возможно неполное объявление структуры, имеющее следующее формальное описание:
struct имя_структуры; При отсутствии имени объявляемой структуры создается анонимная структура. При создании анонимной структуры обычно указывается список объявляемых переменных.
Список объявляемых переменных типа данной структуры может содержать:
имена переменных;
имена массивов;
указатели.
Например: struct sA {char a[2], int i;} struA, struB[10], *struC;
Для использования указателя на структуру ему необходимо присвоить адрес переменной типа структуры.
Размер структуры с битовыми полями всегда кратен байту. Битовые поля можно определять для целочисленных переменных типа int, unsigned int, char и unsigned char. Одна структура одновременно может содержать и переменные, и битовые поля. Если для битового поля не задано имя элемента, то доступ к такому полю не разрешен, но количество указанных бит в структуре размещается.
Типом элемента структуры может быть:
другой структурный тип (допускаются вложенные структуры);
указатель на данный структурный тип;
неполно объявленный структурный тип;
любой другой базовый или производный тип, не ссылающийся рекурсивно на объявляемый структурный тип.
Например:
struct sA {char a[2], sA* this_struct;}; // Корректное объявление структуры struct sB; // Неполное объявление структурыstruct sA {char a[2], sB sb*_struct;}; // Корректное объявление структурыstruct sA {char a[2], sA this_struct;}; // Ошибочное объявление Структура не может содержать в качестве вложенной структуры саму себя, но она может содержать элемент, являющийся указателем на объявляемую структуру.
Например:
struct structA { struct structA *pA; int iA; } sA; // pA указатель на структуру При одновременном объявлении структурного типа, объявлении переменной данного типа и ее инициализации список значений указывается в фигурных скобках в последовательности, соответствующей последовательности определения элементов структуры.
Например:
struct POINT // Объявление структурного // типа POINT { int x; // Объявление элементов x и y int y;} p_screen = { 50, 100 }; // Эквивалентно записи p_screen.x = 50; // и p_screen.y = 100; Выделение памяти
При создании переменной типа структуры:
память под все элементы структуры выделяется последовательно для каждого элемента;
для битовых полей память выделяется, начиная с младших разрядов;
память, выделяемая под битовые поля, кратна байту;
общая выделяемая память может быть больше, чем сумма размеров полей структуры.
Рассмотрим пример выделения памяти под структуру
struct structA { char cA; char sA[2]; float fA;}; При создании переменной структурного типа:
structA s1; будет выделено 7 байтов. Элементы структуры будут размещены в памяти в следующем порядке:
char cA
char sA[2]
float fA
Рассмотрим пример выделения памяти под структуру
struct structB { int i1:2; int i2:3; int :6; unsigned int i3:4;};
При создании переменной структурного типа:
structB s2;
будет выделено 2 байта. Элементы структуры будут размещены в памяти в следующем порядке:
Рис. 8.1.
Для целочисленных значений, предусматривающих наличие знакового разряда (например, int), старший левый бит из общего числа битов, выделяемых под данное битовое поле, интерпретируется как знак. Например, битовое значение 11 для поля i1 будет восприниматься как -1, а значение 11 для поля i3 - как 3.