Untuk apa kata kunci namespace digunakan? Kelas dan namespace. Deklarasi Ruang Nama




Kelas dan Namespace

Kelas .NET Framework

Mungkin manfaat terbesar dari menulis kode terkelola - setidaknya dari sudut pandang pengembang - adalah Anda dapat menggunakannya Perpustakaan kelas dasar .NET .

Kelas inti .NET menyediakan banyak koleksi kelas kode terkelola yang memungkinkan Anda memecahkan hampir semua masalah yang sebelumnya dapat diselesaikan menggunakan Windows API. Semua kelas ini mengikuti model objek IL yang sama dengan pewarisan tunggal. Ini berarti Anda dapat membuat objek dari kelas dasar .NET mana pun atau mewarisi kelas Anda sendiri dari kelas tersebut.

Apa yang membuat kelas dasar .NET berbeda adalah kelas tersebut dirancang agar intuitif dan mudah digunakan. Misalnya, untuk memulai thread Anda perlu memanggil metode Start() kelas tersebut Benang. Untuk membuat objek TextBox tidak tersedia, setel properti Enabled objek ke false. Pendekatan ini, yang familiar bagi pengembang Visual Basic dan Java yang perpustakaannya mudah digunakan, akan sangat melegakan bagi pengembang C++ yang telah menghabiskan waktu bertahun-tahun berjuang dengan fungsi API seperti GetDIBits(), RegisterWndClassEx(), dan IsEqualIID(), serta serta banyak fungsi yang memerlukan pegangan jendela.

Namun, pengembang C++ selalu memiliki akses mudah ke seluruh set API Windows, sementara pengembang Visual Basic 6 dan Java terbatas pada fungsionalitas sistem operasi inti yang mereka akses dari bahasa mereka. Kelas dasar .NET menggabungkan kemudahan penggunaan pustaka Visual Basic dan Java dengan cakupan rangkaian fitur Windows API yang relatif lengkap. Banyak fitur Windows yang tidak dapat diakses melalui kelas dasar, dan dalam kasus ini Anda harus menggunakan fungsi API, tetapi secara umum ini hanya berlaku untuk fungsi yang paling eksotik. Untuk penggunaan sehari-hari, satu set kelas dasar biasanya sudah cukup. Namun jika Anda perlu memanggil fungsi API, maka .NET menyediakan apa yang disebut mekanisme pemanggilan platform, yang menjamin konversi tipe data yang benar, jadi sekarang tugas ini tidak lebih sulit daripada memanggil fungsi-fungsi ini langsung dari kode C++, terlepas dari bahasa apa kode tersebut ditulis - C#, C++ atau Visual Basic 2010.

Ruang nama

Ruang nama adalah cara .NET menghindari konflik penamaan antar kelas. Mereka dimaksudkan untuk mencegah situasi di mana Anda mendefinisikan kelas yang mewakili pelanggan, menyebutnya Pelanggan, dan kemudian orang lain melakukan hal yang sama (ini adalah skenario yang cukup umum).

Namespace tidak lebih dari sekelompok tipe data, namun memiliki efek bahwa nama semua tipe data dalam namespace secara otomatis diawali dengan nama namespace. Namespace dapat disarangkan satu sama lain. Misalnya, sebagian besar kelas dasar .NET untuk tujuan umum ditemukan di namespace Sistem. Kelas dasar Himpunan mengacu pada ruang ini, jadi nama lengkapnya adalah Sistem.Array.

Platform .NET mengharuskan semua nama dideklarasikan dalam namespace; misalnya Anda dapat menempatkan kelas Anda Kelasku ke ruang nama Perusahaanku. Maka akan terlihat seperti apa nama lengkap kelas ini Perusahaan Saya.Kelas Saya.

Perhatikan bahwa jika namespace tidak ditentukan secara eksplisit, tipenya akan ditambahkan ke namespace global yang tidak disebutkan namanya.

