
- •Лекция 3 Базовые и производные типы
- •Представление данных
- •Атрибуты данных
- •Типы данных
- •Базовые типы
- •Производные типы
- •Скалярные типы
- •Структурированные типы
- •Описание информационного объекта в программе Определение и объявление объекта
- •Примеры описаний программных объектов
- •Определение и инициализация переменных целых типов
- •Определение и инициализация переменных вещественных типов
- •Определение и инициализация переменных булевского типа
- •Определение и инициализация переменных символьного типа
- •Определение и инициализация переменных-указателей
- •Определение и инициализация переменных-ссылок
- •Форматы некоторых производных типов и их интерпретация
- •Класс памяти информационного объекта
- •Область действия идентификатора информационного объекта программы
- •Примеры использования переменных разных классов памяти
- •Пространство имен
- •Основные правила написания и оформления программ
Пространство имен
При написании больших и сложных программ (например, библиотек классов) возможен выбор программистом имен, которые на практике придут в противоречие с аналогичными именами, выбранными другими разработчиками классов в их библиотеках. Чтобы избежать этого используются длинные имена, что усложняет восприятие программы.
Можно ограничить область видимости элементов программы, объявив их, например, внутри файла со спецификатором static. Однако и это не всегда решает проблему. Сегодня существует как бы альтернатива использованию static для уменьшения зоны видимости глобальных переменных до размеров одного файла.
В С++ имеется возможность использовать пространство имен, рекомендуемое новым стандартом языка. Пространство имен – область программы, в которой распознается определенная совокупность имен, которые неизвестны за пределами этого пространства имен.
Ключевое слово namespace путем объявления именованных областей позволяет разделить глобальное пространство имен и определяет область видимости. Стандартная библиотека С++ объявляется теперь не в глобальном пространстве имен, как было раньше, а в собственном пространстве std.
Директива using namespace std; означает, что все определенные ниже в программе имена будут относиться к пространству имен с именем std.
Определение пространства имен:
namespace geo
{
int m = 10; //объявление глобальной переменной m в пространстве имен geo,
}
int geo:: n; //объявление глобальной переменной n также в пространстве имен geo,
Все, что определено внутри инструкции namespace (переменные, функции), находится внутри области видимости данного пространства имен, поэтому к идентификаторам, объявленным в этом пространстве имен, можно обращаться напрямую.
При обращении извне пространства имен к объектам, объявленным внутри этого пространства, следует указывать оператор расширения области видимости ::.
Чтобы упростить запись идентификаторов, используется инструкция using, имеющая две формы:
using namespace имя;
using имя::член;
При использовании первой формы инструкции using namespace имя; все члены, определенные в этом пространстве имен, становятся доступными в текущем пространстве и с ними можно работать напрямую, без указания имени пространства и оператора расширения области видимости. Пространство имен становится видимым от точки написания директивы. Область действия директивы можно сузить до блока, используя ее, например, в функции.
При использовании второй формы инструкции using имя::член; видимым делается только указанный член пространства имен.
Безымянное пространство имен позволяет создавать идентификаторы, являющиеся уникальными внутри некоторого файла (пространству имен присваивается имя файла). К членам этого пространства можно обращаться напрямую, без уточнений. Вне файла эти идентификаторы неизвестны.
//файл f13.cpp
#include <iostream.h>
namespace { //определение глобальной переменной m в безымянном пространстве имен,
int m = 10; } //т.е. переменная m доступна только в файле f13.cpp
double x = 100.56; //определение глобальной переменной в глобальном пространстве имен extern int func1 (); //объявление функции, определенной в файле f23.cpp
extern double func2 (); //объявление функции, определенной в файле f23.cpp
int main () {
cout << "main m=" << m << " " << func1() << endl; // 10 4
cout << x << " " << func2() << endl; // 100.56 102.56
return 0;
}
//файл f23.cpp
int m=2; //определение глобальной переменной m, доступной только в этом файле
extern double x; //объявление переменной, определенной в файле f13.cpp
int func1 () {return m * m; } //определение функции, m=2 из этого файла
double func2 () { return x + m; } //определение функции, m=2 из этого файла // х – из файла f13.cpp