Subject : C++ Author : pOiSOn Email : poisone@usa.net Irc : irc.ada.net.tr / #scene.tr #manowar #atheist ICQ : 6795916 LastUpdate : 30 mart 99 Note : DOS hicbir zaman olmez! (bir kedim bile yokkk..!) what is cpp ?? cpp c diline gore daha esnek ve kullanimi kolay bir c kademesi.. en onemli ozelligi kalitsal olmasi yani c dilinde yapilmasi cok zor hatta imkansiz olaylari yapabilirsiniz..mesela c++ sayesinde normalde c icin gecersiz olan soyle satirlari yazabilirsiniz.. MyStr * String1; MyStr * String2; String1 = "direk" String2 = "atama" String1 = String1 + String2; yukardaki ekleme satiri c icin gecersiz bir satir fakat cpp uzerinde bunu yapmak cok kolay.. nasi ? cpp'nin temelinde struct lar ve class lar vardir...mesela.. class TPoint { int XPos,YPos; } die bir sey tanimlarsak bu iki kordinati olan bir pointtir.. bundan bir dikdortgen turetmek istersek.. class TRectangle(TPoint) { int XLen,YLen; } artik TRectangle TPoint'in ozelliklerini ve yeni tanimlari tasiyan bir objedir.. yani class TRectangle hebele; die tanimladiginiz bi obje'de hebele.XPos adinda , TPoint class'inden gelen bir degiskeniniz olur. pekala structlar ve class'lar arasindaki fark nedir ?.. func. tanimlari die tahmin ediyorsaniz yaniliyorsunuz..cpp altinda structlara func. tanimlamak mumkun..fark : structlar'dan yeni structlar uretmek mumkun degil.. bir kac ekleme yaparsak... class TRectangle(TPoint) { int XLen,YLen; int BorderColor; int Color; void Draw(unsigned char * page); } denilerek basitce bir dikdortgeni tanimlamis oluruz..veya bir cember tanimlarsak... class TCircle(TPoint) { int Cap; int BorderColor; int Color; void Draw(unsigned char * page); void Move(int NewX,int NewY); } ek olarak sinif ilk olarak tanimlandiginda yapilmasini istediginiz bazi isler var ise constructor ve destructor func. larini kullanabilirsiniz.. class TCircle(TPoint) { int Cap; int BorderColor; int Color; void Draw(unsigned char * page); void Move(int NewX,int NewY); TCircle(); // constructor ~TCircle(); // destructor } TCircle::TCircle() { // sinif ilk olarak yaratildi // daire yaratildiginda yapilacak isler, yeri cerceve kalinligi etc.. // falan filan.. } TCircle::~TCircle() { // sinif hafizadan atiliyor yani siliniyor.. // hepimiz olucezzzz!!.. } constructor func. bu sekilde tanimlandiktan sonra sinif hafiyaza yuklendikten sonra constructor, hafizadan silinmeden once destructor cagrilir.. unutmadan ayni sekilde TPoint icin constructor ve destructor yazilabilir.. peki TPoint gibi bir alt sinif icinde yazilan func. ile ayni adda TCircle altinda bir func. tanimlarsak ne olur ? bu durumda TPoint icinde tanimlanan func.'u "virtual" olarak belirtmeniz gerekli.. peki hangi hangi func. turetilen siniflarda ad tekrari olmaya cagindan emin olabilirsiniz desem ?.. bundan emin olmak gerekmiyor saece ad tekrari olan func. virtual olarak tanimlayin.. fakat bunun olcusunu kacirmayin cunku virtual tanimlari compilerlar tarafindan sevilmeyen bir terim :).. akla gelen bi soru daha var.. ben TCircle objesinden 40 tane tanimlarsam TCircle objesi icinde gecen func. hafizada 40 kez mi gececek?.. tabiki hayir compilerlar bunun icin V tablolari (ne gusel ad demi ?) kullanirlar.. yani siz 40 sinif tanimladiginizda 40 sinif'in sadece veri bulunan alanlari hafizada bulunur func. hafizaya bir kez yuklenir.. burda biraz dusunursek, cpp aslinda c'de cok ugrasipda yapabileceginiz seyleri biraz kolaylastiriyor.. (ama ben halen sevmem o ayri :)) NOT: size tavsiye bu tur tanimlamalari .hpp adinda kaydedin ve .cpp dosyasina asil kodlari yazin boylece kodlama icin daha rahat bir ortam olur burda ogrenilmesi gereken bi konu var. bi cok acemi coder tum c dosyalarini include eder ve her defada derler. bunu kolaylastirmamiz lazim.. nasil mi ?.. her sinifiniz icin class, struct tanimlamalarinizi hpp dosyasinda yapin, kod kisimlarini cpp dosyasina atin. birazda makefile dosyasi ile ugrastiktan sonra yan cpp dosyalari sadece gerektiginde (yani siz biseyler deistirdiginizde) derlenecektir. boylece compiler her defada bi suru kodu derlemekten kurtulacaktir. peki cpp dosyasi icindeki bir deiskeni ana programda kullanmak isterseniz ne yapabilirsiniz ? bu tur disardan erisilmesi ihtimal deiskenleri hpp dosyasi icinde extern olarak tanimlayin, ana program boyle bir deisken oldugunu varsayip hata vermeyecektir. (eger deiskeni herhangi bi obj dosya icinde bulamaz ise link'leme sirasinda hata verir) ben illa hepsini derliyecem die tutturuyosaniz bi sebep daha soyleyim, kucuk kodlari derlemek derleyiciler icin kolaydir fakat koca bi c dosyasini derlemeye kalkismak minicik derleyici bug'lara neden olabilir..ve siz nedenini asla bulamazsiniz..gelin vazgecin :) bakiniz boyle yapcaksiniz.. ---- CIRCLE.HPP ---- class TCircle(TPoint) { int Cap; int BorderColor; int Color; void Draw(unsigned char * page); void Move(int NewX,int NewY); } ---- CIRCLE.CPP ---- void TCircle::Draw(unsigned char * page) { // falan filan... klasik daire cizme kodlari.. // merkez olarak Xpos ve Ypos alinmali.. } void TCircle::Move(int NewX,int NewY) { XPos = NewX; // tpoint'den alinan ozellikler... YPos = NewY; } ---- GFX.HPP --- // tanimlama dosyalari... #include "circle.hpp" // asil kod dosyalari... #include "circle.cpp" --------------- bunlar yazildiktan sonra...ana programda yapmaniz gereken tek sey... #include "GFX.HPP" TCircle Daire1; TCircle Daire2; void main() { Daire1.Cap = 10; Daire1.Move(0,100); Daire2.Cap = 20; Daire2.Move(40,150); while(Daire1.XPos > SCREEN_WIDTH) { Daire1.XPos++; Daire1.YPos++; Daire2.XPos+=2; Daire2.YPos+=2; Daire1.Draw(VGA); Daire2.Draw(VGA); } } boylece her daire icin ikinci kez kod yazmak veya bir dizi gibi tanimlamak gerekmeyecek... artik class tanimlamanin anlamini ogrendiniz.. cpp'nin diger avantajlari bundan sonra basliyor... constructor ve destructor.. diyelimki bir kisinin ismini tutan bir class yapiniz var (mesela yaw :) ) ve class yaratildiginda isim'in AHMET olmasi gerekli.. (meselaa...) bunu nasi yaparik ?.. class TIsim { char * Isim; TIsim(); ~TIsim(); }; not: ben class tanimlamalarimi yaparken onune T harfi koyuyorum.. delphi'den aliskanlik...neysem.. simdi class icinde class adi ile ayni bir fonksiyon ve class adinin onune `~` karakteri koyarak ikinci bir fonksiyon yarattik.. qod kisminda asagidaki gibi tanimliyorsunuz fonksiyonlarinizi.. char * DefaultIsim = "AHMET"; // constructor.. TIsim::TIsim(); { // burasi class yaratildiginca calistirilir.. Isim = (char *) malloc(sizeof(DefaultIsim)); strcpy(Isim,DefaultIsim); }; // destructor.. TIsim::~TIsim(); { // burasi class silindiginde calistirilir.. free(Isim); }; eger kafaniz iyi calisiyor ise bunun ne demek oldugu hakkinda fikirleriniz vardir.. yoksa uzulmeyin hayat bu.. evet.. gelelim cpp'nin guzel taraflarindan birine daha.. overload.. overload bir fonksiyonu cagirmanin bi kac yolu denilebilir.. nasil mi ?.. print("merhaba","dunya",4); //salliyom :) print(5000); print("merhaba dunya..merhaba hayat..\n") simdi.. burda ayni fonksiyonu uc gez farkli sekillerde cagirdik.. bu nasil olabilir ?.. cozum basit ayni fonksiyonlar degiller.. tanimlamalari asagidaki gibi.. print(char * str1,char * str2,int count); print(int count); print(char * str1); seklinde uc adet fonksiyondu.. cpp buna izin verir ve yazdiginiz parametrelere gore hangi fonksiyonu cagirmak isteginizi bilir.. bu ozelligi constructor ve destructor fonksiyonlarinda da kullanmak mumkun..