Åžub052009

C++'da Farklı Bir Concstructor Kullanım Şekli

Yazar: Gökhan ÖZİÇ Yayınlanma Saati: 12:47
Kategori(ler): C / C++

     Object Oriented Programming ile gelen en büyük artılardan biri kuşkusuz constructor'lar. Developer'ın işini nasıl kolaylaştırdığını hepimiz biliyoruz. Ama bazen kullanım şekli itibariyle karışıklığa da sebep olabiliyor tabii.

     Bu seneki projelerimden biri olan havayolları şirketi rezervasyon programı ile uğraşırken (C++), constructor'lerin kullanımı inceliyorudm ki değişik bir kullanımını farkettim. Şimdi örnekleyerek bu kullanıma yakından göz atalım. Elimizde Test adında bir class var ve tek attribute'ü "a" diye bir integer. Methodları ise iki tane constructor ve bir "getA()" methodu. Kolay bir örnekten gitmek istedim ki anlaşılması da kolay olsun. Bu classın kullanımı şöyle olsun:

  1. #include "stdafx.h"  
  2. #include <iostream>   
  3.   
  4. using namespace std;   
  5.   
  6. class Test   
  7. {   
  8. private:   
  9.     int a;   
  10.   
  11. public:   
  12.     Test():a(0){}   
  13.     Test(int x)   
  14.     {   
  15.         a = x;   
  16.     }   
  17.     int getA()const  
  18.     {   
  19.         return a;   
  20.     }   
  21. };   
  22.   
  23.   
  24. int _tmain(int argc, _TCHAR* argv[])   
  25. {   
  26.     Test test1(4);   
  27.     Test test2;   
  28.   
  29.     cout << "The test1 and test2 objects' \"a\" variables are: " << test1.getA() << " " << test2.getA() << endl;   
  30.     return 0;   
  31. }  

     İki constructor'ımız var. Bunlardan ilki "default constructor" olan "Test():a(0){}". Test classından oluşturduğumuz objenin initial değeri verilmediyse bu constructor çalışacak ve objenin a değerini 0'a eşitleyecek. Diğeri ise oluşturulan objenin initial değeri verildiyse o değeri a ile eşitleyecek. Gayet kolay bir class. Kullanımını da main'de görebiliyoruz. İki constructor da düzgün çalışıyor. Cout kısmında output olarak 4 ve 0'ın ekrana basıldığını göreceksiniz. Şimdi aynı class'ı farklı bir constructor ile kullanalım ve yazımın ana konusu olan main'deki kullanımının nasıl değişebildiğini görelim. Bu class'ın kullanımı da şu şekilde olsun:

  1. #include "stdafx.h"  
  2. #include <iostream>   
  3.   
  4. using namespace std;   
  5.   
  6. class Test   
  7. {   
  8. private:   
  9.     int a;   
  10.   
  11. public:   
  12.     Test(int x = 0):a(x){}   
  13.     int getA() const  
  14.     {   
  15.         return a;   
  16.     }   
  17. };   
  18.   
  19. int _tmain(int argc, _TCHAR* argv[])   
  20. {   
  21.     Test test1 = 4;   
  22.     Test test2;   
  23.   
  24.     cout << "The test1 and test2 objects' \"a\" variables are: " << test1.getA() << " " << test2.getA() << endl;   
  25.     return 0;   
  26. }  

     Bu örnekte ise default constructor ile parameter contructor'ı birleştirdim. "Test(int x = 0):a(x){}" satırı şöyle açıklanabilir. Eğer Test classından bir obje oluşturulmuş ve initial değeri gönderilmediyse methodun parametresini sıfır kabul et (int x = 0 satırından bahsediyorum) ve bunu da objenin a değerine eşitle. Eğer initial değeri verilmişse de o değeri parametre olarak x'e gönder ve x ile a değerini eşitle. Buraya kadar herşey normal. Şimdi dikkatinizi main'deki "Test test1 = 4;" satırına çekmek istiyorum. İşte yazımın ana konusu bu satır. Bu satır şu anda hatasız çalışıyor ve hepinizin de tahmin edebileceği gibi test1 objesinin a değerini 4'e eşitliyor. Peki bunu nasıl yapıyor?

     Constructor'a yakından bakarsak aslında biz bu şekilde bir initialization'ı zaten tanımlamış olduk. "Test(int x = 0):a(x){}" satırında gördüğünüz gibi x = 0 ibaresi zaten objenin bu şekilde tanımlanabilir olmasının compiler'a bildirilmesi anlamına geliyor. Yani artık obje = int komutu (bizim Test classımız için), x = 0 komutu sayesinde doğru oluyor. Çünkü biz, "Test(int x = 0):a(x){}" komutu ile objenin birşeye eşitlenebileceğini compiler'a söylemiş oluyoruz. Compiler'da bize hiçbir sorun çıkartmadan eşitlemeyi yapıyor. Cout kısmında ekrana 4 ve 0 basıldığını göreceksiniz.

     Umarım işinize yarayacak bir bilgi olmuştur. Bence çok ilginç bir constructor yaklaşımı. C++'ın ne kadar profesyonel bir dil olduğunu da gözler önüne sermesi cabası.



Etiket(ler): , ,



[KickIt] [Dzone] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

E-mail | Permalink | Trackback | Yazı RSSRSS comment feed 0 Yorumlar

Yorum ekle


 

  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading