Namespace açar sözü nə üçün istifadə olunur. Siniflər və ad boşluqları. Ad məkanı bəyannamələri




Siniflər və Ad boşluqları

.NET Framework sinifləri

Bəlkə də idarə olunan kodu yazmağın ən böyük faydası - ən azı bir tərtibatçının nöqteyi-nəzərindən - istifadə edə bilməyinizdir. .NET baza sinif kitabxanası .

.NET baza sinifləri, Windows API-dən istifadə edərək əvvəllər yerinə yetirilə bilən demək olar ki, istənilən işi yerinə yetirməyə imkan verən idarə olunan kod siniflərinin böyük kolleksiyasını təmsil edir. Bu siniflərin hamısı tək mirasla eyni IL obyekt modelini izləyir. Bu o deməkdir ki, siz ya hər hansı .NET baza siniflərinin obyektlərini yarada, ya da onlardan öz siniflərinizi miras ala bilərsiniz.

.NET baza siniflərini fərqli edən onların intuitiv və istifadəsi asan olması üçün nəzərdə tutulmasıdır. Məsələn, mövzuya başlamaq üçün sinfin Start() metodunu çağırmaq lazımdır Mövzu. TextBox obyektini əlçatmaz etmək üçün obyektin Enabled xüsusiyyəti false olaraq təyin edilir. Kitabxanalarından istifadə etmək asan olan Visual Basic və Java tərtibatçılarına tanış olan bu yanaşma GetDIBits(), RegisterWndClassEx() və IsEqualIID() kimi API funksiyaları ilə illər boyu mübarizə aparan C++ tərtibatçıları üçün böyük bir rahatlama olacaq. eləcə də pəncərə tutacaqlarının ötürülməsini tələb edən bir çox funksiyalar.

Bununla belə, C++ tərtibatçılarının Windows API-lərinin tam dəstinə həmişə asan çıxışı olub, Visual Basic 6 və Java tərtibatçıları isə öz dillərindən əldə etdikləri əsas əməliyyat sistemi funksionallığından istifadə etməkdə məhdud olublar. .NET baza siniflərinə gəldikdə, onlar Visual Basic və Java kitabxanalarından istifadənin asanlığını Windows API funksiyalar dəstinin nisbətən tam əhatəsi ilə birləşdirir. Bir çox Windows xüsusiyyətləri baza sinifləri vasitəsilə mövcud deyil, bu halda siz API funksiyalarından istifadə etməlisiniz, lakin ümumilikdə bu, yalnız daha ekzotik funksiyalara aiddir. Gündəlik istifadə üçün bir sıra əsas siniflər ümumiyyətlə kifayət edəcəkdir. Ancaq bir API funksiyasına zəng etmək lazımdırsa, bunun üçün .NET sözdə təmin edir platforma zəng mexanizmi (platforma çağırış), bu, düzgün məlumat növünün çevrilməsinə zəmanət verir, ona görə də kodun C#, C++ və ya Visual Basic 2010-da yazılmasından asılı olmayaraq, indi bu vəzifə bu funksiyaları birbaşa C++ kodundan çağırmaqdan çətin deyil.

Ad boşluqları

Ad boşluqları (ad sahəsi).NET siniflər arasında konfliktlərin adlandırılmasının qarşısını alan bir üsuldur. Onlar müştərini təmsil edən bir sinif müəyyən etdiyiniz, onu Müştəri adlandırdığınız və sonra başqasının eyni şeyi etdiyi vəziyyətlərdən qaçmaq üçün nəzərdə tutulmuşdur (bu ssenari olduqca yaygındır).

Ad sahəsi məlumat növləri qrupundan başqa bir şey deyil, lakin ad məkanındakı bütün məlumat növlərinin adlarının avtomatik olaraq ad sahəsinin adı ilə prefiks edilməsi təsiri ilə. Ad boşluqları bir-birinə daxil edilə bilər. Məsələn, əksər ümumi təyinatlı .NET baza sinifləri adlar sahəsindədir Sistem. əsas sinif massiv bu məkana aiddir, ona görə də tam adıdır System.Array.

.NET platforması bütün adların ad məkanında elan edilməsini tələb edir; məsələn, sinifinizi qoya bilərsiniz Mənim sinfim ad sahəsinə MyCompany. Sonra bu sinfin tam adı belə görünəcək MyCompany.MyClass.

Qeyd edək ki, əgər ad sahəsi açıq şəkildə göstərilməyibsə, növ adsız qlobal ad sahəsinə əlavə olunacaq.

Əksər hallarda Microsoft ən azı iki iç-içə ad boşluğundan istifadə etməyi tövsiyə edir: birincisi şirkətinizin adıdır, ikincisi isə sinfin aid olduğu texnologiya və ya proqram paketinin adıdır ki, belə görünür: MyCompany. SomeNamespace.MyClass. Əksər hallarda bu yanaşma tətbiq siniflərinizi digər şirkətlərin tərtibatçıları tərəfindən yazılan sinif adları ilə mümkün ziddiyyətlərdən qoruyacaqdır.

Aşağıdakı cədvəl funksionallıq əsasında qruplaşdırılmış .NET-də təklif olunan ad boşluqlarının bəzilərinin (lakin əlbəttə ki, hamısının deyil) qısa siyahısıdır:

.NET Framework açar ad boşluqları
.NET-də ad sahəsi Təsvir
Sistem Ad sahəsinin içərisində Sistem daxili məlumatlar, riyazi hesablamalar, təsadüfi ədədlərin yaradılması, ətraf mühit dəyişənləri və zibillərin toplanması ilə məşğul olmaq üçün bir çox faydalı növləri, həmçinin bir sıra ən çox istifadə edilən istisnalar və atributları ehtiva edir.
Sistem.Kolleksiyalar
Sistem.Kolleksiyalar.Ümumi
Bu ad boşluqlarında bir sıra konteyner növləri, həmçinin xüsusi kolleksiyalar yaratmağa imkan verən bir neçə əsas tip və interfeyslər var.
Sistem.Data
System.Data.Common
System.Data.EntityClient
System.Data.SqlClient
Bu ad boşluqları ADO.NET istifadə edərək verilənlər bazası ilə qarşılıqlı əlaqə yaratmaq üçün istifadə olunur
System.IO
System.IO.Compression
System.IO.Ports
Bu boşluqlar fayl giriş/çıxışı, verilənlərin sıxılması və port manipulyasiyası üçün bir çox növdən ibarətdir.
Sistem.Refeksiya
Sistem.Reflection.Emit
Bu ad boşluqları dinamik tip yaratma ilə yanaşı, iş vaxtı növünün kəşfini dəstəkləyən növləri ehtiva edir.
System.Runtime.InteropServices Bu ad məkanı .NET növlərinin "idarə olunmayan kod" (məsələn, C-əsaslı DLL-lər və COM serverləri) ilə və əksinə qarşılıqlı əlaqədə olmasına icazə verə biləcəyiniz vasitələri ehtiva edir.
Sistem.Rəsm
Sistem.Windows.Formalar
Bu ad boşluqları yerli .NET (Windows Forms) qrafik alətlər dəstindən istifadə edərək iş masası proqramları yaratmaq üçün istifadə olunan növləri ehtiva edir.
Sistem.Windows
System.Windows.Controls
Sistem.Windows.Formalar
Kosmos Sistem.Windows Windows Presentation Foundation (WPF) qrafik alətləri dəsti olan bu bir neçə ad sahəsinin köküdür.
System.Linq
System.Xml.Linq
System.Data.DataSetExtensions
Bu ad boşluqları LINQ API-dən istifadə edərək proqramlaşdırma zamanı istifadə olunan növləri ehtiva edir.
System.Web Bu ad sahəsi sizə ASP.NET veb proqramları yaratmağa imkan verən bir çox yerlərdən biridir.
System.ServiceModel Bu ad sahəsi Windows Communication Foundation (WCF) API-dən istifadə edərək paylanmış proqramlar yaratmaq üçün istifadə oluna bilən bir çox ad sahəsidir.
System.Workflow.Runtime
Sistem.İş axını.Fəaliyyətlər
Bu iki ad sahəsi Windows Workflow Foundation (WWF) API-dən istifadə edərək iş prosesini aktivləşdirən proqramlar yaratmaq üçün istifadə edilən növləri ehtiva edən çoxsaylı ad məkanlarının əsas nümayəndələridir.
Sistem.Threading
Sistem.Threading.Tasklar
Bu ad məkanı iş yükünü birdən çox CPU arasında paylaya bilən çox yivli proqramların yaradılması üçün çoxsaylı növlərdən ibarətdir.
Sistem.Təhlükəsizlik Təhlükəsizlik .NET dünyasının vacib xüsusiyyətidir. Təhlükəsizliklə əlaqəli ad məkanları icazələr, kriptoqrafik qorunma və s. ilə məşğul olmağa imkan verən bir çox növdən ibarətdir.
System.Xml Bu XML yönümlü ad məkanı XML məlumatları ilə qarşılıqlı əlaqə yaratmaq üçün istifadə edilə bilən çoxsaylı növlərdən ibarətdir.

Microsoft Kök Məkanının rolu

Cədvəldə verilmiş siyahını nəzərdən keçirərkən, Sistem ad sahəsinin layiqli sayda iç-içə ad fəzalarının (məsələn, System.IO, System.Data və s.) kök olduğunu görmək çətin deyildi. Göründüyü kimi, əsas sinif kitabxanasında Sistemdən əlavə bir sıra digər yüksək səviyyəli kök ad fəzaları təklif olunur ki, bunlardan ən faydalısı Microsoft ad sahəsi.

std ad boşluğundan nə istifadə olunur sualına cavab verərkən, ilk növbədə qeyd etmək lazımdır ki, təsvir olunan termin ingilis dilindən tərcümə edildikdə, bəyannamənin əhatə dairəsi olan ad məkanı deməkdir, müxtəlif identifikasiya formalarını müəyyən etmək lazımdır: funksiyalar və asılı/müstəqil dəyişənlər.

Bunun sayəsində adlar arasında heç bir ziddiyyət yoxdur, çünki bir neçə dəyişənin eyni dəyərləri qəbul etdiyi vəziyyətlər var. Bir qayda olaraq, bu, müxtəlif kitabxanalar yaradıldıqda baş verir.

İdentifikatorlar bir-birinə münasibətdə sərbəst mövcuddur. Tam adlandırma formatını işləyərkən müstəqil üzvlərə pulsuz giriş əldə edirlər.

Bunun üçün son dərəcə vacibdir belə ki, obyekt namespace std istifadə edərək adın tam formasını ehtiva edir. Bu, reklamın məkan adında olduqda necə göründüyünü vizual olaraq başa düşmək üçün vacibdir.

Şəkil kodlaşdırmaya girişin bir neçə variantını göstərir, hasarlarının daxilində və kənarında yerləşir:

1 Bu belə görünür tam adı:

2 Mövcud reklamı tamamlamaq üçün, istifadə edərək əlavə edin:

3 Bütün mövcud ID-ləri əlavə etmək üçün, müvafiq direktivdən istifadə edin:

Direktivdən istifadə

İstifadə direktivi ad sahəsinə daxil olan bütün mövcud adların istismarına imkan verir.

Kvalifikator müəyyən etməyə ehtiyac yoxdur.

Siz cpp formatlı fayldan istifadə etməlisiniz. Bununla belə, vacib şərt bir neçə identifikatorun olmasıdır.

Yalnız bir neçə adın mövcud olduğu halda, adi bir adın yaradılması aktual olacaqdır.

Sonra yalnız lazımi identifikatorları əlavə edə bilərsiniz, qalanlarına toxunmayın.

Qeyd etmək vacibdir ki, əgər yerli dəyişənin adları əsas ilə üst-üstə düşürsə, birincisi gizli girişdə olacaqdır.

Qeyd edək ki, eyni adlı dəyişənlərin yaradılması qeyri-qanunidir.

Məsləhət!İstifadə asanlığı üçün istifadə direktivi cpp faylının yuxarı hissəsində yerləşdirilə bilər və ya əksinə yaradılan kitabxananın içərisinə yerləşdirilə bilər.

Özünüz üçün ən rahat iş şəraitini təmin etmək üçün lazımi faylları yerləşdirmək üzərində işləyə bilərsiniz.

Mütləq lazım olmadıqca, istifadə direktivi yerləşdirilməməlidir H format faylı ilə başlıqlarda.

Bu onunla bağlıdır ki, bu hərəkətlə bütün identifikatorlar baxış sahəsində aktivləşəcək, bəzi adlarla konflikt ehtimalını artıracaq.

Fayllar üçün ən yaxşı həll tam addan istifadə etməkdir.

Onların çox uzun olduğu halda, ləqəb şəklində ixtisarlardan istifadə edə bilərsiniz.

Ad məkanı bəyannamələri

Reklamları fayl adları şəklində yerləşdirmək adətdir. Göstərilən funksiyaların icrası ayrı bir kitabxanada və ya faylda yerləşdiyi təqdirdə, tam adı müəyyən etmək vacibdir.

Hansı hərəkətlərin iştirak etdiyini başa düşmək üçün buna dəyər aşağıdakı şəkilə baxın:

cpp formatının kontosodata funksiyasını həyata keçirmək üçün, hətta əgər tam addan istifadə etmək də vacibdir direktiv ən başlanğıcda olduqda:

