Namespace nedir?

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.
}