Pertimbangkan dua pernyataan skalar berikut dalam skop global, dalam program berikut:
#sertakanmenggunakan ruang nama std;
int varId = 5;
float varId = 2.3;
int utama ()
pulangan 0;
Percubaan untuk menyusun program ini menyebabkan ralat penyusunan. Terdapat dua pemboleh ubah dengan nama yang sama, varId. Walaupun mereka adalah dua pemboleh ubah yang berbeza dari dua jenis yang berbeza, int dan terapung, penyusun menolak kedua-dua deklarasi itu kerana nama mereka sama. Program berikut menyelesaikan masalah ini dengan menyatakan pemboleh ubah dengan nama yang sama dalam dua ruang lingkup umum yang berbeza:
#sertakanmenggunakan ruang nama std;
ruang nama NA
int varId = 5;
ruang nama NB
float varId = 2.3;
int utama ()
cout << NA::varId << '\n';
cout << NB::varId << '\n';
pulangan 0;
Keluarannya adalah seperti berikut:
52.3
Terdapat dua ruang nama dalam program di atas: NA, yang mempunyai definisi integer, dan NB, yang mempunyai definisi float tetapi dengan nama yang sama dengan integer untuk NA. Akhirnya, semasa program dijalankan, nama yang sama untuk dua pemboleh ubah yang berbeza digunakan. Perhatikan bahawa untuk mengakses nama yang sama dari dua pemboleh ubah yang berbeza, nama tertentu untuk ruang nama mesti digunakan, diikuti dengan pengenal umum. Nama ruang nama dan pengenal umum dipisahkan oleh operator resolusi skop, "::."Nama ruang nama akan membezakan objek.
Artikel ini merangkumi konsep asas ruang nama dan penggunaannya dalam bahasa pengaturcaraan C ++. Untuk mengikuti artikel ini, anda harus mempunyai pengetahuan asas mengenai bahasa C ++. Anda juga harus mempunyai pengetahuan mengenai skop C ++, walaupun dijelaskan secara ringkas dalam artikel ini. Untuk mengetahui lebih lanjut mengenai ruang lingkup C ++, cari frasa, "Skop dalam C ++" (tanpa tanda petik) di kotak carian mana-mana linuxhint.laman web com dan tekan Enter. Ini akan membawa anda ke artikel yang ditulis oleh pengarang ini.
Kandungan Artikel
- Apa itu Namespace?
- Arahan penggunaan
- Ruang Nama Bersarang
- Ruang Nama Piawai
- Kesimpulannya
Apa itu Namespace?
Kawasan deklaratif adalah bahagian terbesar dari program di mana nama entiti (pemboleh ubah) berlaku. Wilayah ini disebut ruang lingkup. Ruang nama dalam C ++ adalah ruang lingkup umum yang tujuan utamanya adalah untuk menyelesaikan konflik nama. Ruang nama mempunyai pernyataan asas dan / atau definisi entiti.
Ruang Nama Global dan Masalahnya
Ruang nama global adalah ruang lingkup global. Pertimbangkan program pendek berikut:
#sertakanmenggunakan ruang nama std;
int ident = 55;
apungan ident = 12.17;
int utama ()
pulangan 0;
Dalam program di atas, terdapat dua pemboleh ubah, kedua-duanya disebut ident. Pemboleh ubah ini berada dalam skop global; iaitu, mereka berada di ruang nama global. Percubaan untuk menyusun program ini akan gagal dengan mesej ralat. Skop global tidak menerima lebih dari satu pemboleh ubah dengan nama yang sama, jadi ada keperluan untuk ruang nama khusus.
Ruang Nama Tersuai
Ruang nama tidak mempunyai satu nama sahaja. Sebaliknya, ruang nama mempunyai sekumpulan nama untuk mengelakkan konflik dengan kumpulan nama lain. Untuk mengelakkan konflik lebih rendah dalam kod, mendahului setiap nama dengan nama ruang nama dan :: . Program berikut menggambarkan ini menggunakan dua ruang nama tersuai:
#sertakanmenggunakan ruang nama std;
ruang nama NA
int varInt = 6;
float flt;
ruang nama NB
int varInt = 7;
float flt;
int utama ()
cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
NA :: flt = 2.5;
NB :: flt = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
pulangan 0;
Keluarannya adalah:
67
2.5
4.8
Perhatikan bahawa nama-nama NA :: flt dan NB :: flt akhirnya ditakrifkan dalam utama () fungsi. C ++ tidak membenarkan definisi sedemikian dalam skop global.
Perhatikan bahawa ruang nama tersuai adalah ruang nama bersarang untuk ruang nama global.
Arahan penggunaan
Untuk mengelakkan mengetik "namepace :: name" sepanjang masa dan bukan hanya "name" setelah menyatakan ruang nama, anda boleh menggunakan menggunakan arahan. Sintaks untuk menggunakan menggunakan arahan adalah seperti berikut:
menggunakan ruang nama Namespace_name;The menggunakan direktif bukan arahan preprocessor, jadi berakhir dengan titik koma (;).
Program berikut menggambarkan penggunaan menggunakan arahan dan banyak lagi:
#sertakanmenggunakan ruang nama std;
ruang nama NB
int varInt = 7;
int func ()
mengembalikan varInt;
int fn ()
menggunakan ruang nama NB;
int myVar2 = func ();
// objek dan fungsi lain dari NB ikuti.
kembalikan myVar2;
int myVar3 = NB :: func ();
int utama ()
cout << fn() << " << myVar3 << '\n';
pulangan 0;
Hasil daripada program ini adalah 7 7. Istilah “menggunakan ruang nama NB;"Telah ditempatkan pada awal fn () takrif. The func () dari ruang nama NB disebut tepat di bawah itu, tanpa mendahului dengan “NB ::."
Pemboleh ubah yang dinyatakan dalam skop global (global namespace) dilihat dari sudut perisytiharan hingga akhir fail. Ia juga dilihat di ruang nama bersarang (lingkup bersarang), seperti bersarang fn () skop fungsi di atas. The menggunakan arahan bergabung dengan ruang namanya dari kedudukan di mana ia diletakkan hingga akhir ruang lingkup di mana ia diletakkan.
Nama func () dari ruang nama NB tidak dapat dilihat di bawah fn () definisi kerana “menggunakan ruang nama NB; " diletakkan dalam ruang lingkup fungsi (blok). Dalam keadaan ini, untuk menggunakan "func ()"Di luar blok ruang nama NB (ruang lingkup), ia mesti didahului oleh"NB ::,"Seperti dalam pernyataan berikut:
int myVar3 = NB :: func ();The menggunakan arahan bergabung dengan ruang namanya dengan ruang nama bersarang luar dari kedudukan di mana ia diletakkan hingga akhir ruang nama bersarang luar. Dalam program berikut, ruang nama NA digabungkan dengan ruang nama global. Kedua-dua ruang nama kemudian meluas ke fn () ruang nama definisi fungsi, di mana mereka digabungkan dengan ruang nama NB. Ruang nama NB berakhir pada akhir fn () definisi fungsi, dan dua ruang nama sebelumnya berterusan sehingga akhir fail (baca kod).
#sertakanmenggunakan ruang nama std;
ruang nama NA
int varInt = 6;
int func ()
mengembalikan varInt;
ruang nama NB
int varInt = 7;
int func ()
mengembalikan varInt;
menggunakan ruang nama NA;
int myVar0 = varInt;
// objek dan fungsi lain dari :: dan NB ikuti.
int fn ()
int myVar1 = varInt;
menggunakan ruang nama NB;
int myVar2 = NB :: func ();
// objek dan fungsi lain dari NB mengikuti, hingga akhir skop ini.
pulangkan myVar1 + myVar2;
// Hanya objek dan fungsi dari :: dan NB yang diikuti.
int myVar3 = NB :: func ();
int utama ()
cout << myVar0 << " << fn() << " << myVar3 << '\n';
pulangan 0;
Keluarannya adalah 6, 13, 7.
Nota: Ruang nama global ditunjukkan dengan :: , yang bermaksud bahawa tidak ada apa-apa sebelum pengendali resolusi skop yang mengikuti.
Di bawah pernyataan, "menggunakan ruang nama NA;Pemboleh ubah dari ruang nama global dan NA boleh digunakan tanpa menunjukkan ruang nama sumbernya. Pernyataan seterusnya menggunakan varInt ruang nama NA. Kawasan gabungan nama global dan NA meluas ke fn () ruang nama fungsi. Jadi varInt penyataan pertama di fn () skop fungsi, adalah ruang nama NA.
Oleh kerana wilayah untuk kawasan nama global dan NA meluas di seluruh fn () skop, selepas "int myVar2 = NB :: func ();,"Sebarang nama dari ruang nama NB hanya dapat digunakan di fn () ruang lingkup tanpa mendahului dengan "NB ::,"Hanya jika ia tidak berlaku di NA dan ruang nama global (blok). Jika tidak, ia harus didahului dengan "NB ::."Kawasan gabungan ruang nama untuk NA dan global terus di bawah fn () definisi dan ke dalam utama () berfungsi sehingga akhir fail.
Sambungan ruang nama NB bermula dari “int myVar2 = NB :: func ();" di dalam fn () bongkah dan berakhir di hujung fn () blok definisi.
Nota: Ruang nama yang wilayahnya bergabung tidak boleh mempunyai nama pemboleh ubah yang sama di blok ruang nama mereka yang berbeza, kerana ini masih akan menimbulkan konflik.
Kawasan Ruang Nama
Ruang nama adalah ruang lingkup. Terlepas dari ruang nama global (ruang lingkup global), ruang nama apa pun harus dinyatakan dalam blok. Blok itu adalah bahagian pertama dari kawasan ruang nama yang mungkin diedarkan. Dengan arahan penggunaan, ruang nama dapat diperluas sebagai wilayah di wilayah lain.
Entiti yang diisytiharkan dalam badan ruang nama dikatakan sebagai anggota ruang nama, dan nama yang diperkenalkan oleh deklarasi ini ke wilayah deklarasi ruang nama dikatakan sebagai nama anggota ruang nama.
Ruang Nama Bersarang
Program berikut menunjukkan ruang nama bersarang:
#sertakanmenggunakan ruang nama std;
ruang nama A
int i = 1;
ruang nama B
int i = 2;
ruang nama C
int i = 3;
int utama ()
cout << A::i << " << A::B::i << " << A::B::C::i << '\n';
pulangan 0;
Keluarannya adalah:
1 2 3Perhatikan bahawa ketiga-tiga nilai tersebut telah diakses menggunakan operator resolusi skop.
Ruang Nama Piawai
C ++ mempunyai perpustakaan yang disebut pustaka standard. Nama objek, fungsi, dan entiti lain di perpustakaan ini berasal dari ruang nama yang disebut ruang nama standard, ditulis sebagai std. Perpustakaan standard mengandungi sub-perpustakaan, dan salah satu sub-perpustakaan ini adalah iostream. The iostream perpustakaan mengandungi objek cout, yang digunakan untuk menghantar hasil ke konsol (terminal).
Nama cout mesti di std ruang nama. Untuk menggunakan iostream dengan yang std ruang nama, program ini hendaklah seperti berikut:
#sertakanmenggunakan ruang nama std;
Perhatikan penggunaan menggunakan arahan dan std. Istilah “#sertakan
Kesimpulannya
Ruang nama adalah ruang lingkup. Huraian ruang nama (definisi) mengandungi pernyataan asas dan / atau definisi objek, fungsi, dan entiti C ++ lain. Di luar definisi ruang nama, nama dapat diakses dengan sintaks, "namespaceName :: nama."Selain ruang nama global (ruang lingkup global), ruang nama apa pun harus dinyatakan dalam satu blok. Blok itu adalah bahagian pertama dari kawasan ruang nama yang mungkin diedarkan. Dengan menggunakan arahan, ruang nama dapat diperluas sebagai wilayah di ruang lingkup lain. Ruang nama yang wilayahnya bergabung tidak boleh mempunyai nama pemboleh ubah yang sama di blok ruang nama mereka yang berbeza, kerana ini masih akan menyebabkan konflik nama.
Chrys