Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Мета роботи. Получити навички у створенні «пространства имен»



Получити навички у створенні «пространства имен»

6.2 Вказівки щодо організації самостійної роботи студентів

Поименованные области служат для логического группирования объявлений и ограничения доступа к ним. Чем больше программа, тем более актуально использование поименованных областей. Простейшим примером применения является отделение кода, написанного одним человеком, от кода, написанного другим. При использовании единственной глобальной области видимости формировать программу из отдельных частей очень сложно из-за возможного совпадения и конфликта имен. Использование поименованных областей препятствует доступу к ненужным средствам.

Объявление поименованной области (ее также называют пространством имен) имеет формат:

namespace [ имя_области ]{ /* Обьявления */ }

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

Если имя области не задано, компилятор определяет его самостоятельно с помощью уникального идентификатора, различного для каждого модуля. Объявление объекта в неименованной области равнозначно его описанию как глобального с модификатором static. Помещать объявления в такую область полезно для того, чтобы сохранить локальность кода. Нельзя получить доступ из одного файла к элементу неименованной области другого файла.

Пример.

namespace demo{

int i = 1; int k = 0;

void fund (int);

void func2(int) { /*... */ }

}

namespace demo{ // Расширение

// int i = 2; Неверно - двойное определение

void funcl(double); // Перегрузка

void func2(int); // Верно (повторное объявление)

}

В объявлении поименованной области могут присутствовать как объявления, так и определения. Логично помещать в нее только объявления, а определять их позднее с помощью имени области и оператора доступа к области видимости::, например:

void demo::fund(int) { /*... */ }

Это применяется для разделения интерфейса и реализации. Таким способом нельзя объявить новый элемент пространства имен.

Объекты, объявленные внутри области, являются видимыми с момента объявления. К ним можно явно обращаться с помощью имени области и оператора доступа к области видимости::, например:

demo::i = 100; demo::func2(10);

Если имя часто используется вне своего пространства, можно объявить его доступным с помощью оператора using:

using demo::i: После этого можно использовать имя без явного указания области.

Если требуется сделать доступными все имена из какой-либо области, используется оператор using namespace:

using namespace demo:

Операторы using и using namespace можно использовать и внутри объявления поименованной области, чтобы сделать в ней доступными объявления из другой области:

namespace Department_of_Applied_Mathematics{ using demo::i; //... }

Имена, объявленные в поименованной области явно или с помощью оператора using, имеют приоритет по отношению к именам, объявленным с помощью оператора usi ng namespace (это имеет значение при включении нескольких поименованных областей, содержащих совпадающие имена).

Короткие имена пространств имен могут войти в конфликт друг с другом, а длинные непрактичны при написании реального кода, поэтому допускается вводить синонимы имен:

namespace DAM = Department_of_Applied_Mathematics;

Пространства имен стандартной библиотеки. Объекты стандартной библиотеки определены в пространстве имен std. Например, объявления стандартных средств ввода/вывода С в заголовочном файле <stdio.h> помещены в пространство имен следующим образом:

// stdio.h namespace std{

int feof(FILE *f);

}

using namespace std;

Это обеспечивает совместимость сверху вниз. Для тех, кто не желает присутствия неявно доступных имен, определен новый заголовочный файл <cstdio>:

// cstdio

namespace std{

int feof(FILE *f);

}

Если в программу включен файл <cstdio>, нужно указывать имя пространства имен явным образом:

std::feof(f);

Механизм пространств имен вместе с директивой finclude обеспечивают необходимую при написании больших программ гибкость путем сочетания логического группирования связанных величин и ограничения доступа.

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

// Пример передачи в функцию массива структур.

#include <iostream.h>

#include <conio.h>

#include <stdlib.h>

struct Tadres {

char strace[80];

int numDom;

int numKv;

};

struct TStudent{

char fio[80];

Tadres adres;

int pos;//номер в списке

};

void SetAdres(Tadres& adres)

{

cout<<"Vvedite name ulici"<<endl;

cin.getline(adres.strace,80);

cout<<"Vvedite nomer doma"<<endl;

char str[1000];

cin.getline(str,1000);

adres.numDom=atoi(str);

cout<<"Vvedite nomer kvartiri"<<endl;

cin.getline(str,1000);

adres.numKv=atoi(str);

};

void SetGrup(TStudent *Grup,int n)

{

for (int i(0);i<n;i++)

{

cout<<"Vvedite FIO "<<i<<" student:"<<endl;

cin.getline(Grup[i].fio,80);

SetAdres(Grup[i].adres);

Grup[i].pos=i;

}

};

void OutputStudent(TStudent *Grup,int n,int kol)

{ if(n>=kol)return;

cout<<"FIO: "<<Grup[n].fio<<endl;

cout<<"Adres: "<<Grup[n].adres.strace<<" "<<Grup[n].adres.numDom<<" "<<Grup[n].adres.numKv<<endl;

};

void main()

{

const int kolS=2;//количество студентов

char ch;

int num;

bool f;

TStudent IB[kolS];

SetGrup(IB,kolS);

do //печатать информацию о студенте по номеру

{

cout<<"Vvedite num studenta"<<endl;

cin>>num;

OutputStudent(IB,num,kolS); //поиск студента

cout<<"Zakonchit' Y/N"<<endl;

ch=getch();

}

while((ch!='y')&&(ch!='Y')&&(ch!='н')&&(ch!='Н'));

}





Дата публикования: 2015-04-07; Прочитано: 347 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...