Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
KO Developers Platformuna Hoşgeldin!
eqwa11

Class hakkinda

Önerilen Mesajlar

Bos vaktim oldukca c++ ogreniyorum

Simdi calsslarda biraz takildim kitaptan ilerliyorum
Set , get ve kurucu fonksioynu sade bir dille acikliyacak varmi acaba
Birde explicit kurucu fonksiyonunu ekleyince isler karisiyor sade bi sekilde anlata bilcek varmi
Simdiden tesekkurler

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

Bos vaktim oldukca c++ ogreniyorum

Simdi calsslarda biraz takildim kitaptan ilerliyorum
Set , get ve kurucu fonksioynu sade bir dille acikliyacak varmi acaba
Birde explicit kurucu fonksiyonunu ekleyince isler karisiyor sade bi sekilde anlata bilcek varmi
Simdiden tesekkurler

 


Farz edelim ki şu şekilde farazi bir class'ımız olsun.

 

 

 

 

class musteri{
public:
musteri(std::string isim, std::string soyisim, int yas){
	_isim = isim;
	_soyisim = soyisim;
	_yas = yas;
}
private:
	std::string _isim;
	std::string _soyisim;
	int _yas;	
};

 



3 adet private, yani dışarıdan erişilemez değişkene sahip (_isim, _soyisim, _yas). Bu değişkenleri private yapmamızın sebebi, encapsulation, yani kapsülleme'dir. Sınıfın kendi içerisinde kullanacağı, dışarıdan kontrolsüz müdahale edilmesini istemediğimiz değişkenleri bu şekilde private olarak tanımlarız. Fakat biz, bu değişkenlere kısmi olarak erişim sağlamak isteyebiliriz, örneğin dışarıdan okunabilmesini, fakat değiştirilememesini isteyebiliriz. Değişkenimizi public yaparsak, hem okumaya hem yazmaya müsade etmiş oluruz, private yaparsak da dışarıdan okumayı da yazmayı da engellemiş oluruz. Get ve set methodları tam bu noktada devreye giriyor. _isim, _soyisim, _yas değişkenlerine sadece okuma erişimi sağlamak istiyorsak;

 

 

 

 

class musteri{
public:
musteri(std::string isim, std::string soyisim, int yas){
	_isim = isim;
	_soyisim = soyisim;
	_yas = yas;
}


	std::string & getIsim() { return _isim; }
	std::string & getSoyisim(){ return _soyisim;}
	int getYas() { return _yas;}
 private:
	std::string _isim;
	std::string _soyisim;
	int _yas;	
};

 



public olarak 3 tane yeni fonksiyon tanımladık. Bu fonksiyonlar, private olan değişkenlerin değerlerini döndürüyor. Bu sayede ben müşteri sınıfından bir obje yarattığımda;

 

 

 

 

