07 OCAK 2018
PAZAR
12.59
OOP
C++ ile OOP - Structures (Yapılar)

Yapı (Structure) Nedir?

Yapılar birçok özellik bakımından sınıflara benzemektedirler. Fakat verilerin tutuldukları alanlar birbirinden ayrılır ve en önemli farkları da budur. Yapılar stack (yığın) alanında tutulurken sınıflar heap (öbek) alanında tutulur. Bu sebep ile yapılar belli büyüklükteki verileri tutabilir. Çünkü stack alanı çok sınırlı bir veri alanıdır. Büyük veriler stack alanına yüklenmeye çalışıldığında stack overflow olarak adlandırılan yığın taşması meydana gelir.

Yapı kullanımı sınıf kullanımına göre erişim hızı bakımından yüksek ve daha az maliyetlidir.

Struct Kullanımı

struct ADI{
	...
};

Yukarıdaki gibi bir kod bloğuna sahiptirler. Varsayılan public olarak gelirler. Normal bir veriden farklı olarak birden fazla sayıda veri depolayabilirler. Bu özellik bakımından oldukça kullanışlıdırlar.

main fonksiyonu içerisinde bir struct çağırılırken veya veri ataması yapılırken şöyle kullanılır;

ADI.DEĞİŞKENADI = DEĞER;

Elimizde şöyle bir kod yapımız olduğunu varsayalım;

struct Koordinat{
	int x;
	int y;
};

int main(){
	
	int z = 25;
	Koordinat.x = 10;
	Koordinat.y = 5;
	
}

Bu kod blogumuzda Koordinat adında oluşturulmuş bir struct gözümüze çarpıyor. Bu struct akabinde main içerisinde kullanılmış. Kullanım tarzı az önce gördüğümüz gibi bir nokta (.) ile içerisindeki değişkene erişerek ona değer atamaktan fazlası değil.

Şimdi örneğimizden yola çıkarak struct için değişkenden farklı olarak hafızada nasıl yer ayrıldığına göz atalım.

Görselde de gözüktüğü gibi normal bir değişken tek bir veriyi içerisinde tutarken Struct yapılar içerisinde oluşturulan her bir veriyi hafızada aynı yer üzerinden ulaşılabilir yapıyorlar.

Struct Kullanımında Erişim Belirteçleri

Struct oluşturulurken de private ve public erişim belirteçlerini kullanabiliyoruz. Yani struct içerisinde yer alan bir değişkeni private oluşturarak dışardan erişimine izin vermeyebiliriz. Şu örneklerimize göz atalım;

Public

Struct içerisinde oluşturulan her değişken varsayılan olarak public gelir. Bunu daha önce belirtmiştik. Kullanımlarında herhangi bir farklılık yoktur ve yukarıdaki örneğimize benzer şekilde şöyle oluşturulduğunda herhangi bir problem ile karşılaşılmaz:

struct Site{
	public:
		string siteAdi;
		string siteUzantisi;
};

int main() {
	Site kisisel;
	kisisel.siteAdi = "merttopuz"; // Problem yok
	kisisel.siteUzantisi = "com"; // Problem yok
}

Private

Bilindiği üzere private erişim belirtecinin kullanıldığı değişken yalnızca içerisinde bulunduğu fonksiyonda erişilebilir olur. Bu sebeple private oluşturulan bir değişkene fonksiyon dışından erişmek (ek bir fonksiyon oluşturulmadığı sürece - ki bahsedeceğiz -) mümkün değildir. Şimdi aşağıdaki kodu inceleyelim:

struct Site{
	public:
		string siteAdi;
	private:
		string siteUzantisi;
};

int main() {
	Site kisisel;
	kisisel.siteAdi = "merttopuz"; // Problem yok
	kisisel.siteUzantisi = "com"; // Problem var! (Site::siteUzantisi -> PRIVATE)
}

Örneğimizde siteUzantisi'na ulaşamamaktayız. Bu sebeple hata mesajı alacaktık.

(Bu konu ile ilgili yakında bilgilendirme makalesi eklenecektir ve eklendiğinde bu alan güncellenecektir. Takipte kalın.)

Struct ile Metotların Kullanımları (Fonksiyonlar)

Bir fonksiyonu struct içerisinde oluşturabiliriz. Bu sayede oluşturulan metotlar (fonksiyonlar) ile dilediğimiz bir işlemi yaptırabiliriz.

Metot Oluşturmak

struct Koordinat{
	int x;
	int y;
	
	void merkez(){
		x = 0;
		y = 0;
	}
};

int main() {
	Koordinat A;
	A.x = 5; // x=5 oldu
	cout << A.x; // Ekrana 5 değeri yazdırılır.
	A.merkez(); // Fonksiyonu çağırdık, x=0 ve y=0
	cout << A.x; // Ekrana 0 değeri yazdırılır.
}

Örneğimizde yanda verilen açıklama satırlarını incelersek merkez() fonksiyonumuzun x ve y değerlerini bundan sonrası için 0'a çektiğini görüyoruz.

Eğer biz metot oluşturmadan hemen önce private olarak belirleseydik bu kez aynı değişkenlerde yaşadığımız gibi fonksiyonumuza erişemeyecektik:

struct Koordinat{
	public:
		int x;
		int y;
	private:
		void merkez(){
			x = 0;
			y = 0;
		}
};

int main() {
	Koordinat A;
	A.x = 5;
	cout << A.x;
	A.merkez(); // Problem var! (Koordinat::merkez() -> PUBLIC)
	cout << A.x;
}

İç İçe Struct Kullanımı (Nested Structures)

Birden fazla struct'ı iç içe kullanabiliriz. Bir örnek üzerinden bu konuyu daha iyi anlayabiliriz.

Klasörler ve klasörlerin bilgilerini tutan 2 farklı struct oluşturalım.

struct klasorBilgisi{
	string konum;
	double boyut;
	int dosyaSayisi;
};

struct klasor{
	string AD;
	klasorBilgisi BILGI; // farklı bir struct çağırdık
};

int main(){
	klasor k1;
	k1.AD = "Makaleler";
	k1.BILGI.konum = "C:\\Users\\Mert\\Desktop";
	k1.BILGI.boyut = 10.4;
	k1.BILGI.dosyaSayisi = 16;
	
    // ekrana yazdırmak
	cout << "Klasor Adi\t\t: " << k1.AD;
	cout << "\nKlasor Konumu\t\t: " << k1.BILGI.konum;
	cout << "\nKlasor Boyutu\t\t: " << k1.BILGI.boyut;
	cout << "\nKlasor Dosya Sayisi\t: " << k1.BILGI.dosyaSayisi;
}

klasor adında oluşturduğumuz struct içine farklı bir struct olan klasorBilgisi'ni dahil ettik. Bunu yaparken main içerisinde oluşturur gibi bir ad ile oluşturduk. Bu sayede main içerisindeki kullanımında şöyle bir sıra bizleri takip etti;

k1.BILGI.konum : main.klasor.klasorBilgisi

Ekranımıza çıktı verdiğimizde ise şöyle bir sonuç bizleri bekliyor olacaktır:

YORUMLAR 0
Bu konuya henüz kimse yorum yapmadı.
İlk yorumu sen yapmak ister misin?
YORUM BIRAK
Şuanda bu yoruma cevap yazıyorsunuz:
İptal Et