|
Fonksiyonların ardından, C++’ın en önemli özelliklerinden biri olan, daha doğrusu C++’ı C++ yapan nesne yönelimli programlama tekniği olan OOP(Object Oriented Programming)’a geçiş yapmaya başlıyoruz. Bu dersin konusu yapılar. Yapılar “struct” sözü ile belirtilir. Basit bir yapının tanımlanışı şu şekildedir; struct yapiadi { //üye değişkenler vs. }; Yapılar genel olarak programcılar tarafından üye değişkenleri gruplamak için kullanılır. Nesnel bir yapı olarak oluşturulur. Örneğin bir dikdörtgenin iki kenarının uzunluğu ya da üç boyutlu ortamda bir noktanın koordinatlarını tutan bir yapı olabilir… Yine örnek verecek olursak; struct dikdortgen { int a; int b; }; Şeklinde yazabileceğimiz gibi şu şekilde de yazmak mümkündür; struct dikdortgen {int a;int b;}; Tabi ki okunabilirlik açısından ilk modelin kullanılması daha makuldür… Ayrıca sondaki noktalı virgüle de dikkat edin! Bunu unutursanız ecel terleri dökmeniz kaçınılmazdır :) Pekala, yapının nasıl oluşturulduğunu öğrendik. Peki ya nasıl kullanacağız? İşte şu şekilde; struct dikdortgen { int a; int b; }; dikdortgen dd1; dd1.a = 5; dd1.b = 7; Şeklinde bir tanımlama yapılıp, üye değişkenlere veri atanabileceği gibi, şu şekilde bir tanımlama da yapılabilir; dikdortgen dd1 = {5, 7}; Ardından hemen basit bir uygulama yapalım; #include <iostream> #include <string> using namespace std; struct yapiadi { string adsoyad; int yas; }; void main() { yapiadi kisi; kisi.adsoyad = "Evren Acigul"; kisi.yas = 21; cout << kisi.adsoyad << " " << kisi.yas << endl; } İşte görüldüğü gibi kullanımı bu kadar basittir. Ardından hemen yapılara işaret eden işaretçilerden bahsedelim. Yine benzer yapıyı ele alalım; #include <iostream> #include <string> using namespace std; struct kisiler { string adsoyad; int yas; }; void main() { kisiler *kisi; //kisiler yapısına işaret eden kisi adında bir işaretçi tanımladık kisiler ilkkisi; //bu da normal bir yapı nesnesi ilkkisi.adsoyad = "Evren Acigul"; ilkkisi.yas = 21; cout << ilkkisi.adsoyad << " " << ilkkisi.yas << endl; kisi = &ilkkisi; //kisi işaretçisine ilkkisi nin adresini atıyoruz kisi->adsoyad = "Hede hodo"; // nokta (.) yerine “->” işaretlerini kullandığımıza dikkat edin! kisi->yas = 18; cout << ilkkisi.adsoyad << " " << ilkkisi.yas << endl; //bilin bakalım çıktı ne olur? } Yapıların işaretçilerle kullanımı da bu kadar basittir. Sanırım çıktıyı tahmin edebilirsiniz… Aynı şekilde yapıları referans olarak da geçirebilirsiniz. Ama bu sefer “->” işaretleri yerine yine nokta(.) kullanılır. Tanımlamasına ise dikkat edin! Örneğimiz; #include <iostream> #include <string> using namespace std; struct kisiler { string adsoyad; int yas; }; void main() { kisiler ilkkisi; ilkkisi.adsoyad = "Evren Acigul"; ilkkisi.yas = 21; cout << ilkkisi.adsoyad << " " << ilkkisi.yas << endl; kisiler &kisi = ilkkisi; //referansı sadece tanımlama anında geçirebilirsiniz kisi.adsoyad = "Hede hodo"; // "->" işaretleri yerine nokta(.) kullanıldığına dikkat edin! kisi.yas = 18; cout << ilkkisi.adsoyad << " " << ilkkisi.yas << endl; //sonuç yine aynıdır } Yapılarla çalışmak aynı değişkenlerdeki gibidir. Dolayısıyla aslında kendi veri tipinizi tanımlamış olursunuz. Bir yapı, içinde barındırdığı veriler kadar geniştir. Bir yapının byte cinsinden büyüklüğünü; sizeof(yapiadi); şeklinde öğrenebilirsiniz. Üstteki “ilkkisi” yapı değişkeninin boyutu 20 byte tır. Peki, yapılar kendi ürettiğimiz bir türse, değişken gibi tanımlanıyorsa, o halde neden “Array”(dizi) şeklinde kullanılmasın? Hemen örneğimizi verelim o halde; #include <iostream> #include <string> using namespace std; struct kisiler { string adsoyad; int yas; }; void main() { kisiler kisi[2]; kisi[0].adsoyad = "Evren Acigul"; kisi[0].yas = 21; kisi[1].adsoyad = "Hede Hodo"; kisi[1].yas = 18; for(int i = 0; i < 2; i++) { cout << kisi[i].adsoyad << " " << kisi[i].yas << endl; } } Sanırım her şey kolayca anlaşılıyor. Bu dersinde sonuna gelmiş bulunuyoruz böylece. Ama belirtmeliyim ki, işaretçileri referansları dizileri anlamamışsanız bu dersteki konuları anlamanız biraz zor olacaktır. Sınıflar dersinde yapıları tekrar ele alacağız. Bu kadar olmadığını tahmin edebilirsiniz sanıyorum. İyi kodlamalar! Evren ACIGÜL
|