Davut KARA

Bilişim Sistemleri Mühendisi

Bu blog, 5 yıl önce, bilişim ve diğer konularda hakkında, makalelerime yer vermek amacı ile açılmıştır.

Compe 225 | C++ Ders 3 – Namespace Nedir ?

C++ Banner(classların kardeşi namespace ler by dkara)

Namespace Nedir ? Namespace i class lara benzetebiliriz tek farkı , class gibi içinde “fonksiyon üstünde tanımlanan“ değişkeni  ve public private olayının olmaması, içinde sadece yalnızlık çeken fonksiyonlar var.

Namespace yaratma

// namespace "namespace_adı" {}
namespace DegisikIslem {
	// Fonksiyonu tanımla
	int farkininKaresi (int a,int b){
		int fark = a-b;
		return (fark*fark);
	}
}

Şimdi classı öğrendiğimiz için bunu daha rahat anlayacağız, class ın ilkel hali gibi düşünebiliriz. Şimdi bu namespacein içindeki fonksiyona erişmeye çalışırsak, önce hatırlayalım..

“Class dada bahsettiğim gibi eğer bir şeyin içine başka bir şeyler yazıp bir tanım içinde tanım yapıyorsak yine bir şekilde içeri doğru erişim sağlamamız gerekir, classda bir obje adı belirliyorduk sonra içindeki fonksiyona erişiyorduk yani obje.fonkisyon şeklindeydi  -e o zaman bu bir obje değil bu bir namespace peki fonksiyona nasıl erişim sağlayacağız ?”

Burda ise nokta yerine 4-dot dediğimiz 2 tane yan yana iki nokta  bağlama operatörünü kullanacağız yani Objeye gerek yok direk namespace_adı::fonksiyon(); yazıyoruz.

Mainde örnek kullanım.

int main(void){
        printf("%d",DegisikIslem::farkininKaresi(5,3));
	return 0;
}
/*Output : 4*/

Şimdi gelelim bu çağırma yönteminin kısasına. Namespace ler için şöyle bir şey yapabiliyoruz “compilera sen bu namespace in içindeki fonksiyonları ezberle bro ben sürekli 4-dot yapmayım .” demek için bir komutumuz var o da çok basit.

using  namespace  namespace_adi;            Yani bunu mainden önce eklersek artık

namespace_adı::bla bla yazmamıza gerek kalmıycak farkininKaresi(5,3); kullanmak yetecek.

Şimdi böyle yapınca da normal fonksiyondan bir farkı olmadı gibi bir şey ama şöyle düşünebilirsiniz mesela bildiğiniz üzere printf adında bir fonksiyon zaten var biz aynı adı kullanarak bir fonksiyon yazamayız çünkü çakışma olur ama onun yerine namespace yapar içine printf adında 2. Bir fonksiyon eklersek ve onuda çakışma olmasın diye using namespace le kullanamayız ama 4-dot ile aynı isimde kullanabiliriz hadi her şeyi bir kodda özetleyim.

#include <iostream>
namespace benimfonksiyonum{
	char printf(){
		return ‘F’;
	}
}

namespace genelolsun{
	int bana1ver(){
		return 1;
	}
	int bana2ver(){
		return 2;
	}
}

using namespace genelolsun;

int main(void){
	printf("Bu genel tanımlı printf fonksiyonu \n");
	benimfonksiyonum::printf();  // F döndürdü çünkü printf -,-
	bana1ver();  // 1 döndürdü 4-dot kullanmadık çünkü using namespace genelolsun dedik.
	bana2ver();  // Yukardakiyle aynı şekilde.
}

/*Outputa gerek yok bakarsan görürsün.*/

Bence açıklayıcı oldu, bir avantajı varmı dersiniz tam çözemedim ama şunu görebiliyoruz ki genel olsun namespace i 2 fonksiyon içine alabiliyor yani fonksiyonları gruplandırma gibi bir şey olabilir. Ama ilerde kullanacağımız cout cin gibi genel fonksiyonlar bu şekilde yazılmıştır. Bilginize yani her ne kadar namespace yaratma kısmı işimize yaramasa da namespace kullanma kısmı işimize yarıyacak çünkü hazıra konacağız bundan iyisi yok!