Namespace’i bir küme gibi düşünebiliriz. Kullandığımız değişkenleri, fonksiyonları, sınıfları vb. gruplamamızı sağlar ve aynı isme sahip olan değişken/fonksiyon/sınıflar çakışmasını önler.
Bu sayede aynı ismi taşıyan öğeler, farklı namespace'ler içinde birbirinden bağımsız olabilirler.
//Örnek bir namespace tanımı
namespace Template_1{
int a = 5;
int b = 7;
int topla(int, int);
/* Eğer burada aşağıda ki gibi tanımlarsak "inline/macro function" olarak geçicektir.
(Bir sürü yerde kullanıcaksak eğer hızlı çalışacaktır ancak execute dosya boyutu
yükselecektir.)
[inline/macro function ne olduğunu bilmiyorsanız 2dk da aratarak hızlıca öğrenebilirisniz]
**int topla(int x, int y)**{
return x+y;
}*/
}
namespace Template_2{
int a = 10;
int b = 20;
int topla(int, int);
}
Burada gördüğünüz örnekte 2 tane namespace oluşturduk. İki aynı değişkene sahipler ve aynı zamanda bir aynı isme sahip foksiyonları var. Çalışma sırasında bir birlerini etkilemezler veya çakışmazlar.
Bu ne için kullanılır?
Bunu nasıl çözebiliriz?
//Namespace içinde ki fonksiyonları Scope dışında tanımlama.
int Template_1::topla(int x, int y){
return x + y;
}
int Template_1::topla(int x, int y){
return x + y;
}
Burada kural şu şekilde işliyor
Geriye_Dönüş_Tipi Ait_Olduğu_Namespace_Adı::Fonksiyon_İsmi(Parametreler)
Şimdi fonksiyon tanımlamayı biliyorsunuz ancak C++’da ki “::” bu arkadaş ne işe yarıyor?
//Örnek bir main yazalım ve daha iyi anlayalım.
int main(){
Template_1::a = 42; // yukarıda atadağım değerleri main üzerinde değiştirmiş oldum
Template_1::b = 42;
// Template_1 isim alanındaki değişkenlere ve fonksiyona erişim
std::cout << "Template_1::a + Template_1::b = " << Template_1::topla(Template_1::a, Template_1::b) << std::endl;
// Template_2 isim alanındaki değişkenlere ve fonksiyona erişim
std::cout << "Template_2::a + Template_2::b = " << Template_2::topla(Template_2::a, Template_2::b) << std::endl;
// Farklı namespaceler üzerindeki değişkenleride toplayabiliriz.
std::cout << "Template_1::a + Template_2::b = " << Template_2::topla(Template_1::a, Template_2::b) << std::endl;
// Ben burada Template_2'ye ait olan bir toplama işlemini kullandım ancak siz isterseniz 1'i kullanabilirsiniz.
// Sonuç olarak ikisde aynı işlemi yapcak sonuç değişmeyecek.
}