Dalam sebagian besar situasi, Microsoft merekomendasikan penggunaan setidaknya dua namespace bertingkat: yang pertama adalah nama perusahaan Anda, dan yang kedua adalah nama paket teknologi atau perangkat lunak yang dimiliki kelas tersebut, sehingga terlihat seperti ini: MyCompany.SomeNamespace .Kelasku. Dalam kebanyakan kasus, pendekatan ini akan melindungi kelas aplikasi Anda dari potensi konflik dengan nama kelas yang ditulis oleh pengembang dari perusahaan lain.

Tabel berikut adalah daftar singkat dari beberapa (tetapi tentunya tidak semua) namespace yang ditawarkan di .NET, yang telah dibagi menjadi beberapa kelompok berdasarkan fungsinya:

Ruang Nama Kunci .NET Framework
Ruang nama di .NET Keterangan
Sistem Di dalam ruang nama Sistem berisi banyak tipe berguna untuk menangani data internal, matematika, pembuatan angka acak, variabel lingkungan, dan pengumpulan sampah, serta sejumlah pengecualian dan atribut yang umum digunakan
Sistem.Koleksi
Sistem.Koleksi.Generik
Namespace ini berisi sejumlah tipe kontainer, serta beberapa tipe dasar dan antarmuka yang memungkinkan Anda membuat koleksi khusus
Sistem.Data
Sistem.Data.Umum
Sistem.Data.EntityClient
Sistem.Data.SqlClient
Namespace ini digunakan untuk berinteraksi dengan database menggunakan ADO.NET
Sistem.IO
Sistem.IO.Kompresi
Sistem.IO.Ports
Ruang ini berisi banyak tipe yang dirancang untuk menangani I/O file, kompresi data, dan manipulasi port.
Sistem.Refleksi
Sistem.Refleksi.Emit
Namespace ini berisi tipe yang mendukung penemuan tipe run-time serta pembuatan tipe dinamis
Sistem.Runtime.InteropServices Namespace ini berisi sarana yang memungkinkan Anda mengizinkan tipe .NET berinteraksi dengan "kode yang tidak dikelola" (seperti DLL berbasis C dan server COM) dan sebaliknya
Sistem.Gambar
Sistem.Windows.Formulir
Namespace ini berisi tipe yang digunakan untuk membangun aplikasi desktop menggunakan perangkat grafis .NET (Windows Forms) asli.
Sistem.Windows
Sistem.Windows.Kontrol
Sistem.Windows.Bentuk
Ruang angkasa Sistem.Windows adalah akar dari beberapa namespace ini, yang mewakili seperangkat alat grafis Windows Presentation Foundation (WPF).
Sistem.Linq
Sistem.Xml.Linq
Ekstensi Sistem.Data.DataSet
Namespace ini berisi tipe yang digunakan saat melakukan pemrograman menggunakan LINQ API
Sistem.Web Namespace ini adalah salah satu dari banyak namespace yang memungkinkan Anda membuat aplikasi web ASP.NET
Sistem.ServiceModel Namespace ini adalah salah satu dari banyak namespace yang dapat Anda gunakan untuk membuat aplikasi terdistribusi menggunakan Windows Communication Foundation (WCF) API.
Sistem.Alur Kerja.Waktu Proses
Sistem.Alur Kerja.Aktivitas
Kedua namespace ini adalah perwakilan utama dari banyak namespace yang berisi tipe yang digunakan untuk membangun aplikasi yang mendukung alur kerja menggunakan Windows Workflow Foundation (WWF) API.
Sistem.Threading
Sistem.Threading.Tugas
Namespace ini berisi berbagai tipe untuk membangun aplikasi multi-thread yang dapat mendistribusikan beban kerja ke beberapa CPU.
Sistem.Keamanan Keamanan melekat di dunia .NET. Namespace terkait keamanan berisi banyak tipe yang berhubungan dengan izin, keamanan kriptografi, dll.
Sistem.Xml Namespace berorientasi XML ini berisi banyak tipe yang dapat digunakan untuk berinteraksi dengan data XML

Peran ruang root Microsoft

Saat memeriksa daftar di tabel, mudah untuk melihat bahwa namespace Sistem adalah akar dari sejumlah namespace bersarang yang layak (seperti System.IO, System.Data, dll.). Ternyata, selain Sistem, perpustakaan kelas dasar juga menawarkan sejumlah namespace root tingkat atas lainnya, yang paling berguna adalah Ruang nama Microsoft.

Menjawab pertanyaan tentang apa itu penggunaan namespace std, pertama-tama perlu dicatat bahwa diterjemahkan dari bahasa Inggris istilah yang dijelaskan berarti ruang nama, yang merupakan ruang lingkup deklarasi, yang diperlukan untuk mendefinisikan berbagai bentuk identifikasi: fungsi dan variabel terikat/independen.

Berkat itu, tidak ada konflik antar nama, karena ada situasi ketika beberapa variabel mengambil nilai yang sama. Biasanya, ini terjadi ketika perpustakaan berbeda dibuat.

Pengidentifikasi tersedia secara bebas dalam kaitannya satu sama lain. Mereka mendapatkan akses gratis menjadi anggota independen jika menggunakan format nama lengkap.

Untuk ini, ini sangat penting agar objek tersebut berisi nama wujud lengkap dengan menggunakan namespace std. Hal ini penting untuk memahami secara visual tampilan deklarasi ketika ditempatkan pada nama ruang.

Gambar menunjukkan beberapa variasi akses pengkodean, terletak di dalam dan di luar pagarnya:

1 Ini penampakannya nama lengkap:

2 Untuk melengkapi iklan yang sudah ada, tambahkan menggunakan:

3 Untuk menambahkan semua ID yang ada, gunakan arahan yang sesuai:

Menggunakan Petunjuk

Arahan penggunaan memungkinkan eksploitasi semua nama yang tersedia yang termasuk dalam namespace.

Tidak perlu menentukan kualifikasi.

Anda harus menggunakan menggunakan file berformat cpp. Namun, syarat penting adalah adanya beberapa pengidentifikasi.

Jika hanya ada beberapa nama, membuat nama biasa akan relevan.

Kemudian Anda hanya dapat menambahkan pengidentifikasi yang diperlukan dan membiarkan sisanya.

Penting untuk dicatat bahwa jika nama variabel lokal dan variabel utama sama, maka dalam hal ini variabel pertama akan berada dalam akses tersembunyi.

Harap dicatat bahwa membuat variabel dengan nama yang sama adalah ilegal.

Nasihat! Untuk kemudahan penggunaan, arahan penggunaan dapat ditempatkan di bagian atas file berformat cpp., atau sebaliknya, ditempatkan di dalam perpustakaan yang dibuat.

Untuk memastikan kondisi kerja yang paling nyaman bagi Anda sendiri, Anda dapat berupaya menempatkan file yang diperlukan.

Kecuali benar-benar diperlukan, arahan penggunaan tidak boleh ditempatkan di header dalam file format H.

Hal ini disebabkan oleh fakta bahwa dengan tindakan ini, semua pengidentifikasi akan menjadi aktif di bidang visibilitas, meningkatkan kemungkinan konflik beberapa nama.

Untuk file, solusi terbaik adalah menggunakan nama lengkap.

Apabila dirasa terlalu panjang, dapat menggunakan singkatan berupa alias.

Deklarasi Ruang Nama

Merupakan kebiasaan untuk memasang iklan dalam bentuk nama file. Jika eksekusi fungsi tertentu terletak di perpustakaan atau file terpisah, penting untuk menentukan nama lengkapnya.

Untuk memahami tindakan apa yang sedang kita bicarakan, ada baiknya lihat gambar berikut:

Untuk mengimplementasikan fungsi cpp.format contosodata, penting juga untuk menggunakan nama lengkap dalam case ketika arahannya ada di awal:

Menggunakan namespace std. mungkin berisi iklan di beberapa bagian sekaligus yang terletak di file yang sama.

Karena kompiler, semua elemen digabungkan saat data sedang diproses.

Jadi, misalnya, std., sebagai aturan, dideklarasikan di semua header file yang dapat diakses yang terletak di perpustakaan tipe standar yang dapat diakses.

Anggota yang ditunjuk dengan nama yang sepenuhnya memenuhi syarat dapat ditentukan tidak hanya di dalam ruang nama, tetapi juga di luar ruang nama jika mereka mempunyai kualifikasi yang jelas.

Adapun definisinya, harus muncul setelah deklarasi di namespace tempat ia dibuat.

Sebagai contoh visual, perhatikan gambar berikut:

Paling sering, kesalahan ini muncul ketika urutan definisi dilanggar, atau bagian penyusun nama lengkap langsung disertakan dalam objek yang tersedia.

Ketika cookie tidak dideklarasikan dalam namespace tertentu, itu secara formal termasuk dalam ruang tipe global.

Nasihat! Kecuali benar-benar diperlukan, disarankan untuk menghindari memasukkan anggota dalam tipe ruang global.

Satu-satunya pengecualian yang signifikan terhadap aturan tersebut adalah pilihan utama, menyiratkan inklusi wajib dalam ruang yang luas.

Untuk membuat pengidentifikasi tipe global, Anda perlu menggunakan fungsi visibilitas yang sesuai, dalam bentuk nama lengkap.

Tindakan ini akan membantu menciptakan properti khas dari satu pengidentifikasi dari pengidentifikasi lain yang sudah ada dan berada di namespace berbeda.

Ini akan membantu Anda memahami kodenya.

Ruang st.

Perlu dicatat bahwa spasi bisa bertipe bersarang.

Jika yang dimaksud adalah penyematan biasa, maka sifatnya tidak terbatas pada seluruh ruang.

Berbicara tentang anggota orang tua, mereka tidak memiliki fungsi seperti itu.

Untuk ekspansi, diperlukan lampiran bawaan.

Untuk definisi dan pemahaman yang lebih tepat, perhatikan gambar berikut:

Mengenkapsulasi informasi untuk implementasi lebih lanjut, ini juga dapat menjadi bagian dari ruang bersarang biasa dan bertindak sebagai antarmuka tipe terbuka di ruang induk.

Perbandingan adalah lampiran biasa dari tipe standar, anggota bawaan ruang nama induk.

Hasilnya, Anda dapat menggunakan pencarian fungsi yang memiliki kelebihan beban, di mana akan ada ketergantungan argumen.

Untuk melihat contoh bagaimana pengikatan dilakukan, Ada baiknya merujuk pada contoh berikut:

Gambar berikut menunjukkan proses spesialisasi dalam templat ruang induk, yang dideklarasikan dalam ruang sementara dari tipe bawaan:

Dengan memanfaatkan ruang bawaan, dimungkinkan untuk mengelola berbagai versi antarmuka di perpustakaan standar.

Dimungkinkan untuk membuat satu ruang induk tunggal dan merangkum setiap antarmuka yang disajikan.

Namun, itu harus dalam format lampiran di ruang induk bersama.

Kemudian kode klien secara otomatis ditetapkan ke kombinasi baru.

Pengguna yang terbiasa menggunakan versi lama dapat terus menggunakannya tanpa kendala.

Untuk melakukan ini, Anda perlu membuat jalur lengkap ke lampiran.

Untuk mengatur pengumuman pertama, Anda harus menggunakan kunci inline.

Mari kita lihat contoh dua opsi antarmuka berikut, yang masing-masing memiliki ruang. Kode klien juga memiliki kemampuan untuk mengeksploitasi perpustakaan baru.

Untuk memvisualisasikan prosesnya Mari kita beralih ke gambar berikut:

Semua nama harus sangat unik; oleh karena itu, panjangnya bertambah secara signifikan.

Namun, tidak mungkin menggunakan arahan penggunaan di sini.

Hanya dimungkinkan untuk membuat alias untuk namespace.

Dalam hal ini, perhatikan contoh berikut:

Dimungkinkan juga untuk membuat ruang biasa, tetapi tidak diberi alias.

Spektrum teritorial ini disebut anonim.

Sebagai aturan, ini digunakan dalam situasi di mana anggota dalam deklarasi harus tidak terlihat untuk pengkodean pada objek lain.

Seluruh struktur, ketika semua pengidentifikasi dapat dilihat, namun di luar ruang yang dibuat, mereka akan tetap tidak terlihat.

Perlu diperhatikan, bahwa namespace itu sendiri juga tidak akan terlihat di luar blok, jadi setiap pengguna harus memperhatikan detail ini terlebih dahulu.

Biasanya, penggunaan pengetahuan diperlukan bagi mereka yang bekerja di Visual C++.

Dengan menggunakan contoh berkualitas tinggi, akan lebih mudah untuk memahami topik ini.

Apa itu namespace di C++?

Namespace adalah cara mengelompokkan deklarasi yang terkait secara logis di bawah nama yang sama.

Contoh ruang nama:

// @author Subbotin B.P..h" namespace pertama ( int a; float b; ) namespace kedua ( int a; float b; ) int _tmain(int argc, _TCHAR* argv) ( first::a = 1; second:: a = 2; pertama::b = 1,23; kedua::b = 4,56; printf("\npertama::a = %d\n", pertama::a); printf("\nkedua::a = %d \n", kedua::a); printf("\npertama::b = %.2f\n", pertama::b); printf("\nkedua::b = %.2f\n\n", kedua::b); kembali 0; )

Kita mendapatkan:

Dalam contoh ini, dua namespace dibuat: pertama dan kedua. Kedua spasi berisi variabel yang sama. Namun faktanya, misalnya, variabel a termasuk dalam spasi pertama yang tidak memungkinkannya tertukar dengan variabel dari namespace lain. Hal ini untuk menghindari konflik nama.

berarti variabel int a yang dideklarasikan di namespace pertama digunakan. Ini adalah contoh deklarasi penggunaan. Operator :: disebut operator pelingkupan.

Namespace dibuat menggunakan kata kunci namespace:

Namespace terlebih dahulu ( int a; float b; )

Untuk menggunakan semua nama dari suatu namespace, Anda dapat menggunakan direktif menggunakan namespace. Contoh penggunaan namespace std:

menggunakan namespace std; int _tmain(int argc, _TCHAR* argv) ( cout<<"\n using namespace std \n"<

menggunakan namespace std memungkinkan Anda menggunakan nama dari namespace std. std adalah nama perpustakaan standar C++.

Jika pada contoh terakhir kita menghapus string koneksi namespace menggunakan namespace std, maka kita perlu menentukan nama namespace secara eksplisit:

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

Namespace mendefinisikan ruang lingkup. Contoh-contoh tersebut secara eksplisit mendefinisikan namespace. Berikut adalah contoh namespace lainnya. Ruang lingkup dalam suatu fungsi juga merupakan namespace. Ruang lingkup variabel global juga merupakan namespace. Kelas juga merupakan namespace.

Dimungkinkan untuk membuat namespace tanpa nama. Contoh:

// @author Subbotin B.P..h" namespace ( 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); kembalikan 0; )

Ini menyiratkan penggunaan arahan menggunakan namespace. Namespace seperti itu diperlukan untuk menghindari kemungkinan konflik nama.

Jika nama namespace terlalu panjang, Anda bisa membuat alias namespace. Contoh:

// @author Subbotin B.P.h" namespace bawah tanah ( int a; int b; ) namespace ug = underground; 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); return 0; )

namespace ug = bawah tanah;

memperkenalkan alias ug untuk namespace bawah tanah. Selanjutnya kita bekerja dengan alias.

Jika Anda ingin menggunakan hanya sebagian nama dari namespace, maka Anda dapat memilih bagian ini ke dalam namespace baru dan menggunakannya. Contoh:

// @author Subbotin B.P.h" namespace underground ( int a; int b; int c; float d; double e; ) namespace ug ( menggunakan underground::a; menggunakan underground::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); kembalikan 0; )

Di sini, dari lima variabel namespace bawah tanah, kami berasumsi hanya menggunakan dua. Kami membuat namespace ug baru, yang berisi dua deklarasi penggunaan. Selanjutnya kita bekerja dengan namespace ug.

Namespace dapat diubah, mis. tambahkan iklan baru ke dalamnya. Contoh:

// @author Subbotin B.P.h" namespace bawah tanah ( int a; int b; ) namespace bawah tanah ( float c; ) int _tmain(int argc, _TCHAR* argv) ( underground::a = 5; underground::b = 8 ; bawah tanah::c = 1.2; printf("\n bawah tanah::a = %d\n", bawah tanah::a); printf("\n bawah tanah::b = %d\n", bawah tanah::b ); printf("\n bawah tanah::c = %.1f\n\n", bawah tanah::c); kembalikan 0; )

Kita mendapatkan:

Namespace dapat disarangkan Contoh:

// @author Subbotin B.P..h" namespace atas ( int a; int b; namespace dalam ( float c; ) ) int _tmain(int argc, _TCHAR* argv) ( upper::a = 5; upper::b = 8 ; atas::dalam::c = 1.2; printf("\n atas::a = %d\n", atas::a); printf("\n atas::b = %d\n", atas ::b); printf("\n atas::dalam::c = %.1f\n\n", atas::dalam::c); kembali 0; )

Kita mendapatkan:

Pada contoh, namespace bagian atas berisi namespace bagian dalam. Perhatikan bagaimana bidang namespace internal diakses:

atas::dalam::c = 1,2;

Mari kita lihat namespace global. Di sini operator :: digunakan tanpa menentukan nama spasi. Namespace global berisi deklarasi global, termasuk arahan penggunaan yang sesuai. Contoh namespace global:

// @penulis Subbotin B.P..h" #include menggunakan namespace std; int nVar; int _tmain(int argc, _TCHAR* argv) ( int nAnotherVar = 1; ::nVar = 5; cout<<"\n nAnotherVar = "<

Penting untuk melihat perbedaan antara menggunakan deklarasi dan menggunakan arahan.
Deklarasi penggunaan membuat variabel tersedia dalam lingkup lokal, mis. deklarasi nama lokal terjadi. Ada dua cara untuk mendeklarasikan variabel lokal: normal atau menggunakan deklarasi menggunakan.

Direktif penggunaan menyediakan semua nama dalam namespace tertentu, namun tidak mendeklarasikannya secara lokal.

Deklarasi penggunaan lebih diutamakan daripada arahan penggunaan.

Mari kita lihat sebuah contoh:

// @author Subbotin B.P..h" namespace sbp ( int a; int b; int c; ) int a; int _tmain(int argc, _TCHAR* argv) ( int a; menggunakan namespace 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); kembali 0; )

Kita mendapatkan:

menggunakan namespace sbp;

Ini adalah arahan penggunaan yang membuat semua nama di namespace sbp tersedia.

Ini bekerja dengan variabel lokal a. Untuk menetapkan nilai ke variabel a dari spasi sbp, Anda harus menunjuk ke sbp secara eksplisit:

Hal yang sama berlaku untuk variabel global a.

Variabel lokal a menutup variabel global dengan nama yang sama.

Sekarang contoh deklarasi penggunaan:

// @author Subbotin B.P.h" namespace sbp ( int a; int b; int c; ) int a; int _tmain(int argc, _TCHAR* argv) ( int a; a = 1; menggunakan sbp::b; b = 2; ::a = 3; printf("\n a = %d\n", a); printf("\n sbp::b = %d\n", sbp::b); printf("\ n::a = %d\n\n", ::a); kembali 0; )

Kita mendapatkan:

Ini adalah deklarasi penggunaan. Di sini variabel b dideklarasikan secara lokal dari namespace sbp. Setelah pengumuman ini, Anda dapat melakukan tindakan berikut:

tetapi deklarasi penggunaan untuk a

akan membawa kita pada kesalahan, karena dalam contoh variabel lokal a sudah ditentukan.

Katakanlah kita ingin berbagi kelas Array, yang dikembangkan pada contoh sebelumnya. Namun, kami tidak sendirian dalam mengatasi masalah ini; Mungkin seseorang di suatu tempat, katakanlah, di salah satu divisi Intel, membuat kelas dengan nama yang sama. Karena nama kelas-kelas ini sama, calon pengguna tidak dapat menggunakan kedua kelas secara bersamaan; mereka harus memilih salah satunya. Masalah ini diselesaikan dengan menambahkan beberapa string ke nama kelas yang mengidentifikasi pengembangnya, misalnya,

Kelas Cplusplus_Primer_Third_Edition_Array ( ... );

Tentu saja, hal ini juga tidak menjamin keunikan nama tersebut, namun kemungkinan besar akan menyelamatkan pengguna dari masalah ini. Namun, betapa merepotkannya menggunakan nama yang panjang seperti itu!
Standar C++ menawarkan mekanisme untuk memecahkan masalah pencocokan nama yang disebut ruang nama. Setiap produsen perangkat lunak dapat menggabungkan kelas, fungsi, dan objek lainnya dalam namespacenya sendiri. Misalnya, seperti inilah deklarasi kelas Array kita:

Ruang Nama Cplusplus_Primer_3E ( templat kelas Array(...); )

Kata kunci namespace menentukan namespace yang mendefinisikan visibilitas kelas kita, yang dalam hal ini disebut Cplusplus_Primer_3E. Katakanlah kita memiliki kelas dari pengembang lain yang ditempatkan di namespace berbeda:

Ruang Nama IBM_Canada_Laboratory ( templat kelas Array(...);
kelas Matriks(...);
}
ruang nama Disney_Feature_Animation (
kelas Poin(...);
templat kelas Array(...);
}

Secara default, objek yang dideklarasikan tanpa namespace eksplisit akan terlihat di program; milik mereka global ruang nama. Untuk merujuk ke objek dari ruang lain, Anda harus menggunakan nama yang memenuhi syarat, yang terdiri dari pengidentifikasi namespace dan pengidentifikasi objek, dipisahkan oleh operator resolusi cakupan (::). Berikut tampilan panggilan ke objek pada contoh di atas:

Cplusplus_Primer_3E::Array teks; IBM_Canada_Laboratory::Matras matriks; Disney_Feature_Animation::Titik asal(5000,5000);

Untuk kemudahan penggunaan, Anda dapat menetapkan alias ke namespace. Nama panggilan tersebut dipilih yang pendek dan mudah diingat. Misalnya:

// alias namespace LIB = IBM_Canada_Laboratory; namespace DFA = Disney_Feature_Animation;
ke dalam utama()
{
LIB::Array ia(1024);
}

Alias ​​juga digunakan untuk menyembunyikan penggunaan namespace. Dengan mengganti alias, kita dapat mengubah kumpulan fungsi dan kelas yang terlibat, dan dalam semua hal lainnya, kode program akan tetap sama. Dengan mengoreksi satu baris saja pada contoh di atas, kita mendapatkan definisi array yang benar-benar berbeda:

Ruang Nama LIB = Cplusplus_Primer_3E; int main() ( LIB::Array ia(1024); )

Tentu saja, agar hal ini dapat terjadi, harus ada kecocokan persis antara antarmuka kelas dan fungsi yang dideklarasikan dalam namespace tersebut. Bayangkan kelas Array dari Disney_Feature_Animation tidak memiliki konstruktor dengan satu parameter - ukuran. Maka kode berikut akan memunculkan error:

Namespace LIB = Disney_Feature_Animation;
ke dalam utama()
{
LIB::Array ia(1024);
}

Cara yang lebih nyaman lagi adalah dengan menggunakan nama yang sederhana dan tidak memenuhi syarat untuk merujuk ke objek yang ditentukan dalam namespace tertentu. Ada arahan penggunaan untuk ini:
#sertakan "IBM_Canada_Laboratory.h"

Menggunakan namespace IBM_Canada_Laboratory;
ke dalam utama()
{
Mat matriks(4,4);
// IBM_Canada_Laboratory::Array
Himpunan ia(1024);
// ...
}

Namespace IBM_Canada_Laboratory menjadi terlihat dalam program. Anda tidak dapat menampilkan seluruh ruang, tetapi nama individual di dalamnya (selektif menggunakan arahan):

#sertakan "IBM_Canada_Laboratory.h" menggunakan namespace IBM_Canada_Laboratory::Matrix;
// hanya Matriks yang terlihat
ke dalam utama()
{
// IBM_Canada_Laboratory::Matriks
Mat matriks(4,4); // Kesalahan: IBM_Canada_Laboratory::Array tidak terlihat
Himpunan ia(1024);
// ... }

Seperti yang telah kami sebutkan, semua komponen pustaka standar C++ dideklarasikan di dalam namespace std. Oleh karena itu, menyertakan file header saja tidak cukup untuk langsung menggunakan fungsi dan kelas standar:

#termasuk // kesalahan: string tidak terlihat

Anda harus menggunakan arahan penggunaan:

#termasuk menggunakan namespace std; // Oke: lihat string
string current_chapter = "Ulasan C++";

Namun perlu diperhatikan bahwa dengan cara ini kita kembali ke masalah “menyumbat” namespace global, untuk menyelesaikannya mekanisme namespace telah dibuat. Oleh karena itu lebih baik menggunakan nama yang memenuhi syarat:

#termasuk // benar: nama yang memenuhi syarat std::string current_chapter = "Ikhtisar C++"; atau arahan selektif menggunakan: #include menggunakan namespace std::string; // Oke: string terlihat
string current_chapter = "Ulasan C++";

Kami merekomendasikan menggunakan metode terakhir.
Pada sebagian besar contoh dalam buku ini, arahan namespace telah dihilangkan. Hal ini dilakukan untuk mengurangi ukuran kode, dan juga karena sebagian besar contoh dikompilasi dengan kompiler yang tidak mendukung namespace - inovasi terbaru dalam C++ sudah cukup. (Rincian penggunaan deklarasi saat bekerja dengan C++ Standard Library dibahas di Bagian 8.6.)
Pada bab berikut, kita akan membuat empat kelas lagi: String, Stack, List, dan modifikasi Stack. Semuanya akan dimasukkan dalam satu namespace - Cplusplus_Primer_3E. (Kami membahas cara bekerja dengan namespace secara lebih rinci di Bab 8.)

Latihan 2.21

Ruang nama diberikan

Latihan Namespace ( template kelas Array(...);
templat
batal cetak(Array< EType >);
kelas String ( ... )
templat
Daftar kelas(...);
}

dan teks program:

Int main() ( const int ukuran = 1024; Array sebagai(ukuran); Daftar saya(ukuran);
// ...
Himpunan *pas = Array baru (sebagai);
Daftar *pil = Daftar baru (saya);
mencetak(*pas);
}

Program tidak dapat dikompilasi karena deklarasi kelas yang digunakan terlampir dalam namespace Latihan. Ubah kode program menggunakan
(a) nama yang memenuhi syarat
(b) selektif menggunakan arahan
(c) mekanisme alias
(d) menggunakan arahan