27 Şubat 2018 Salı

C++ Operatorlerin Aşırı Yüklenmesi

C++ Operatorlerin Aşırı Yüklenmesi (Operator Overloading)

C++’ da +,-,*,!,++ gibi operatörler fonksiyonlar yazılarak bu operatörlere yeni işlevler yüklenebilir. Fakat sadece C++’ da zaten var olan operatörlere aşırı yükleme yapılabilir.  Örneğin üs(^) operatörüne aşırı yükleme yapılamaz. Fonksiyonlar tanımlanırken operatörün orjinalinde var olan operand sayısı değiştirilemez. Yani toplama için tek operand veremezsiniz yine en az 2 operand vermeniz gerekmektedir. Ayrıca öncelik sıralamalarında bir değişiklik olmaz yine aynı şekilde öncelikleri vardır.
Aşağıdaki örnekte verilen kodlama ile + operatorü iki karmaşık sayıyı toplamak için aşırı yüklenmiştir. Programın çıktı ekranı üsttedir.
#include<iostream>
#include<conio.h>
using namespace std;
struct karmasiksayi
{
float reel,sanal;
};
karmasiksayi operator+(const karmasiksayi &v1,const karmasiksayi &v2)
{
karmasiksayi sonuc;
sonuc.reel=v1.reel+v2.reel;
sonuc.sanal=v1.sanal+v2.sanal;
return sonuc;
}
void yaz (karmasiksayi c)
{
cout<< "Reel="<<c.reel<<"  Sanal="<<c.sanal<<endl;
}
int main()
{
karmasiksayi c1,c2,c3;
c1.reel=3;
c1.sanal=-1;
c2.reel=2.5;
c2.sanal=0.7;
c3=c1+c2;//burada 2 karmasik sayi toplanmaktadir
yaz(c3);
_getch();
return 0;
}

20 Şubat 2018 Salı

C++ Virtual nedir?Ne işe yarar?

Sanal Fonksiyona neden ihtiyaç duyulur ?

Sanal fonksiyonları çok biçimli programlama tekniği (polymorphism) ile kullanılır. Bir sınıfın fonksiyonunun miras alan diğer sınıflar tarafından kullanılmasını sağlamak için virtual anahtar kelimesiyle tanımlarız. Bunun nedenini bir örnek ile açıklayayım. Diyelim ki bir kare sınıfımız var. Bu sınıf için alan hesaplayabiliriz, çizim yaptırabiliriz , çevre hesaplayabiliriz. Diğer bir sınıf olan üçgen ise kare’den miras alsın. Üçgen içinde aynı fonksiyonları kullanabiliriz değil mi ? Bunu yapabilmemiz için kare sınıfımızdaki fonksiyonlarımızı virtual anahtar kelimesiyle deklare etmemiz gerekir yani prototiplerini virtual ön eki ile yazarız. Lafı çok uzatmadan örnek kodumuz ile olayı biraz somutlaştırayım.
class dortgen
{
    public:
    virtual int alan(int taban, int yukseklik){
       return taban*yukseklik;
    }
    int cevre(int taban, int yukseklik){
       return 2*(taban+yukseklik);
    }
};
class ucgen : public dortgen
{
    public:
    int alan(int taban, int yukseklik){
       return (taban*yukseklik)/2;
    }
};
Yukarıdaki kodu ile anlatıldığı gibi dortgen sınıfımızın virtual fonksiyonu olan alan ucgen sınıfımızda da aynı isim ile farklı işlevi gerçekleştirecek şekilde tanımlanabilir.
Aşağıdaki örnek kodumuzu inceleyelim.
int main()
{
    dortgen *ptr; // ptr temel sınıfa ait bir pointer
    ucgen nesne1;   //nesne1'de türemiş sınıfa ait bir nesne
ptr = &nesne1; // Temel sınıfa ait bir pointera türemiş sınıfın adresini atayabiliriz
    ptr->alan();   // Ekranda hangi şeklin alanı hesaplandı ?
return 0;
}
Yukarıdaki kodu uygun şekilde ekleyip çalıştırdığımızda sınıflarımızdan hangisi için alan hesaplaması yaptı ? Program içinde temel sınıfımız olan dortgen'den oluşturduğumuz bir pointer tipli değişkene türetilmiş sınıfımızın adresini verdik. Sonra bu değişken ile alan() fonksiyonumuza ulaştık. Pointerımız programın o kısmında ucgeni gösterdiği için ucgen alanı hesaplanacaktır. Bu örnek genişleterek farklı kullanım alanları oluşturulabilir.
Şimdilik bu konuda söylenecekler bu kadar bir sonraki başlığımız olan Saf Sanal Fonksiyonlara değinerek yazımı tamamlıyorum.
Saf sanal fonksiyonlar kullanım olarak aynı şekildedir. Fakat temel sınıfımız içerisinde sadece virtual fonksiyonlarımız vardır. Bu sınıfa soyut sınıf denir.Soyut sınıfımızdan bir nesne türetmemiz mümkün değildir. Aynı zamanda soyut sınıftan miras alan tüm sınıflar virtual tanımlanmış olan fonksiyonlara sahip olmalıdır. Bu söylediklerim birer kuraldır ve eksikliğinde derleyici koşma hatasına sebep olurlar.

15 Şubat 2018 Perşembe

Class defination(sınıfın tanımları) nedir?

Class Defination

Sınıf kavramını birden fazla şekilde açıklayarak iyice sindirilmesini sağlamaya çalışacağım.ilk olarak sınıfı bir paket olarak düşünmenizi istiyorum ve bu paket içinde hem verileri hem de fonksiyonları barındırıyor. Bu paket öyle bir paket ki nasıl çalıştığı hakkında bir fikriniz yok ancak sizin söylediklerinizi fonksiyonları varsa bu var olan fonksiyonlarla veriler üzerinde oynama yapabiliyor. Yani siz tutup direk veriyle oynayamıyorsunuz ancak fonksiyona (varsa) söylüyorsunuz oda veriye müdahale edebiliyor.

İkinci olarak sınıf deyince aklınıza bir araba gelsin ve siz de iyi bir şoförsünüz! Siz çok güzel araba kullanabiliyorsunuz değil mi? ama nasıl kullanıyorsunuz size verilmiş olan gaz fren ve debriyaj pedallarıyla (fonksiyonlar) peki siz motor nasıl işliyor araç nasıl gidiyor bir fikriniz var mı hayır yok ! işte class böyle bir şey siz verilen fonksiyonlarla classın verilerine gayet güzel ulaşırsınız ancak yetkileriniz sınırlıdır ve fonksiyonların nasıl işlediğini bilmeniz gerekmez..

Son olarak class diyince aklınıza birde bir kroki ve işçi gelsin. İşçiye verin krokiyi defalarca kullanıp size birçok ev yapsın. Peki sorun bakalım işçiye nasıl oluyor bu çizimler nasıl yapılıyor bir fikrin var mı diye? Hayır yok iç dizaynını bilmesi gerekmez işçinin burada önemli olan defalarca aynı krokinin yada taslağın kullanılabilme özelliğidir tıpkı class'lar gibi.

Şimdi benzetmelerden sonra artık bir fikriniz vardır class hakkında en azından bir class defalarca kullanılabilir , sonra bir classta hem fonksiyonlar hem de veriler aynı anda birbiriyle sıkı bir şekilde bağlı olarak bulunurlar hatta fonksiyonlar verilere emir gönderir yoksa verilere ulaşılamaz ve kontrol edilemez. Bir class veriler ve fonksiyonların beraber bulunduğu bir tanım kümesidir. Daha önceki fonksiyonel dillerde (C gibi) sadece fonksiyon bizim için çok önemliydi veri fonksiyonun kontrol edeceği bir değişkendi sadece.
Tüm bunlara rağmen class halen benim için belirsiz diyorsanız Size işin gerçek profesyonel kısmını anlatıyım belkide işi oradan çözersiniz.. Bir OOP dillerinde tutup bir class belirleyeceğiz sonrada bunu main() fonksiyonunun içinde kullanabilmek için bir nesne(Object) yaratacağız. Bu objenin hem fonksiyon hem de verisi olmuş olacak class sayesinde ve biz bu objeyi kullanarak birçok verisel işlemi fonksiyonları sayesinde yapabileceğiz. Normalde değişkenler kısmında int emre diye bir değişken tanımladınız diyelim. Aslında int sizin classınız ve emre de objeniz oluyor bunu böyle düşünün. O zaman yazar diye bir class oluşturdunuz bunun objeside çamalan olsun. İşte bir değişken ile class aslında birbirine benziyor int emre ile yazar Çamalan aynı tanımlamayla işlem görüyor..

Şimdi artık örneklerle durumu izah etmeye çalışacağım..




#include <iostream>


#include <string>


#include <stdio.h>


using namespace std;


class yazar


{


private:


int emre;





public:


int camalan( int a)


{  emre = emre +a;}


print()


{cout<<emre;}


};





int main()


{


yazar nesne;


int sayi;


cout<<"bir sayi giriniz"<<endl;


cin>>sayi;


nesne.camalan(sayi);


nesne.print();





getchar();getchar();


return 0;


}





bu kodda her şey dahada netleşecektir umarım:





Açıklamaya başlıyorum şimdi.





#include <iostream>


#include <string>


#include <stdio.h>


using namespace std;



Bu kısmı özellikle sadece başlangıç kütüphaneleri söyleyip geçiyorum çünkü konumuz classlar .



class yazar


{


private:


int emre;





public:


int camalan( int a)


{  emre = emre +a;}


print()


{cout<<emre;}


};



Burada class yazar ile başlayan classımız bize yazar diye bir sınıf belirlediğimizi anlatıyor. Classın bitişindeki Noktalı virgülü halen fark etmediyseniz lütfen fark edin  sürekli hata alırsınız.



Private :


Public:



Bunlar bizim bölümlerimiz private kısmına sadece fonksiyonlar ulaşabilir ki hangi fonksiyonlar?? Tabikide sadece classın içindeki yani publicteki fonksiyonlar. Peki biz dışardan nereye ulaşabiliyoruz?? Biz sadece public kısmına main() fonksiyonundan ulaşabiliyoruz onlarda private kısmına ulaşıyor..

Main kısmındaki çok önemli noktamız ise:



yazar nesne;


nesne.camalan(sayi);


nesne.print();

PUBLİC, PRİVATE, PROTECTED NEDİR?

Public

Public kullanılan en yaygın tanımdır. Bir metod veya değişken public olarak tanımladığında o üyeye ilgili sınıfın her yerden erişebilirsiniz. Aynı zamanda sınıftan türeyen bir sınıf içerisinden de erişebilir.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class programci
{
    public $isim = 'Onur';
 
    public function ismiOku()
    {
        echo $this->isim;
    }
}
 
$programci = new programci;
echo $programci->isim; //değişkene de erişebiliyoruz
echo '<br>';
$programci->ismiOku(); //metoda da erişebiliyoruz
?>

Private

Private üyelere o sınıf dışından herhangi bir şekilde erişilemez ve bu üyeler kalıtım yoluyla aktarılmaz.. Private olarak tanımlanan değişken ve fonksiyonlar sadece o sınıfın kendi metotları tarafından kullanılabilir. Yani işin özü o metod veya değişken sadece o sınıfa özel olur.
Bir değişkeni private olarak tanımladığınızda ve bu değişkenin başka bir sınıf tarafından kullanılması gerektiğinde bu değişkeni döndüren bir public fonksiyon yazarak işlemi gerçekleştirebilirsiniz.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class programci
{
    private $isim = 'Onur'; //Bu değişkene direk $programci->isim diyerek ulaşamazsınız
 
    public function ismiOku() //$isim değişkenine erişmek için kullanılacağımız metod
    {
        echo $this->isim;
    }
}
 
$programci = new programci;
$programci->ismiOku();
?>
Not: Private üyenin tanımlandığı sınıfa extend eden diğer alt sınıflar da private üyeye erişemez.
Protected
Protected aslında private e benzer. Protected özelliği atanan bir değişken veya metot, sadece sınıf içerisinden veya türetilen bir sınıf içerisinden erişilebilir.. Yani bir sınıf extend ettiği sınıfın protected üyelerine erişebilir ama private üyelerine erişemez.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
class programci
{
    protected $isim = 'onur'; //private deki gibi direk erişilemez ancak türetilen sınıfta kullanılabilir.
 
    /*
    $isim değişkenine erişmek için kullanacağımız metod.
    $programci->isim şeklinde erişmek istersek "Cannot access protected property.." şeklinde hata verir.
    */
    public function ismiOku()
    {
        echo $this->isim;   
    }
}
 
$programci = new programci;
$programci->ismiOku();
 
class senior extends programci
{
    //$isim değişkenini tanımlamadı ama türettiğimiz sınıftan çekti. Private olsa o da gelmezdi..
    public function ismiOku()
    {
        echo $this->isim;
    }
}
 
$programci2 = new senior;
$programci2->ismiOku();
?>

C++ Operatorlerin Aşırı Yüklenmesi

C++ Operatorlerin Aşırı Yüklenmesi (Operator Overloading) C++’ da +,-,*,!,++ gibi operatörler fonksiyonlar yazılarak bu operatörlere...