Ad boşluğundan istifadə std. eyni faylda yerləşən eyni anda bir neçə bölmədə bəyannamələr ola bilər.

Kompilyator hesabına verilənlərin işlənməsi zamanı bütün elementlər birləşdirilir.

Beləliklə, məsələn, std adətən əlçatan standart tipli kitabxanalarda yerləşən bütün əlçatan fayl başlıqlarında elan edilir.

Tam səriştəli adla qeyd olunan üzvlər yalnız ad məkanında deyil, həm də açıq-aşkar kvalifikasiyaya malik olduqları halda ondan kənarda da müəyyən edilə bilər.

Tərifə gəlincə, o, yaradıldığı ad sahəsindəki bəyannamədən sonra olmalıdır.

Bir illüstrativ nümunə olaraq aşağıdakı şəkilə diqqət yetirin:

Çox vaxt belə bir səhv tərif sırası pozulduqda və ya tam adın komponentləri dərhal mövcud obyektlərə daxil edildikdə baş verir.

Kukilər xüsusi ad məkanında elan edilmədikdə, formal olaraq qlobal tipli məkana daxil olur.

Məsləhət! Zəruri olmadıqda, qlobal tip məkanına üzvləri daxil etməkdən çəkinmək tövsiyə olunur.

Qayda üçün yeganə əhəmiyyətli istisnadır əsas variant, geniş məkana məcburi daxil edilməsini nəzərdə tutur.

Qlobal tip identifikatoru yaratmaq üçün tam ad şəklində uyğun görünmə funksiyasından istifadə etməlisiniz.

Belə bir hərəkət bir identifikatorun fərqli ad məkanında olan digərlərindən fərqləndirici xüsusiyyətini yaratmağa kömək edəcəkdir.

Bu kodu başa düşməyə kömək edəcək.

kosmik std.

Boşluqların yuvalana biləcəyini qeyd etmək lazımdır.

Adi bir yerləşdirmə nəzərdə tutulursa, o, bütün məkan üçün qeyri-məhdud xarakter daşıyır.

Valideyn üzvlərindən söz düşmüşkən, onların belə bir funksiyası yoxdur.

Uzatma üçün daxili əlavələr tələb olunur.

Daha yaxşı tərif və anlayış üçün, aşağıdakı şəkilə diqqət yetirin:

Sonrakı həyata keçirmək üçün məlumatı əhatə edən məlumat həm də adi yuvalanmış məkanın bir hissəsi ola bilər və ana məkanda ictimai tip interfeys kimi çıxış edə bilər.

Müqayisələr standart tipli adi əlavələrdir, ana ad sahəsinin daxili üzvləridir.

Nəticədə, arqumentlərin asılılığının olacağı bir növ həddindən artıq yükü olan funksiyalar üçün axtarışdan istifadə edə bilərsiniz.

Bağlamanın necə edildiyinə dair bir nümunə görmək üçün, aşağıdakı nümunəyə müraciət etməlisiniz:

Aşağıdakı şəkildə, ana boşluq şablonunda ixtisaslaşma prosesini görə bilərsiniz, daxili tipin müvəqqəti məkanında elan edilən:

Daxili məkanların istismarı vasitəsilə standart kitabxanalarda interfeysin müxtəlif versiyalarını idarə etmək mümkündür.

Bir, tək valideyn sahəsi yaratmaq və təqdim olunan hər bir interfeysi əhatə etmək mümkündür.

Bununla belə, o, paylaşılan ana məkanda qoşma formatında olmalıdır.

Sonra avtomatik rejimdə müştəri kodu yeni bir birləşməyə.

Köhnə versiyadan istifadə etməyə öyrəşmiş istifadəçilər heç bir problem olmadan istifadə etməyə davam edə bilərlər.

Bunun üçün siz qoşmaya tam yol yaratmalısınız.

İlk bəyannaməni təşkil etmək üçün siz inline şəklində açardan istifadə etməlisiniz.

Gəlin hər birində boş yer olan iki interfeys variantının növbəti nümunəsinə baxmağa davam edək. Müştəri kodu həmçinin yeni kitabxanalardan istifadə etmək imkanına malikdir.

Prosesin vizuallaşdırılması üçün Növbəti şəkilə keçək:

Bütün adlar müstəsna olaraq unikal olmalıdır, bununla əlaqədar onların uzunluğu əhəmiyyətli dərəcədə artır.

Lakin burada istifadə direktivindən istifadə etmək mümkün deyil.

Yalnız ad sahəsi üçün ləqəb yaratmaq mümkündür.

Bu vəziyyətdə aşağıdakı nümunəni nəzərdən keçirin:

Adi bir boşluq yaratmaq da mümkündür, lakin ona ləqəb verilmir.

Belə bir ərazi spektri anonim adlanır.

Bir qayda olaraq, bəyannamədəki üzvlərin digər obyektlərdə kodlaşdırma üçün görünməz olması lazım olduğu hallarda istifadə olunur.

Bütün dizayn, bütün identifikatorlar görə bildikdə, yaradılmış məkandan kənarda görünməz qalacaqlar.

Qeyd etməyə dəyər ad sahəsinin özü də blokdan kənarda görünməz olacaq, ona görə də hər bir istifadəçi bu detalı əvvəlcədən nəzərə almalıdır.

Tipik olaraq, biliklərdən istifadə Visual C++-da işləyənlər üçün tələb olunur.

Yaxşı nümunələrlə bu mövzu ilə məşğul olmaq çox asan olacaq.

C++ dilində ad sahəsi nədir?

Ad məkanı ümumi ad altında məntiqi əlaqəli bəyannamələrin qruplaşdırılması üsuludur.

Ad sahəsi nümunəsi:

// @author Subbotin B.P..h" ad sahəsi birinci ( int a; float b; ) ad sahəsi ikinci ( int a; float b; ) int _tmain(int argc, _TCHAR* argv) ( birinci::a = 1; ikinci:: a = 2; birinci::b = 1,23; ikinci::b = 4,56; printf("\nbirinci::a = %d\n", birinci::a); printf("\nikinci::a = %d \n", ikinci::a); printf("\nbirinci::b = %.2f\n", birinci::b); printf("\nikinci::b = %.2f\n\n", ikinci ::b); 0 qaytarın; )

Biz əldə edirik:

Nümunə iki ad sahəsi yaradır: birinci və ikinci. Hər iki boşluq eyni dəyişənləri ehtiva edir. Amma məhz o faktdır ki, məsələn, a dəyişəni ilk olaraq fəzaya aiddir, onu başqa ad fəzasından dəyişənlə qarışdırmağa imkan vermir. Bu ad ziddiyyətlərinin qarşısını alır.

ilk ad məkanında elan edilmiş int a dəyişəninin istifadə edildiyini bildirir. Bu istifadə bəyannaməsinə bir nümunədir. :: operatoru əhatə dairəsi operatoru adlanır.

Ad boşluqları namespace açar sözündən istifadə etməklə yaradılır:

Əvvəlcə ad sahəsi ( int a; float b; )

Ad məkanındakı bütün adları istifadə etmək üçün ad sahəsinin istifadəsi direktivindən istifadə edə bilərsiniz. Namespace std istifadə edərək nümunə:

ad sahəsi std istifadə edərək; int _tmain(int argc, _TCHAR* argv) ( cout<<"\n using namespace std \n"<

std ad boşluğundan istifadə std ad sahəsindən adlardan istifadə etməyə imkan verir. std C++ standart kitabxanasının adıdır.

Əgər sonuncu misalda namespace std istifadə edərək ad sahəsinin əlaqə sətirini silsək, o zaman ad sahəsinin adını açıq şəkildə göstərməli olacağıq:

// @author Subbotin B.P..h" #include int _tmain(int argc, _TCHAR* argv) ( std::cout<<"\n using namespace std \n"<

Ad sahəsi əhatə dairəsini müəyyənləşdirir. Nümunələr açıq şəkildə ad boşluqlarını müəyyənləşdirdi. Və burada ad boşluqlarının digər nümunələri var. Funksiya daxilindəki əhatə dairəsi də ad sahəsidir. Qlobal dəyişənlərin əhatə dairəsi də ad məkanıdır. Sinif həm də ad məkanıdır.

Adsız bir ad sahəsi yaratmaq mümkündür. Misal:

// @author Subbotin B.P..h" ad sahəsi ( int a; int b; ) int _tmain(int argc, _TCHAR* argv) ( a = 5; b = 8; printf("\n a = %d\n", a ); printf("\n b = %d\n\n", b); 0 qaytarın; )

Bu, ad boşluğundan istifadə direktivinin istifadəsini nəzərdə tutur. Mümkün ad konfliktlərinin qarşısını almaq üçün belə ad boşluqları lazımdır.

Əgər ad sahəsinin adı çox uzundursa, siz ad sahəsinin ləqəbini yarada bilərsiniz. Misal:

// @author Subbotin B.P..h" ad sahəsi yeraltı ( int a; int b; ) ad sahəsi ug = yeraltı; int _tmain(int argc, _TCHAR* argv) ( ug::a = 5; ug::b = 8; printf ("\n ug::a = %d\n", ug::a); printf("\n ug::b = %d\n\n", ug::b); qaytar 0; )

ad sahəsi ug = yeraltı;

yeraltı ad sahəsi üçün ug ləqəbini təqdim edir. Sonra bir ləqəblə işləyirik.

Əgər ad sahəsindən adların yalnız bir hissəsini istifadə etmək niyyətindəsinizsə, o zaman bu hissəni yeni ad sahəsinə seçib istifadə edə bilərsiniz. Misal:

// @author Subbotin B.P..h" ad sahəsi underground ( int a; int b; int c; float d; double e; ) ad sahəsi ug ( underground::a; underground istifadə edərək::b; ) int _tmain(int argc, _TCHAR* argv) ( ug::a = 5; ug::b = 8; printf("\n ug::a = %d\n", ug::a); printf("\n ug::b = %d\n\n", ug::b); 0 qaytarın; )

Burada, yeraltı adlar sahəsindəki beş dəyişəndən yalnız ikisini istifadə etmək niyyətindəyik. Biz iki istifadə bəyannaməsi olan yeni ug ad məkanı yaradırıq. Sonra, ug ad sahəsi ilə işləyirik.

Ad sahəsi dəyişdirilə bilər, yəni. ona yeni elanlar əlavə edin. Misal:

// @author Subbotin B.P..h" ad sahəsi yeraltı ( int a; int b; ) yeraltı ad sahəsi ( float c; ) int _tmain(int argc, _TCHAR* argv) ( underground::a = 5; underground::b = 8 ; underground::c = 1.2; printf("\n underground::a = %d\n", underground::a); printf("\n underground::b = %d\n", underground::b ); printf("\n underground::c = %.1f\n\n", underground::c); qaytar 0; )

Biz əldə edirik:

Ad boşluqları yuvalana bilər Misal:

// @author Subbotin B.P..h" ad sahəsi yuxarı ( int a; int b; ad sahəsi daxili ( float c; ) ) int _tmain(int argc, _TCHAR* argv) ( yuxarı::a = 5; yuxarı::b = 8 ; yuxarı::daxili::c = 1.2; printf("\n yuxarı::a = %d\n", yuxarı::a); printf("\n yuxarı::b = %d\n", yuxarı ::b); printf("\n yuxarı::daxili::c = %.1f\n\n", yuxarı::daxili::c); 0 qaytarın; )

Biz əldə edirik:

Nümunədə ad sahəsinin yuxarı hissəsində daxili ad sahəsi var. Daxili ad sahəsi sahəsinə necə daxil olduğuna diqqət yetirin:

yuxarı::daxili::c = 1,2;

Qlobal ad sahəsini nəzərdən keçirin. Burada boşluq adı göstərilmədən :: operatorundan istifadə olunur. Qlobal ad sahəsinə qlobal bəyannamələr, o cümlədən müvafiq istifadə direktivləri daxildir. Qlobal ad sahəsi nümunəsi:

// @author Subbotin B.P..h" #include ad sahəsi std istifadə edərək; int nVar; int _tmain(int argc, _TCHAR* argv) ( int nAnotherVar = 1; ::nVar = 5; cout<<"\n nAnotherVar = "<

Bəyannamələrin istifadəsi ilə direktivlərin istifadəsi arasındakı fərqi görmək vacibdir.
İstifadə bəyannaməsi dəyişəni yerli əhatə dairəsində əlçatan edir, yəni. yerli ad bəyannaməsi baş verir. Lokal dəyişəni iki yolla elan edə bilərsiniz: adi üsul və ya istifadə bəyannaməsi.

İstifadə direktivi verilmiş ad məkanındakı bütün adları əlçatan edir, lakin onları lokal olaraq elan etmir.

use-declaration use-direktivindən üstündür.

Məsələni nəzərdən keçirək:

// @author Subbotin B.P..h" ad sahəsi sbp ( int a; int b; int c; ) int a; int _tmain(int argc, _TCHAR* argv) ( int a; ad boşluğundan istifadə sbp; a = 1; sbp:: a = 2; ::a = 3; printf("\n a = %d\n", a); printf("\n sbp::a = %d\n", sbp::a); printf(" \n::a = %d\n\n", ::a); 0 qaytarın; )

Biz əldə edirik:

sbp ad boşluğundan istifadə;

sbp ad məkanından bütün adları əlçatan edən istifadə direktividir.

bu yerli dəyişən ilə işdir a. sbp boşluğundan a dəyişəninə qiymətlər təyin etmək üçün sbp-ni açıq şəkildə göstərməlisiniz:

Eyni şey a qlobal dəyişəninə də aiddir.

Yerli dəyişən a eyni adlı qlobal dəyişənləri bağlayır.

İndi istifadə bəyannaməsi üçün bir nümunə:

// @author Subbotin B.P..h" ad sahəsi sbp ( int a; int b; int c; ) int a; int _tmain(int argc, _TCHAR* argv) ( int a; a = 1; sbp::b; b istifadə edərək = 2; ::a = 3; printf("\n a = %d\n", a); printf("\n sbp::b = %d\n", sbp::b); printf("\ n::a = %d\n\n", ::a); 0 qaytarın; )

Biz əldə edirik:

bu istifadə bəyannaməsidir. Burada sbp ad məkanından b dəyişəni lokal olaraq elan edilir. Bu elandan sonra siz aşağıdakı hərəkətləri həyata keçirə bilərsiniz:

lakin a üçün istifadə bəyannaməsi

bizi xətaya aparardı, çünki misalda yerli dəyişən a artıq müəyyən edilmişdir.

Deyək ki, əvvəlki nümunələrdə işlənmiş Array sinifimizi paylaşmaq istəyirik. Bununla belə, bu problemin həllində tək biz deyildik; ola bilsin, kimsə haradasa, deyək ki, Intel-in bölmələrindən birində eyniadlı sinif yaradılıb. Bu siniflərin adları eyni olduğu üçün potensial istifadəçilər eyni anda hər iki sinifdən istifadə edə bilməzlər, onlardan birini seçməlidirlər. Bu problem sinif adına onun tərtibatçılarını müəyyən edən bəzi sətir əlavə etməklə həll edilir, məsələn:

Class Cplusplus_Primer_Third_Edition_Array ( ... );

Təbii ki, bu da adın unikallığına zəmanət vermir, lakin böyük ehtimalla istifadəçini bu problemdən xilas edəcək. Ancaq belə uzun adlardan istifadə etmək nə qədər əlverişsizdir!
C++ standartı ad uyğunluğu probleminin həlli üçün mexanizm təqdim edir ad sahəsi. Hər bir proqram təminatçısı öz siniflərini, funksiyalarını və digər obyektlərini öz ad məkanına daxil edə bilər. Məsələn, Array sinifimizin elanı belə görünür:

Ad sahəsi Cplusplus_Primer_3E ( şablon sinif massivi(...); )

Namespace açar sözü bu halda Cplusplus_Primer_3E adlanan sinifimizin görünməsini təyin edən ad məkanını müəyyən edir. Fərz edək ki, fərqli ad məkanlarında yerləşdirilmiş digər tərtibatçıların dərsləri var:

Ad sahəsi IBM_Canada_Laboratory (şablon sinif massivi(...);
classMatrix(...);
}
ad sahəsi Disney_Feature_Animation (
classPoint(...);
şablon sinif massivi(...);
}

Varsayılan olaraq, proqram açıq ad sahəsi olmadan elan edilmiş obyektləri görür; məxsusdurlar qlobal ad sahəsi. Başqa məkandan obyektə istinad etmək üçün onun ad sahəsinin identifikatorundan və əhatə dairəsinin həlli operatoru (::) ilə ayrılmış obyekt identifikatorundan ibarət olan uyğun adından istifadə etməlisiniz. Yuxarıdakı nümunələrin obyekti belə görünür:

Cplusplus_Primer_3E::Array mətn; IBM_Canada_Laboratory::Matrix mat; Disney_Feature_Animation::Nöqtə mənşəli(5000,5000);

İstifadə rahatlığı üçün ad boşluqlarına ləqəblər təyin edə bilərsiniz. Ləqəb qısa və yadda saxlamaq asan seçilir. Misal üçün:

// ləqəblərin ad sahəsi LIB = IBM_Canada_Laboratory; ad sahəsi DFA = Disney_Feature_Animation;
int main()
{
LIB::Array ia(1024);
}

Təxəllüslər ad boşluqlarının istifadəsini gizlətmək üçün də istifadə olunur. Təxəllüsü əvəz etməklə biz daxil olan funksiyalar və siniflər dəstini dəyişə bilərik və bütün digər aspektlərdə proqram kodu eyni qalacaq. Yuxarıdakı misalda yalnız bir sətri düzəldərək, biz tamamilə fərqli massivin tərifini əldə edirik:

Ad sahəsi LIB = Cplusplus_Primer_3E; int main() ( LIB::Array ia(1024); )

Təbii ki, bunun mümkün olması üçün siniflərin interfeysləri ilə bu ad məkanlarında elan edilmiş funksiyalar arasında dəqiq uyğunluq olmalıdır. Təsəvvür edək ki, Disney_Feature_Animation-dan Array sinfində bir parametrə - ölçüyə malik konstruktor yoxdur. Sonra aşağıdakı kod xəta verəcək:

Ad məkanı LIB = Disney_Feature_Animation;
int main()
{
LIB::Array ia(1024);
}

Daha rahat yol, bəzi ad məkanında müəyyən edilmiş obyektlərə istinad etmək üçün sadə, qeyri-müəyyən addan istifadə etməkdir. Bunun üçün istifadə direktivi var:
#daxil edin "IBM_Canada_Laboratory.h"

IBM_Canada_Laboratory ad məkanından istifadə;
int main()
{
Matrixmat(4,4);
// IBM_Canada_Laboratory::Array
massiv ia(1024);
// ...
}

IBM_Canada_Laboratory ad sahəsi proqram üçün görünən olur. Siz bütün məkanı deyil, onun içindəki fərdi adları görünən edə bilərsiniz (selektiv direktivdən istifadə edərək):

#ad sahəsini istifadə edərək "IBM_Canada_Laboratory.h" daxil edin IBM_Canada_Laboratory::Matrix;
// yalnız Matrix görünən olur
int main()
{
// IBM_Canada_Laboratory::Matrix
Matrixmat(4,4); // Xəta: IBM_Canada_Laboratory::Array görünməzdir
massiv ia(1024);
// ... }

Qeyd etdiyimiz kimi, C++ Standart Kitabxanasının bütün komponentləri std ad məkanında elan edilir. Buna görə də, standart funksiyaları və sinifləri birbaşa istifadə etmək üçün sadəcə başlıq faylını daxil etmək kifayət deyil:

#daxildir // xəta: sətir görünməzdir

İstifadə direktivindən istifadə etməlisiniz:

#daxildir ad sahəsi std istifadə edərək; // Ok: sətir bax
string current_chapter = "C++ Baxış";

Bununla belə, qeyd edək ki, bu yolla qlobal adlar sahəsinin “çirklənməsi” probleminə qayıdırıq, bunun üçün həll etmək üçün adlandırılmış boşluqlar mexanizmi yaradılmışdır. Buna görə də ya uyğun addan istifadə etmək daha yaxşıdır:

#daxildir // düzgün: uyğun ad std::string current_chapter = "C++ icmalı"; və ya selektiv direktivdən istifadə edərək: #include ad boşluğundan istifadə std::string; // Ok: sətir görünür
string current_chapter = "C++ Baxış";

Sonuncu üsuldan istifadə etməyi məsləhət görürük.
Bu kitabdakı nümunələrin əksəriyyətində ad sahəsi direktivləri buraxılmışdır. Bu kodun ölçüsünü azaltmaq üçün edilir və həmçinin nümunələrin əksəriyyəti ad boşluqlarını dəstəkləməyən kompilyatorla tərtib edildiyinə görə - son C++ yeniliyi kifayətdir. (C++ Standart Kitabxanası ilə işləyərkən bəyannamələrin istifadəsinə dair təfərrüatlar Bölmə 8.6-da müzakirə olunur.)
Növbəti fəsillərdə biz daha dörd sinif yaradacağıq: String, Stack, List və Stack-in modifikasiyası. Onların hamısı bir ad sahəsinə daxil ediləcək - Cplusplus_Primer_3E. (Ad boşluqları ilə işləmək haqqında ətraflı məlumat üçün Fəsil 8-ə baxın.)

Məşq 2.21

Ad sahəsi verilmişdir

Ad məkanı Məşqi (şablon sinif massivi(...);
şablon
boş çap (massiv< EType >);
sinif sətri (...)
şablon
sinif siyahısı(...);
}

və proqram mətni:

int main() ( const int ölçüsü = 1024; Massiv kimi (ölçüsü); Siyahı il(ölçüsü);
// ...
massiv *pas = yeni massiv (kimi);
Siyahı *pil = yeni Siyahı (il);
çap (*keçid);
}

Proqram tərtib edilmir, çünki istifadə olunan siniflərin bəyannamələri Məşq ad sahəsinə əlavə olunub. Proqram kodunu istifadə edərək dəyişdirin
(a) uyğun adlar
(b) direktivdən istifadə etməklə seçici
(c) ləqəb mexanizmi
(d) direktivdən istifadə etməklə