C ++ 'da ad alanları

Aynı sınıfta aynı isimde iki kişi olan Zara'nın olduğu bir durumu düşünün. Onları ayırt etmemiz gerektiğinde kesinlikle isimleriyle birlikte bazı ek bilgileri kullanmak zorunda kalırız, örneğin bölge, farklı bir bölgede yaşıyorlarsa veya annelerinin veya babalarının adı vb.

C ++ uygulamalarınızda da aynı durum ortaya çıkabilir. Örneğin, xyz () adında bir işleve sahip bir kod yazıyor olabilirsiniz ve aynı işleve sahip xyz () ile aynı işleve sahip başka bir kitaplık var. Artık derleyicinin, kodunuzda hangi xyz () işlevi sürümünden bahsettiğinizi bilmesinin hiçbir yolu yoktur.

Bir namespacebu zorluğun üstesinden gelmek için tasarlanmıştır ve farklı kitaplıklarda bulunan aynı adla benzer işlevleri, sınıfları, değişkenleri vb. ayırt etmek için ek bilgi olarak kullanılır. Ad alanını kullanarak, adların tanımlandığı bağlamı tanımlayabilirsiniz. Özünde, bir ad alanı bir kapsamı tanımlar.

Bir Ad Alanı Tanımlama

Bir ad alanı tanımı anahtar kelimeyle başlar namespace ardından aşağıdaki ad alanı adı gelir -

namespace namespace_name {
   // code declarations
}

İşlevin veya değişkenin ad alanı etkinleştirilmiş sürümünü çağırmak için, ad alanı adının başına (: :) aşağıdaki gibi ekleyin -

name::code;  // code could be variable or function.

Ad alanının değişken ve işlevler dahil varlıkları nasıl kapsadığını görelim -

#include <iostream>
using namespace std;

// first name space
namespace first_space {
   void func() {
      cout << "Inside first_space" << endl;
   }
}

// second name space
namespace second_space {
   void func() {
      cout << "Inside second_space" << endl;
   }
}

int main () {
   // Calls function from first name space.
   first_space::func();
   
   // Calls function from second name space.
   second_space::func(); 

   return 0;
}

Yukarıdaki kodu derler ve çalıştırırsak, bu aşağıdaki sonucu üretir -

Inside first_space
Inside second_space

Kullanma direktifi

Ayrıca ad alanlarının önceden eklenmesini önleyebilirsiniz. using namespacedirektif. Bu yönerge, derleyiciye sonraki kodun belirtilen ad alanındaki isimleri kullandığını söyler. Ad alanı bu nedenle aşağıdaki kod için ima edilir -

#include <iostream>
using namespace std;

// first name space
namespace first_space {
   void func() {
      cout << "Inside first_space" << endl;
   }
}

// second name space
namespace second_space {
   void func() {
      cout << "Inside second_space" << endl;
   }
}

using namespace first_space;
int main () {
   // This calls function from first name space.
   func();
   
   return 0;
}

Yukarıdaki kodu derler ve çalıştırırsak, bu aşağıdaki sonucu üretir -

Inside first_space

'Using' yönergesi, bir ad alanı içindeki belirli bir öğeye başvurmak için de kullanılabilir. Örneğin, std ad alanının kullanmayı planladığınız tek parçası cout ise, ona aşağıdaki şekilde başvurabilirsiniz -

using std::cout;

Sonraki kod, ad alanının başına eklemeden cout'a başvurabilir, ancak std ad alanının yine de aşağıdaki gibi açık olması gerekecektir -

#include <iostream>
using std::cout;

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

Yukarıdaki kodu derler ve çalıştırırsak, bu aşağıdaki sonucu üretir -

std::endl is used with std!

Bir usingyönerge normal kapsam kurallarına uyar. İsim,usingdirektifin bulunduğu kapsamın sonuna kadar direktif. Bir dış kapsamda tanımlanan aynı ada sahip varlıklar gizlenir.

Bitişik Olmayan Ad Alanları

Bir ad alanı birkaç parça halinde tanımlanabilir ve bu nedenle bir ad alanı, ayrı ayrı tanımlanmış kısımlarının toplamından oluşur. Bir ad alanının ayrı bölümleri birden çok dosyaya yayılabilir.

Dolayısıyla, ad alanının bir bölümü başka bir dosyada tanımlanmış bir ad gerektiriyorsa, bu adın yine de bildirilmesi gerekir. Aşağıdaki bir ad alanı tanımının yazılması ya yeni bir ad alanını tanımlar ya da mevcut bir ad alanına yeni öğeler ekler -

namespace namespace_name {
   // code declarations
}

İç içe geçmiş ad alanları

Ad alanları, aşağıdaki gibi başka bir ad alanı içinde bir ad alanını tanımlayabileceğiniz yerde yuvalanabilir -

namespace namespace_name1 {
   // code declarations
   namespace namespace_name2 {
      // code declarations
   }
}

Aşağıdaki gibi çözüm işleçlerini kullanarak yuvalanmış ad alanı üyelerine erişebilirsiniz -

// to access members of namespace_name2
using namespace namespace_name1::namespace_name2;

// to access members of namespace:name1
using namespace namespace_name1;

Yukarıdaki ifadelerde, ad alanı_adı1 kullanıyorsanız, ad alanı_adı2 öğelerinin aşağıdaki gibi kapsamda kullanılabilir olmasını sağlayacaktır -

#include <iostream>
using namespace std;

// first name space
namespace first_space {
   void func() {
      cout << "Inside first_space" << endl;
   }
   
   // second name space
   namespace second_space {
      void func() {
         cout << "Inside second_space" << endl;
      }
   }
}

using namespace first_space::second_space;
int main () {
   // This calls function from second name space.
   func();
   
   return 0;
}

Yukarıdaki kodu derler ve çalıştırırsak, bu aşağıdaki sonucu üretir -

Inside second_space