int main(void){
musteri ahmet("ahmet", "zurnaoglu", 45);

printf("musteri : %s, %s, %d
", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.
// ekrana musteri : ahmet zurnaoglu 45 yazar.


ahmet._isim = "mehmett"; // derlenmez, değişken private.
std::string si = ahmet._soyisim; // derlenmez, değişken private.
}

 



Aynı mantık ile, set fonksiyonları da, private olan değişkenleri dışarıdan değiştirebilmemize olanak tanıyor, ve ayrıca atanacak olan değerlere göre işlem yapabilmemize de olanak sağlıyor. Örneğin, müşteri'nin yaş değeri minimum 18, maksimum 70 olsun istiyoruz. Başka bir değer atanamasın istiyoruz. Veya, müşteri adı mehmet olamasın istiyoruz. O halde şu şekilde bir set methodu yazabiliriz;

 

 

 

 

class musteri{
public:
musteri(std::string isim, std::string soyisim, int yas){
	_isim = isim;
	_soyisim = soyisim;
	_yas = yas;
}

        bool setIsim(std::string deger){
        if(deger.compare("mehmet") == 0)
        	return false;
        _isim = deger;
        return true;
        }


        bool setYas(int deger) {
        if(deger < 18 || deger > 70)
            return false;
         _yas = deger;
         return true;
        }
	std::string & getIsim() { return _isim; }
	std::string & getSoyisim(){ return _soyisim;}
	int getYas() { return _yas;}
 private:
	std::string _isim;
	std::string _soyisim;
	int _yas;	
};

 



Örneklendirecek olursak;

 

 

 

 

 

 

int main(void){
musteri ahmet("ahmet", "zurnaoglu", 45);

printf("musteri : %s, %s, %d
", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.
// ekrana musteri : ahmet zurnaoglu 45 yazar.

ahmet.setIsim("mehmet");
ahmet.setYas(71);
printf("musteri : %s, %s, %d
", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.
// ekrana musteri : ahmet zurnaoglu 45 yazar.

ahmet.setIsim("fevzi");
ahmet.setYas(55);

printf("musteri : %s, %s, %d
", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.
// ekrana musteri : fevzi zurnaoglu 55 yazar.

}

 

 



Son olarak, 'explicit' mevzusuna gelelim. Elimizde şöyle bir sınıf olduğunu varsayalım;

 

 

 

 

 

class deneme {
public:
    deneme(int n); 
    deneme(const char *p); 
};

 



İlk yaratıcı fonksiyon, deneme objesi için n kadar yer ayırmaya yarıyor, 2. yaratıcı fonksiyon ise deneme objesini p değeri ile hazırlıyor.

 

 

 

 

int main(void){
deneme z = 'c';
}

 



Yukarıdaki kod bloğunda amacımız 2. yaratıcı fonksiyonu çağırıp objeye 'c' değerini atamak. Fakat derleyici, girmiş olduğumuz char değerini derleme esnasında int'e implicit olarak cast ederek 1. yaratıcı fonksiyonu çağırır. Böyle durumları engellemek adına, derleyicinin 1. yaratıcı fonksiyonu için cast etmemesini sağlamak için;

 

 

 

 

class deneme {
public:
    explicit deneme(int n); 
    deneme(const char *p); 
};

 



'explicit' etiketini ekliyoruz. Bu sayede derleyiciye : 'bu yaratıcı fonksiyon yalnızca ve yalnızca int alabilir. int'e dönüşebilecek türleri, otomatik olarak dönüştürme.' demiş oluruz. Yukarıdaki örneği tekrarlayacak olursak, bu sefer 2. yaratıcı fonksiyonun çağrıldığını gözlemleyebiliriz.


Umarım yardımcı olabilmişimdir, kolay gelsin.

 

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

Farz edelim ki şu şekilde farazi bir class'ımız olsun.
 


class musteri{

public:

musteri(std::string isim, std::string soyisim, int yas){

	_isim = isim;

	_soyisim = soyisim;

	_yas = yas;

}

private:

	std::string _isim;

	std::string _soyisim;

	int _yas;	

};

 


3 adet private, yani dışarıdan erişilemez değişkene sahip (_isim, _soyisim, _yas). Bu değişkenleri private yapmamızın sebebi, encapsulation, yani kapsülleme'dir. Sınıfın kendi içerisinde kullanacağı, dışarıdan kontrolsüz müdahale edilmesini istemediğimiz değişkenleri bu şekilde private olarak tanımlarız. Fakat biz, bu değişkenlere kısmi olarak erişim sağlamak isteyebiliriz, örneğin dışarıdan okunabilmesini, fakat değiştirilememesini isteyebiliriz. Değişkenimizi public yaparsak, hem okumaya hem yazmaya müsade etmiş oluruz, private yaparsak da dışarıdan okumayı da yazmayı da engellemiş oluruz. Get ve set methodları tam bu noktada devreye giriyor. _isim, _soyisim, _yas değişkenlerine sadece okuma erişimi sağlamak istiyorsak;

 

 

 

 


class musteri{

public:

musteri(std::string isim, std::string soyisim, int yas){

	_isim = isim;

	_soyisim = soyisim;

	_yas = yas;

}





	std::string & getIsim() { return _isim; }

	std::string & getSoyisim(){ return _soyisim;}

	int getYas() { return _yas;}

 private:

	std::string _isim;

	std::string _soyisim;

	int _yas;	

};



 



public olarak 3 tane yeni fonksiyon tanımladık. Bu fonksiyonlar, private olan değişkenlerin değerlerini döndürüyor. Bu sayede ben müşteri sınıfından bir obje yarattığımda;

 

 

 

 


int main(void){

musteri ahmet("ahmet", "zurnaoglu", 45);



printf("musteri : %s, %s, %d
", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.

// ekrana musteri : ahmet zurnaoglu 45 yazar.





ahmet._isim = "mehmett"; // derlenmez, değişken private.

std::string si = ahmet._soyisim; // derlenmez, değişken private.

}



 



Aynı mantık ile, set fonksiyonları da, private olan değişkenleri dışarıdan değiştirebilmemize olanak tanıyor, ve ayrıca atanacak olan değerlere göre işlem yapabilmemize de olanak sağlıyor. Örneğin, müşteri'nin yaş değeri minimum 18, maksimum 70 olsun istiyoruz. Başka bir değer atanamasın istiyoruz. Veya, müşteri adı mehmet olamasın istiyoruz. O halde şu şekilde bir set methodu yazabiliriz;

 

 

 

 


class musteri{

public:

musteri(std::string isim, std::string soyisim, int yas){

	_isim = isim;

	_soyisim = soyisim;

	_yas = yas;

}



        bool setIsim(std::string deger){

        if(deger.compare("mehmet") == 0)

        	return false;

        _isim = deger;

        return true;

        }





        bool setYas(int deger) {

        if(deger < 18 || deger > 70)

            return false;

         _yas = deger;

         return true;

        }

	std::string & getIsim() { return _isim; }

	std::string & getSoyisim(){ return _soyisim;}

	int getYas() { return _yas;}

 private:

	std::string _isim;

	std::string _soyisim;

	int _yas;	

};



 



Örneklendirecek olursak;

 

 

 

 

 

 


int main(void){

musteri ahmet("ahmet", "zurnaoglu", 45);



printf("musteri : %s, %s, %d
", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.

// ekrana musteri : ahmet zurnaoglu 45 yazar.



ahmet.setIsim("mehmet");

ahmet.setYas(71);

printf("musteri : %s, %s, %d
", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.

// ekrana musteri : ahmet zurnaoglu 45 yazar.



ahmet.setIsim("fevzi");

ahmet.setYas(55);



printf("musteri : %s, %s, %d
", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.

// ekrana musteri : fevzi zurnaoglu 55 yazar.



}



 

 



Son olarak, 'explicit' mevzusuna gelelim. Elimizde şöyle bir sınıf olduğunu varsayalım;

 

 

 

 

 


class deneme {

public:

    deneme(int n); 

    deneme(const char *p); 

};

 



İlk yaratıcı fonksiyon, deneme objesi için n kadar yer ayırmaya yarıyor, 2. yaratıcı fonksiyon ise deneme objesini p değeri ile hazırlıyor.

 

 

 

 


int main(void){

deneme z = 'c';

}

 



Yukarıdaki kod bloğunda amacımız 2. yaratıcı fonksiyonu çağırıp objeye 'c' değerini atamak. Fakat derleyici, girmiş olduğumuz char değerini derleme esnasında int'e implicit olarak cast ederek 1. yaratıcı fonksiyonu çağırır. Böyle durumları engellemek adına, derleyicinin 1. yaratıcı fonksiyonu için cast etmemesini sağlamak için;

 

 

 

 


class deneme {

public:

    explicit deneme(int n); 

    deneme(const char *p); 

};

 



'explicit' etiketini ekliyoruz. Bu sayede derleyiciye : 'bu yaratıcı fonksiyon yalnızca ve yalnızca int alabilir. int'e dönüşebilecek türleri, otomatik olarak dönüştürme.' demiş oluruz. Yukarıdaki örneği tekrarlayacak olursak, bu sefer 2. yaratıcı fonksiyonun çağrıldığını gözlemleyebiliriz.


Umarım yardımcı olabilmişimdir, kolay gelsin.

 

 


explicit keywordunu bilmiyordum 🙂 Teşekkürler

 

İletiyi paylaş


Link to post
Sitelerde Paylaş

×
×
  • Yeni Oluştur...