eqwa11 1 #1 Oluşturuldu: Haziran 3, 2018 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 Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
PENTAGRAM 926 #2 Haziran 3, 2018 tarihinde gönderildi 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. 4 Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
cryofsky 0 #3 Haziran 3, 2018 tarihinde gönderildi Pentagram Sen mükemmel bir ayrıntısın çok sağol Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
infiltrate 42 #4 Haziran 3, 2018 tarihinde gönderildi 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 Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
PENTAGRAM 926 #5 Haziran 3, 2018 tarihinde gönderildi @ infiltrate, @ cryofsky rica ederim arkadaşlar. merak ettiğiniz daha farklı şeyler varsa, alakalı foruma konu açıp beni etiketlerseniz müsait olduğumda cevaplandırmaya çalışırım. iyi forumlar. 1 Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
OzkanOzdemir 1.560 Admin #6 Haziran 3, 2018 tarihinde gönderildi @ PENTAGRAM sakız çiğnemek orucu bozar mı? Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
PENTAGRAM 926 #7 Haziran 3, 2018 tarihinde gönderildi Alıntı @ PENTAGRAM sakız çiğnemek orucu bozar mı? alakasız foruma sorduğun için :banned: Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
BySeLo 1 #8 Haziran 3, 2018 tarihinde gönderildi Bu forumu seviyorum �������� Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
eqwa11 1 #9 Konu Sahibi Haziran 3, 2018 tarihinde gönderildi Alıntı@ PENTAGRAM sakız çiğnemek orucu bozar mı?ben henüz o konuya gelmedim-- mesaja ek olarak --gercekten cok acıklayıcı oldu daha ilk satırda kafamda bi yol oluştu eyw Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
sanderolar 1 #10 Haziran 3, 2018 tarihinde gönderildi eywallah Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş