|
Программирование >> Инициализация объектов класса, структура
namespace cplusplus primer { class matrix { /* ... */ }; const double pi = 3.1416; namespace cplusplus primer { void inverse ( matrix & ); matrix operator+ ( const matrix &ml, const matrix &m2 ) {/* ... */ } Два приведенных примера эквивалентны: оба задают пространство имен cplusplus primer, содержащее класс matrix, функцию inverse() , константу pi и operator+() . Определение пространства имен может состоять из нескольких соединенных частей. Последовательность namespace namespace name { задает новое пространство, если имя namespace name не совпадает с одним из ранее объявленных. В противном случае новые объявления добавляются в старое пространство. Возможность разбить пространство имен на несколько частей помогает при организации библиотеки. Ее исходный код легко разделить на интерфейсную часть и реализацию. Эта часть пространства имен определяет интерфейс биботеки namespace c cplusplus primer /* ... */ }; class matrix const double pi = 3.1416; matrix operator+ ( const matrix &ml, void inverse ( matrix & ); const matrix &m2 ); Эта часть пространства имен определяет реализацию библиотеки namespace cplusplus primer { void inverse ( matrix &m ) { /* ... */ } matrix operator+ ( const matrix &ml, const matrix &m2 ) { /* ... */ } Например: Первая часть пространства имен содержит объявления и определения, служащие интерфейсом библиотеки: определения типов, констант, объявления функций. Во второй части находятся детали реализации, то есть определения функций. Еще более полезной для организации исходного кода библиотеки является возможность разделить определение одного пространства имен на несколько файлов: эти определения также объединяются. Наша библиотека может быть устроена следующим образом: ---- primer.h ----namespace cplusplus primer class matrix { /*... */ const double pi = 3.141 matrix &m1, const matrix &m2 ); matrix operator+ ( const void inverse( matrix & ) ----primer.C---- #include primer.h namespace cplusplus primer { void inverse( matrix &m ) { /* ... */ } matrix operator+ ( const matrix &m1, const matrix &m2 ) { /* ... */ } ---- user.C определение интерфейса биботеки #include primer.h void func( cplusplus primer::matrix &m ) ... cplusplus primer: :inverse( m ); return m; Программа, использующая эту библиотеку, выглядит так: Подобная организация программы обеспечивает модульность библиотеки, необходимую для сокрытия реализации от пользователей, в то же время позволяя без ошибок скомпилировать и связать файлы primer.C и user.C в одну программу. 8.5.2. Оператор разрешения области видимости Имя члена пользовательского пространства дополняется поставленным спереди именем этого пространства и оператором разрешения области видимости (). Использование неквалифицированного члена, например matrix, является ошибкой. Компилятор не определение интерфейса библиотеки #include primer.h ошибка: нет объявления для matrix знает, к какому объявлению относится это имя: void func( matrix &m ); Объявление члена пространства имен скрыто в своем пространстве. Если мы не укажем компилятору, где именно искать объявление, он произведет поиск только в текущей области видимости и в областях, включающих текущую. Допустим, если переписать предыдущую программу так: определение интерфейса библиотеки #include primer.h class matrix { /* пользовательское определение */ }; правильно: глобальн тип matrix найден void func( matrix &m ); то определение класса matrix компилятор находит в глобальной области видимости и программа компилируется без ошибок. Поскольку объявление matrix как члена пространства имен cplusplus primer скрыто в этом пространстве, оно не конфликтует с классом, объявленным в глобальной области видимости. Именно поэтому мы говорим, что пространства имен решают проблему засорения глобального пространства: имена их членов невидимы, если имя пространства не указано явно, с помощью оператора разрешения области видимости. Существуют и другие механизмы, позволяющие сделать объявление члена пространства имен видимым вне его. Это using-объявления и using-директивы. Мы рассмотрим их в следующем разделе. Отметим, что оператор области видимости может быть использован и для того, чтобы сослаться на элемент глобального пространства имен. Поскольку это пространство не имеет имени, запись : :member name относится к его элементу. Такой способ полезен для указания членов глобального пространства, если их имена оказываются скрыты именами, объявленными во вложенных локальных областях видимости. Следующий пример демонстрирует использование оператора области видимости для обращения к скрытому члену глобального пространства имен. Функция вычисляет последовательность чисел Фибоначчи. В программе два определения неременной miax. Глобальная неременная указывает максимальное значение элемента последовательности, при превышении которого вычисление прекращается, а локальная - желаемую длину последовательности при данном вызове функции. (Напоминаем, что параметры функции относятся к ее локальной области видимости.) Внутри функции должны быть доступны обе переменных. Однако неквалифицированное имя max ссылается на локальное объявление этой неременной. Чтобы получить глобальную неременную, нужно использовать оператор разрешения области видимости ::max. Вот текст программы:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |