Ruang nama C++


Seandainya ada situasi apabila terdapat dua pelajar bernama Zara dalam satu kelas untuk membezakan mereka dengan jelas, selain menggunakan nama mereka, kita perlu menggunakan beberapa maklumat tambahan, seperti alamat keluarga mereka , atau nama ibu bapa mereka, dsb.

Situasi yang sama berlaku dalam aplikasi C++. Sebagai contoh, anda mungkin menulis fungsi yang dipanggil xyz() dan fungsi yang sama xyz() wujud dalam perpustakaan lain yang tersedia. Dengan cara ini pengkompil tidak dapat memberitahu fungsi xyz() yang anda gunakan.

Oleh itu, konsep ruang nama diperkenalkan khusus untuk menyelesaikan masalah di atas Ia boleh digunakan sebagai maklumat tambahan untuk membezakan fungsi, kelas, pembolehubah, dll dengan nama yang sama dalam berbeza. perpustakaan. Menggunakan ruang nama mentakrifkan konteks. Pada asasnya, ruang nama mentakrifkan skop.

Tentukan ruang nama

Ruang nama ditakrifkan menggunakan kata kunci ruang nama, diikuti dengan nama ruang nama, seperti berikut:

namespace namespace_name {
   // 代码声明
}

Dalam susunan untuk memanggil dengan Fungsi atau pembolehubah dengan ruang nama perlu didahului dengan nama ruang nama, seperti yang ditunjukkan di bawah:

name::code;  // code 可以是变量或函数

Mari kita lihat bagaimana ruang nama mentakrifkan skop untuk entiti seperti pembolehubah atau fungsi:

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
int main ()
{
 
   // 调用第一个命名空间中的函数
   first_space::func();
   
   // 调用第二个命名空间中的函数
   second_space::func(); 

   return 0;
}

Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:

Inside first_space
Inside second_space

menggunakan arahan

Anda boleh menggunakan arahan menggunakan ruang nama, supaya apabila menggunakan Apabila menggunakan ruang nama, anda tidak perlu menambah nama ruang nama di hadapan. Arahan ini memberitahu pengkompil bahawa kod berikutnya akan menggunakan nama dalam ruang nama yang ditentukan.

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
using namespace first_space;
int main ()
{
 
   // 调用第一个命名空间中的函数
   func();
   
   return 0;
}

Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:

Inside first_space

Arahan penggunaan juga boleh digunakan untuk menentukan item tertentu dalam ruang nama. Sebagai contoh, jika anda hanya bercadang untuk menggunakan bahagian cout ruang nama std, anda boleh menggunakan pernyataan berikut:

using std::cout;

Dalam kod berikutnya, anda tidak perlu memberi awalan nama ruang nama apabila menggunakan cout, tetapi std Item lain dalam ruang nama masih perlu diawali dengan nama ruang nama, seperti ini:

#include <iostream>
using std::cout;

int main ()
{
 
   cout << "std::endl is used with std!" << std::endl;
   
   return 0;
}

Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut: Nama yang diperkenalkan oleh arahan

std::endl is used with std!

menggunakan mengikut peraturan skop biasa. Nama itu boleh dilihat bermula dengan arahan menggunakan sehingga penghujung skop. Pada masa ini, entiti dengan nama yang sama ditakrifkan di luar skop disembunyikan.

Ruang nama tak selanjar

Ruang nama boleh ditakrifkan dalam beberapa bahagian berbeza, jadi ruang nama terdiri daripada beberapa bahagian yang ditakrifkan secara berasingan. Pelbagai komponen ruang nama boleh disebarkan merentasi berbilang fail.

Jadi, jika sesetengah komponen ruang nama perlu meminta nama yang ditakrifkan dalam fail lain, nama itu masih perlu diisytiharkan. Takrif ruang nama berikut boleh mentakrifkan ruang nama baharu atau menambah elemen baharu pada ruang nama sedia ada:

namespace namespace_name {
   // 代码声明
}

Ruang nama bersarang

Ruang nama boleh dijadikan set bersarang, anda boleh menentukan satu ruang nama dalam ruang nama lain seperti ini:

namespace namespace_name1 {
   // 代码声明
   namespace namespace_name2 {
      // 代码声明
   }
}

Anda boleh mengakses ahli dalam ruang nama bersarang dengan menggunakan :: operator:

// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;

// 访问 namespace:name1 中的成员
using namespace namespace_name1;

Dalam pernyataan di atas, jika namespace_name1 digunakan, maka dalam skop namespace_name2 Elemen juga tersedia seperti berikut:

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
   // 第二个命名空间
   namespace second_space{
      void func(){
         cout << "Inside second_space" << endl;
      }
   }
}
using namespace first_space::second_space;
int main ()
{
 
   // 调用第二个命名空间中的函数
   func();
   
   return 0;
}

Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:

Inside second_space