УДК 004.424

О ПРОСТРАНСТВЕ ИМЕН В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ С++ ДЛЯ УЧАЩИХСЯ

Дмитриев Владислав Леонидович1, Батыршин Артем Ильдарович1
1Стерлитамакский филиал Башкирского государственного университета

Аннотация
В работе кратко рассматривается сущность механизма пространства имен, введенная в языке программирования C++ с целью решения проблемы совпадения имен (избежания конфликтов имен), которая может возникнуть, если при написании программы использованы несколько библиотек. Стиль изложения материала подобран таким образом, чтобы он был понятен учащимся школ, которые только начинают изучение языка программирования C++. Приведены практические примеры, поясняющие теоретический материал.

Ключевые слова: пространство имен, среды разработки, язык программирования


ABOUT THE NAMESPACE IN THE C++ PROGRAMMING LANGUAGE FOR STUDENTS

Dmitriev Vladislav Leonidovich1, Batirshin Artem Ildarovich1
1Sterlitamak branch of the Bashkir state University

Abstract
In the work briefly discusses the essence of the mechanism of namespaces, introduced in the C++ programming language to solve problems with the same name (avoiding name conflicts) that may occur, when for writing the program used several libraries. The style of presentation of the material is selected in such a way that it was clear to pupils that are just starting learning C++ programming language. Provides practical examples to explain theoretical material.

Keywords: of the development environment, the namespace, the programming language


Рубрика: Педагогика

Библиографическая ссылка на статью:
Дмитриев В.Л., Батыршин А.И. О пространстве имен в языке программирования С++ для учащихся // Психология, социология и педагогика. 2016. № 12 [Электронный ресурс]. URL: http://psychology.snauka.ru/2016/12/7503 (дата обращения: 27.05.2017).

Область применения языка программирования C++ в настоящее время весьма обширна, и включает создание операционных систем, разработку прикладных программ, написание драйверов устройств, разнообразных игровых приложений, и т.д. Поэтому можно сказать, что этот язык программирования является одним из самых популярных.

Тем не менее во многих школах не спешат переходить к изучению языка программирования С++, а используют язык программирования Pascal. Отчасти это связано с тем, что многие школьные учителя в свое время изучали именно Pascal. С другой стороны, этот язык программирования очень удобен в плане первоначального знакомства с языками программирования, ведь он создавался изначально именно в учебных целях [1, 4, 5]. В дальнейшем приобретенные знания позволяют приступить к изучению визуальных языков программирования, например, таких, как Delphi [2, 3, 6].

Однако для повышения востребованности современного выпускника очень важно знать язык программирования C++ и уметь работать в современных средствах разработки приложений.

В настоящее время для сред разработки на базе языка программирования C++ имеется огромное множество различных библиотек, одновременное использование которых в программе может привести к проблеме совпадения имен, заключающейся в использовании различными поставщиками библиотек одинаковых имен функций или переменных. Для решения такой проблемы в языке программирования C++ введен механизм пространства имен, суть которого кратко рассмотрен ниже.

Пространство имен (namespace) является механизмом отражения логического группирования, это некоторая объявляемая с помощью специальной конструкции область, служащая для ограничения области действия имен переменных и других объектов с целью исключения проблем, связанных с возможным использованием одинаковых имен. Так, в языке С++ имена могут быть присвоены переменным, функциям, классам, и т.д. По мере усложнения программного проекта или при использовании библиотек классов из нескольких источников могут возникнуть проблемы, связанные с конфликтом имен – конфликты пространства имен.

При использовании пространства имен, кроме необязательного глобального пространства имен (соответствует области объявления на уровне файла), выделяют несколько частных пространств. В разных частных пространствах могут быть использованы одинаковые имена переменных, функций, классов и других объектов – все они будут действовать в пределах своего частного пространства имен.

Пространство имен задается с использованием ключевого слова namespace следующим образом:

namespace имя { // объявления }

В результате такого определения пространства имен все имена, входящие в данное пространство имен, будут видимы только внутри этого пространства. Пространства имен могут находиться на глобальном уровне, или внутри других пространств имен, однако они не могут быть помещены в блок. Таким образом, имя, объявленное в пространстве имен, обладает по умолчанию внешним связыванием (при условии, что оно не ссылается на константу).

Приведем пример определения и использования пространства имен.

#include “stdafx.h”

#include <iostream>

using namespace std;

namespace solution

{ const double PI = 3.14159265358;

double area(double);

double sum(double, double);

void swap(int &, int &); }

double solution::area(double x)

{ return PI*x*x; }

double solution::sum(double x, double y)

{ return x+y; }

void solution::swap(int &x, int &y)

{ int z = x; x = y; y = z;}

int main()

{ setlocale(LC_ALL,”rus”);

cout<<”Число ПИ: “<<solution::PI<<endl;

cout<<”10+12.4= “<<solution::sum(10,12.4)<<endl;

int a = 10, b = 30;

cout<<”nПеременные до изменения:n”;

cout<<”a= “<<a<<”, b= “<<b<<endl;

solution::swap(a,b);

cout<<”nПеременные после изменения:n”;

cout<<”a= “<<a<<”, b= “<<b<<endl;

system(“pause”); return 0;}

В данном примере определено пространство имен solution, содержащее одну константу и три функции. При этом сами внутри пространства имен описаны только прототипы функций, а сами функции описаны ниже (раздельное описание интерфейса и реализации). Можно, конечно, реализацию функций также описать внутри пространства имен solution, однако во многих случаях это неудобно.

Для доступа к именам пространства имен solution используется операция разрешения области видимости (::), которая позволяет уточнить имя, указав его вместе с пространством имен. Например:

solution::swap(a,b);

Пространства имен открыты. Это означает, что можно включать новые имена в соответствующие пространства имен:

namespace solution

{ int max (int, int);}

Код функции max() можно поместить далее в этом же (или другом) файле, воспользовавшись пространством имен solution:

namespace solution

{ int max (int x, int y)

{ if (x>y) return x; else return y;} }

Открытость пространства имен позволяет реализовывать различные интерфейсы для различных категорий пользователей, открывая для них только необходимые фрагменты пространства имен.

Необходимость уточнять имена при частом их использовании достаточно неудобно. Поэтому, если необходимо часто применять операцию разрешения области видимости, целесообразно использовать объявление using, которое позволяет получить доступ к конкретному имени в пространстве имен; директива using открывает доступ ко всем именам в каком-либо пространстве имен.

Для получения доступа к отдельному имени в пространстве имен используется следующий формат объявления using:

using имя_пространства_имен
:: имя;

Например, чтобы обеспечить доступ к функции sum() пространства имен solution из функции main() приведенной выше программы, достаточно написать:

using solution::sum;

После этого в программе выше вместо записи

solution::sum(10,12.4);

можно будет везде, где необходимо, использовать запись

sum(10,12.4);

Как было сказано выше, директива using делает доступными все имена. Директива using создается путем включения ключевых слов using namespace перед идентификатором пространства имен:

using namespace solution;

После этого все имена данного пространства имен становятся доступными без необходимости использования операции разрешения области видимости. Если данная директива размещена на глобальном уровне (до функции main()), имена пространства имен становятся глобально доступными. Если поместить директиву using в отдельную функцию, имена будут доступны только в этой функции.

Следует помнить, что применение директивы using и множества объявлений using
не равнозначно. Так, если некоторое имя уже объявлено в некоторой функции (в общем случае – в функции main()), то нельзя импортировать то же самое имя с помощью объявления using. Однако в случае использования директивы using имеет место разрешение имен.

В примере ниже рассматривается ситуация, когда директива using импортирует имя, уже объявленное в программе. В таком случае локальное имя будет перекрывать имя из пространства имен, также, как оно перекрывало бы глобальную переменную с тем же именем. Для доступа к нужному имени можно использовать операцию разрешения области видимости.

#include “stdafx.h”

#include <iostream>

using namespace std;

namespace solution

{ const double PI = 3.14159265358;

double area(double); }

double solution::area(double x)

{ return PI*x*x; }

const double PI = 1.38; // глобальная константа

int main()

{ setlocale(LC_ALL,”rus”);

using namespace solution;

const double PI = 2.17; // локальная константа

cout<<PI<<endl; // 2.17

cout<<::PI<<endl; // 1.38

cout<<solution::PI<<endl; // 3.14159

system(“pause”); return 0;}

Как было отмечено выше, объявления пространств имен могут быть вложенными:

namespace space_1

{ namespace space_2

{ int a;

… ; }

double b; }

В рассматриваемом случае ссылка на переменную a аналогична записи space_1::space_2::a. Также, с помощью директивы using можно сделать доступными внутренние имена:

using namespace space_1::space_2;

Директивами и объявлениями using можно пользоваться также и внутри пространств имен.

Для пространств имен можно создать псевдоним. Это может оказаться оправданным, если имя пространства имен достаточно велико (состоит из большого числа символов). Так, для рассмотренного выше пространства имен solution можно сделать псевдоним sol:

namespace sol = solution;


Библиографический список
  1. Дмитриев В.Л., Ахмадеева Р.З. Развитие конструктивного мышления при изучении программирования // Информатика и образование. 2009. № 2. – С. 69-73.
  2. Дмитриев В.Л. Тестирование в игровой форме как способ проверки усвоения учебного материала // Информатика в школе. 2012. №10 (83). – С. 41-43.
  3. Дмитриев В.Л. Компьютерная программа для проведения тестирования с поддержкой произвольного расположения материалов теста // Информатика и образование. 2014. №2 (251). – С. 74-77.
  4. Дмитриев В.Л. Поэтапная разработка программы в среде Turbo Pascal на примере поиска пути с использованием волнового алгоритма // Информатика и образование. 2013. № 8. – С. 29-33.
  5. Дмитриев В.Л. Развитие представлений об объектном программировании на примере разработки объектов в среде программирования Turbo Pascal // Информатика в школе. 2014. № 2. – С. 54-59.
  6. Дмитриев В.Л. Опыт отбора задач для активизации интереса школьников к изучению программирования // Информатика в школе. № 4. 2015. – С.  26-33.


Все статьи автора «Дмитриев Владислав Леонидович»


© Если вы обнаружили нарушение авторских или смежных прав, пожалуйста, незамедлительно сообщите нам об этом по электронной почте или через форму обратной связи.

Связь с автором (комментарии/рецензии к статье)

Оставить комментарий

Вы должны авторизоваться, чтобы оставить комментарий.

Если Вы еще не зарегистрированы на сайте, то Вам необходимо зарегистрироваться: