8.5.4. Определение члена пространства имен
8.5.4. Определение члена пространства имен
Мы видели, что определение члена пространства имен может появиться внутри определения самого пространства. Например, класс matrix и константа pi появляются внутри вложенного пространства имен MatrixLib, а определения функций operator+() и inverse() приводятся где-то в другом месте текста программы:
// ---- primer.h ----
namespace cplusplus_primer {
// первое вложенное пространство имен:
// матричная часть библиотеки
namespace MatrixLib {
class matrix { /* ... */ };
const double pi = 3.1416;
matrix operators+ ( const matrix ml, const matrix m2 );
void inverse( matrix );
// ...
}
}
Член пространства имен можно определить и вне соответствующего пространства. В таком случае имя члена должно быть квалифицировано именами пространств, к которым он принадлежит. Например, если определение функции operator+() помещено в глобальную область видимости, то оно должно выглядеть следующим образом:
// ---- primer.C ----
#include "primer.h"
// определение в глобальной области видимости
cplusplus_primer::MatrixLib::matrix
cplusplus_primer::MatrixLib::operator+
( const matrix ml, const matrix m2 )
{ /* ... */ }
Имя operator+() квалифицировано в данном случае именами пространств cplusplus_primer и MatrixLib. Однако обратите внимание на тип matrix в списке параметров operator+(): употреблено неквалифицированное имя. Как такое может быть?
В определении функции operator+() можно использовать неквалифицированные имена для членов своего пространства, поскольку определение принадлежит к его области видимости. При разрешении имен внутри функции operator+() используется MatrixLib. Заметим, однако, что в типе возвращаемого значения все же нужно указывать квалифицированное имя, поскольку он расположен вне области видимости, заданной определением функции:
cplusplus_primer::MatrixLib::operator+
В определении operator+() неквалифицированные имена могут встречаться в любом объявлении или выражении внутри списка параметров или тела функции. Например, локальное объявление внутри operator+() способно создать объект класса matrix:
// ---- primer.C ----
#include "primer.h"
cplusplus_primer::MatrixLib::matrix
cplusplus_primer::MatrixLib::operator+
( const matrix ml, const matrix m2 )
{
// объявление локальной переменной типа
// cplusplus_primer::MatrixLib::matrix
matrix res;
// вычислим сумму двух объектов matrix
return res;
}
Хотя члены могут быть определены вне своего пространства имен, такие определения допустимы не в любом месте. Их разрешается помещать только в пространства, объемлющие данное. Например, определение operator+() может появиться в глобальной области видимости, в пространстве имен cplusplus_primer и в пространстве MatrixLib. В последнем случае это выглядит так:
// ---- primer.C --
#include "primer.h"
namespace cplusplus_primer {
MatrixLib::matrix MatrixLib::operator+
( const matrix ml, const matrix m2 ) { /* ... */ }
}
Член может определяться вне своего пространства только при условии, что ранее он был объявлен внутри. Последнее приведенное определение operator+() было бы ошибочным, если бы ему не предшествовало объявление в файле primer.h:
namespace cplusplus_primer {
namespace MatrixLib {
class matrix { /*...*/ };
// следующее объявление не может быть пропущено
matrix operator+ ( const matrix ml, const matrix m2 );
// ...
}
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
1.4. Пространства имен
1.4. Пространства имен Если два неродственных процесса используют какой-либо вид IPC для обмена информацией, объект IPC должен иметь имя или идентификатор, чтобы один из процессов (называемый обычно сервером — server) мог создать этот объект, а другой процесс (обычно один или
Пространства имен и модули
Пространства имен и модули Системы имеют подсистемы, которые в свою очередь состоят из подсистем и так до бесконечности — именно поэтому мы всегда движемся сверху вниз. — Алан Перлис (Alan Perlis) Пространство имен — очень важный инструмент для управления именами и снижения
Вложенные пространства имен
Вложенные пространства имен Совершенствуя организацию своих типов, вы имеете возможность определить пространства имен в рамках других пространств имен. Библиотеки базовых классов .NET часто используют такие вложений, чтобы обеспечить более высокий уровень организации
Дополнительные пространства имен ADO.NET
Дополнительные пространства имен ADO.NET В дополнение к пространствам имен .NET, определяющим типы конкретного поставщика данных, библиотеки базовых классов предлагают ряд дополнительных пространств имен, связанных с ADO.NET (табл. 22.4).Следует понимать, что эта глава не
Пространства имен ASP.NET 2.0
Пространства имен ASP.NET 2.0 В библиотеках базовых классов .NET 2.0 предлагается не менее 34 пространств имен, имеющих отношение к Web. Всю эту совокупность пространств имен можно разбить на четыре главные группы.• Базовые функциональные возможности (типы, обеспечивающие
Пространства имен .NET для Web-сервисов XML
Пространства имен .NET для Web-сервисов XML Теперь, когда у вас есть база для понимания принципов функционирования Web-сервисов XML, мы с вами можем заняться построением такого объекта в рамках платформы .NET. Библиотеки базовых классов определяют целый ряд пространств имен,
Пространства имен
Пространства имен В программе на языке Си имена (идентификаторы) используются для ссылок на различного рода объекты — функции, переменные, формальные параметры и т. п. При соблюдении определенных правил, описанных в данном разделе, допускается использование одного и
2.7. Использование пространства имен
2.7. Использование пространства имен Предположим, что мы хотим предоставить в общее пользование наш класс Array, разработанный в предыдущих примерах. Однако не мы одни занимались этой проблемой; возможно, кем-то где-то, скажем, в одном из подразделений компании Intel был
8.5. Определения пространства имен А
8.5. Определения пространства имен А По умолчанию любой объект, функция, тип или шаблон, объявленный в глобальной области видимости, также называемой областью видимости глобального пространства имен, вводит глобальную сущность. Каждая такая сущность обязана иметь
8.5.1. Определения пространства имен
8.5.1. Определения пространства имен Определение пользовательского пространства имен начинается с ключевого слова namespace, за которым следует идентификатор. Он должен быть уникальным в той области видимости, в которой определяется данное пространство; наличие другой
8.5.3. Вложенные пространства имен
8.5.3. Вложенные пространства имен Мы уже упоминали, что пользовательские пространства имен могут быть вложенными. Такие пространства применяются для дальнейшего структурирования кода нашей библиотеки.// ---- primer.h ----namespace cplusplus_primer {// первое вложенное пространство имен://
8.5.5. ПОО и члены пространства имен
8.5.5. ПОО и члены пространства имен Как уже было сказано, определение пространства имен может состоять из разрозненных частей и размещаться в разных файлах. Следовательно, член пространства разрешено объявлять во многих файлах. Например:// primer.hnamespace cplusplus_primer {// ...void inverse(
8.5.6. Безымянные пространства имен
8.5.6. Безымянные пространства имен Может возникнуть необходимость определить объект, функцию, класс или любую другую сущность так, чтобы она была видимой только в небольшом участке программы. Это еще один способ решения проблемы засорения глобального пространства
8.6.1. Псевдонимы пространства имен
8.6.1. Псевдонимы пространства имен Псевдоним пространства имен используется для задания короткого синонима имени пространства. Например, длинное имяnamespace International_Business_Machines{ /* ... */ }может быть ассоциировано с более коротким синонимом:namespace IBM = International_Business_Machines;Объявление